介绍

  本篇博客将继续上一篇博客: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代码完整如下:

  1. package wikiScrape;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.OutputStreamWriter;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;
  9. import java.net.URLConnection;
  10. import java.util.ArrayList;
  11. import org.jsoup.Jsoup;
  12. import org.jsoup.nodes.Document;
  13. import org.jsoup.nodes.Element;
  14. import org.apache.commons.io.FileUtils;
  15. public class Country_Flag_Download {
  16. public static void main(String[] args){
  17. String fileName ="E://flag/countries.txt";
  18. // 读取countries.txt文件中的国家名,储存在ArrayList中
  19. ArrayList<String> countries = readFileByLines(fileName);
  20. for(String country: countries) {
  21. String page = doPost(country); // 获取国家所在的网页
  22. if (page.indexOf("html") >= 0) { // 获取成功
  23. getContent(page); // 下载该国国家的国旗
  24. }
  25. }
  26. System.out.println("国旗下载完毕!");
  27. }
  28. /* 发送HTTP的POST请求,获取指定国家的网页地址
  29. * 传入参数:country(国家): String类型
  30. */
  31. public static String doPost(String country){
  32. String url = "http://country.911cha.com/";
  33. try {
  34. // 设置网址,打开连接
  35. URL obj = new URL(url);
  36. HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
  37. // 设置POST请求头和请求体,请求体的参数为国家(country)
  38. conn.setUseCaches(false);
  39. conn.setRequestMethod("POST");
  40. 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";
  41. conn.setRequestProperty("User-Agent", USER_AGENT);
  42. conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  43. String postParams = String.format("q=%s", country);
  44. // 传入POST请求体的参数
  45. conn.setDoOutput(true);
  46. OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
  47. os.write(postParams);
  48. os.flush();
  49. os.close();
  50. // 获取响应结果状态码
  51. int responseCode = conn.getResponseCode();
  52. if (responseCode == HttpURLConnection.HTTP_OK) { //如果响应状态码为200
  53. // 将HTML内容解析成UTF-8格式
  54. Document doc = Jsoup.parse(conn.getInputStream(), "utf-8", url);
  55. // 刷选需要的网页内容
  56. String page = doc.select("div.mcon").get(1)
  57. .selectFirst("ul")
  58. .selectFirst("li")
  59. .selectFirst("a")
  60. .attr("href");
  61. return page;
  62. }
  63. else { // 如果响应状态码不是200, 则返回"Get page failed!"
  64. return "Get page failed.!";
  65. }
  66. }
  67. catch(Exception e){
  68. return "Get page failed.";
  69. }
  70. }
  71. // getContent()函数主要实现下载指定国家的国旗
  72. public static void getContent(String page){
  73. String base_url = "http://country.911cha.com/";
  74. String url = base_url+page;
  75. try{
  76. // 利用URL解析网址
  77. URL urlObj = new URL(url);
  78. // URL连接
  79. URLConnection urlCon = urlObj.openConnection(); // 打开URL连接
  80. // 将HTML内容解析成UTF-8格式
  81. Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url);
  82. // 刷选需要的网页内容
  83. Element image = doc.selectFirst("img");
  84. String flag_name = image.attr("alt").replace("国旗", "");
  85. String flag_url = image.attr("src");
  86. URL httpurl = new URL(base_url+'/'+flag_url);
  87. // 利用FileUtils.copyURLToFile()实现图片下载
  88. FileUtils.copyURLToFile(httpurl, new File("E://flag/"+flag_name+".gif"));
  89. System.out.println(String.format("%s国旗下载成功~", flag_name));
  90. }
  91. catch(Exception e){
  92. e.printStackTrace();
  93. System.out.println("下载失败!");
  94. }
  95. }
  96. // 以行读取文件,返回ArrayList, 里面的元素为每个国家的名称
  97. public static ArrayList<String> readFileByLines(String fileName) {
  98. File file = new File(fileName);
  99. BufferedReader reader = null; // 设置reader为null
  100. ArrayList<String> countries = new ArrayList<String>();
  101. try {
  102. reader = new BufferedReader(new FileReader(file));
  103. String tempString = null;
  104. // 一次读入一行,直到读入null为文件结束
  105. while ((tempString = reader.readLine()) != null)
  106. countries.add(tempString); // 在列表中添加国家名称
  107. reader.close(); // 关闭reader
  108. return countries;
  109. }
  110. catch (IOException e) {
  111. return countries;
  112. }
  113. finally {
  114. if (reader != null) {
  115. try {
  116. reader.close();
  117. }
  118. catch (IOException e1) {
  119. e1.printStackTrace();
  120. }
  121. }
  122. }
  123. }
  124. }

运行结果

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

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

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

Java爬虫之下载全世界国家的国旗图片的更多相关文章

  1. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  2. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  3. 爬虫6:多页面增量Java爬虫-sina主页

    之前写过很多单页面python爬虫,感觉python还是很好用的,这里用java总结一个多页面的爬虫,迭代爬取种子页面的所有链接的页面,全部保存在tmp路径下. 1 序言 实现这个爬虫需要两个数据结构 ...

  4. 推荐几个优秀的java爬虫项目

    java爬虫项目   大型的: Nutch apache/nutch · GitHub 适合做搜索引擎,分布式爬虫是其中一个功能. Heritrix internetarchive/heritrix3 ...

  5. JAVA爬虫 WebCollector

    JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...

  6. 爬虫入门 手写一个Java爬虫

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  7. MinerUtil.java 爬虫工具类

    MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...

  8. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  9. java爬虫系列目录

    1. java爬虫系列第一讲-爬虫入门(爬取动作片列表) 2. java爬虫系列第二讲-爬取最新动作电影<海王>迅雷下载地址 3. java爬虫系列第三讲-获取页面中绝对路径的各种方法 4 ...

随机推荐

  1. CentOS 7 用firewall-cmd来开放端口

    2.CentOS 7 用firewall-cmd来开放端口 如: firewall-cmd --permanent --add-port=3306/tcp 重新加载 firewall-cmd --re ...

  2. WSGI协议以及对服务器的影响

    下面的内容纯属个人学习心得,如果对于我的观点有疑问,敬请留言,我将虚心向大牛学习. WSGI的全称是WEB SERVICE GATEWAY INTERFACE.WSGI 不是服务器,不是API,也不是 ...

  3. why microsoft named their cloud service Azure?

    best guess I can personally make is that because Azure literally means “bright blue color of the clo ...

  4. C/C++ 多线程机制

    一.C/C++多线程操作说明 C/C++多线程基本操作如下: 1. 线程的建立结束 2. 线程的互斥和同步 3. 使用信号量控制线程 4. 线程的基本属性配置 在C/C++代码编写时,使用多线程机制, ...

  5. django项目微博第三方登录

    此处咱们用到的是 social_django,所以要把此应用注册到配置文件中, INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.a ...

  6. PHP判断访问系统的用户设备类型

    当今的电子设备越来越多,我们在开发过程中往往也需要分析用户使用的电子设备类型.下面是采用PHP代码来获取用户使用的哪些类型的电子设备来访问自己的平台. /** * 用户设备类型 * @return s ...

  7. 浅谈static关键字的四种用法

    1.修饰成员变量 在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三.李四,这两个对象的name是 ...

  8. 移动端Web开发,ios下 input为圆角

    在处理input的问题时,一般不想要input的原来的样式,一般就直接处理 border: none; outline: none; background: transparent; 这样之后,一般就 ...

  9. 【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle

    原文链接:http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/ 有没有被标题中的5个“R”吓到?今天,我们来讨论一下浏览器的渲 ...

  10. Centos7单机部署ELK+x-pack

    ELK分布式框架作为现在大数据时代分析日志的常为大家使用.现在我们就记录下单机Centos7部署ELK的过程和遇到的问题. 系统要求:Centos7(内核3.5及以上,2核4G) elk版本:6.2. ...