Java爬虫之下载全世界国家的国旗图片

发布时间:2019-11-21 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java爬虫之下载全世界国家的国旗图片脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

介绍

  本篇博客将继续上一篇博客:Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗 的内容,将用Java来实现这个爬虫,下载全世界国家的国旗图片。项目不再过多介绍,具体可以参考上一篇博客。
  我们将全世界国家的名称放在一个txt文件中,每一行一个国家名字,该文件位于E盘flag目录下,名称为countries.txt, 部分内容如下:

Java爬虫之下载全世界国家的国旗图片

爬虫程序

  我们这个爬虫的思路还是和上一篇博客的思路一样:先是读取countries.txt中的国家名称,以国家名称为参数,读取该国家搜索后的所在网页,再找到该搜索网页中的国家的国旗图片,并实现下载。这个搜索的过程,我们可以用Java的URL包中的POST方法来实现,关于POST方法的请求头和请求体,可以用Fiddler工具进行抓包分析。
  该Java项目的具体结构如下:

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";         // 读取countries.txt文件中的国家名,储存在ArrayList中         ArrayList<String> countries = readFileByLines(fileName);                  for(String country: countries) {             String page = doPost(country); // 获取国家所在的网页             if (page.indexOf("html") >= 0) { // 获取成功                 getContent(page);            // 下载该国国家的国旗             }         }                  System.out.println("国旗下载完毕!");              }      /* 发送HTTP的POST请求,获取指定国家的网页地址      * 传入参数:country(国家): String类型      */     public static String doPost(String country){          String url = "http://country.911cha.com/";          try {             // 设置网址,打开连接             URL obj = new URL(url);             HttpURLConnection conn = (HttpURLConnection) obj.openConnection();                          // 设置POST请求头和请求体,请求体的参数为国家(country)             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);              // 传入POST请求体的参数             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) { //如果响应状态码为200                  // 将HTML内容解析成UTF-8格式                 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 { // 如果响应状态码不是200, 则返回"Get page failed!"                 return "Get page failed.!";             }         }         catch(Exception e){             return "Get page failed.";         }     }          // getContent()函数主要实现下载指定国家的国旗     public static void getContent(String page){                  String base_url = "http://country.911cha.com/";         String url = base_url+page;                  try{             // 利用URL解析网址             URL urlObj =  new URL(url);             // URL连接             URLConnection urlCon = urlObj.openConnection(); // 打开URL连接             // 将HTML内容解析成UTF-8格式             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()实现图片下载             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("下载失败!");                      }      }          // 以行读取文件,返回ArrayList, 里面的元素为每个国家的名称     public static ArrayList<String> readFileByLines(String fileName) {            File file = new File(fileName);           BufferedReader reader = null;  // 设置reader为null         ArrayList<String> countries = new ArrayList<String>();          try {                reader = new BufferedReader(new FileReader(file));               String tempString = null;                            // 一次读入一行,直到读入null为文件结束               while ((tempString = reader.readLine()) != null)                 countries.add(tempString); // 在列表中添加国家名称                           reader.close(); // 关闭reader                          return countries;         }          catch (IOException e) {               return countries;           }          finally {               if (reader != null) {                   try {                       reader.close();                   }                 catch (IOException e1) {                       e1.printStackTrace();                 }                }            }        }        } 

运行结果

  点击运行该Java程序,可以发现在E盘的flag目录下已经下载了全世界国家的国旗图片,查看如下:

Java爬虫之下载全世界国家的国旗图片

  Bingo, 我们的Java爬虫程序运行成功!本次爬虫的主要目标是为了在Java中实现类似于Python中的requests模块的POST方法~

注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

脚本宝典总结

以上是脚本宝典为你收集整理的Java爬虫之下载全世界国家的国旗图片全部内容,希望文章能够帮你解决Java爬虫之下载全世界国家的国旗图片所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。