介绍
本篇博客将继续上一篇博客:Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗 的内容,将用Java来实现这个爬虫,下载全世界国家的国旗图片。项目不再过多介绍,具体可以参考上一篇博客。
我们将全世界国家的名称放在一个txt文件中,每一行一个国家名字,该文件位于E盘flag目录下,名称为countries.txt, 部分内容如下:
爬虫程序
我们这个爬虫的思路还是和上一篇博客的思路一样:先是读取countries.txt中的国家名称,以国家名称为参数,读取该国家搜索后的所在网页,再找到该搜索网页中的国家的国旗图片,并实现下载。这个搜索的过程,我们可以用Java的URL包中的POST方法来实现,关于POST方法的请求头和请求体,可以用Fiddler工具进行抓包分析。
该Java项目的具体结构如下:

其中用到的第三方API为commons-io和Jsoup,主函数为Country_Flag_Download.java,其java代码完整如下:
package wikiScrape;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.apache.commons.io.FileUtils;
public class Country_Flag_Download {
public static void main(String[] args){
String fileName ="E://flag/countries.txt";
ArrayList<String> countries = readFileByLines(fileName);
for(String country: countries) {
String page = doPost(country);
if (page.indexOf("html") >= 0) {
getContent(page);
}
}
System.out.println("国旗下载完毕!");
}
public static String doPost(String country){
String url = "http://country.911cha.com/";
try {
URL obj = new URL(url);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setUseCaches(false);
conn.setRequestMethod("POST");
String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36";
conn.setRequestProperty("User-Agent", USER_AGENT);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
String postParams = String.format("q=%s", country);
conn.setDoOutput(true);
OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
os.write(postParams);
os.flush();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
Document doc = Jsoup.parse(conn.getInputStream(), "utf-8", url);
String page = doc.select("div.mcon").get(1)
.selectFirst("ul")
.selectFirst("li")
.selectFirst("a")
.attr("href");
return page;
}
else {
return "Get page failed.!";
}
}
catch(Exception e){
return "Get page failed.";
}
}
public static void getContent(String page){
String base_url = "http://country.911cha.com/";
String url = base_url+page;
try{
URL urlObj = new URL(url);
URLConnection urlCon = urlObj.openConnection();
Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url);
Element image = doc.selectFirst("img");
String flag_name = image.attr("alt").replace("国旗", "");
String flag_url = image.attr("src");
URL httpurl = new URL(base_url+'/'+flag_url);
FileUtils.copyURLToFile(httpurl, new File("E://flag/"+flag_name+".gif"));
System.out.println(String.format("%s国旗下载成功~", flag_name));
}
catch(Exception e){
e.printStackTrace();
System.out.println("下载失败!");
}
}
public static ArrayList<String> readFileByLines(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
ArrayList<String> countries = new ArrayList<String>();
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null)
countries.add(tempString);
reader.close();
return countries;
}
catch (IOException e) {
return countries;
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
运行结果
点击运行该Java程序,可以发现在E盘的flag目录下已经下载了全世界国家的国旗图片,查看如下:
Bingo, 我们的Java爬虫程序运行成功!本次爬虫的主要目标是为了在Java中实现类似于Python中的requests模块的POST方法~
注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~