博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java爬虫之下载全世界国家的国旗图片
阅读量:6965 次
发布时间:2019-06-27

本文共 5440 字,大约阅读时间需要 18 分钟。

介绍

  本篇博客将继续 的内容,将用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"; // 读取countries.txt文件中的国家名,储存在ArrayList中 ArrayList
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
readFileByLines(String fileName) { File file = new File(fileName); BufferedReader reader = null; // 设置reader为null ArrayList
countries = new ArrayList
(); 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目录下已经下载了全世界国家的国旗图片,查看如下:

国旗图片

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

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

你可能感兴趣的文章
云计算下的ERP发展之路
查看>>
jquert confirm each
查看>>
指定Tomcat使用的jdk版本而不依赖环境变量
查看>>
华为网络设备上常用的安全技术
查看>>
本人对Servlet的两点不同方向的认识
查看>>
关于JAVA中内存溢出的解决办法(转)
查看>>
Vim常用命令
查看>>
Ubuntu 16.04下java安装
查看>>
深入剖析异步高性能通讯架构原型NIO原理
查看>>
在Linux环境下使用OpenSSL对消息和文件进行加密
查看>>
PHP服务缓存加速优化
查看>>
我的友情链接
查看>>
XSD文件读取
查看>>
mariadb安装
查看>>
JSON TO NSDictionary Mac & iOS
查看>>
成长计划
查看>>
opencv工具类小集
查看>>
foobox 4.2(foobar2000 CUI配置)
查看>>
django日志写入文件
查看>>
hana system replication
查看>>