Java爬虫之下载全世界国家的国旗图片
介绍
本篇博客将继续上一篇博客: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";
// 读取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目录下已经下载了全世界国家的国旗图片,查看如下:
Bingo, 我们的Java爬虫程序运行成功!本次爬虫的主要目标是为了在Java中实现类似于Python中的requests模块的POST方法~
注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
Java爬虫之下载全世界国家的国旗图片的更多相关文章
- java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址
1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...
- webmagic的设计机制及原理-如何开发一个Java爬虫
之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...
- 爬虫6:多页面增量Java爬虫-sina主页
之前写过很多单页面python爬虫,感觉python还是很好用的,这里用java总结一个多页面的爬虫,迭代爬取种子页面的所有链接的页面,全部保存在tmp路径下. 1 序言 实现这个爬虫需要两个数据结构 ...
- 推荐几个优秀的java爬虫项目
java爬虫项目 大型的: Nutch apache/nutch · GitHub 适合做搜索引擎,分布式爬虫是其中一个功能. Heritrix internetarchive/heritrix3 ...
- JAVA爬虫 WebCollector
JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- MinerUtil.java 爬虫工具类
MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...
- java爬虫系列第一讲-爬虫入门
1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...
- java爬虫系列目录
1. java爬虫系列第一讲-爬虫入门(爬取动作片列表) 2. java爬虫系列第二讲-爬取最新动作电影<海王>迅雷下载地址 3. java爬虫系列第三讲-获取页面中绝对路径的各种方法 4 ...
随机推荐
- Normalize.css & Reset
Normalize.css: try to keep the style consistent in every browser. Reset: clear style in every browse ...
- Anfora 自动装载类
1.目录结构 + Anfora | + Autoload | - ClassLoader.php | - Autoload.php - autoload.php 2.注册类加载器 src/Anfora ...
- 【python-appium】模拟手机按键搜索异常
执行代码的过程中运行self.driver.press_keycode(84)设备没反映,则需要关闭#desired_caps["unicodeKeyboard"] = " ...
- CentOS7安装OpenLDAP+MySQL+PHPLDAPadmin
安装环境:CentOS 7 1.安装和设置数据库 在CentOS7下,默认安装的数据库为MariaDB,属于MySQL数据库的一个分支,所以我还是使用了MariaDB.安装命令为: [root@loc ...
- JavaScript自定义鼠标右键菜单
下面为JavaScript代码 window.onload = function () { //好友列表 var f = 0; //判断指定id的元素在页面中是否存在 if (document.get ...
- 代码雨 html实现
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- [转]Comparing sFlow and NetFlow in a vSwitch
As virtualization shifts the network edge from top of rack switches to software virtual switches run ...
- Function Composition vs Object Composition
In functional programming, we create large functions by composing small functions; in object-oriente ...
- 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅
本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言 Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...
- Java 使用 int 数据计算百分比
int diliverNum=3;//举例子的变量 int queryMailNum=9;//举例子的变量 // 创建一个数值格式化对象 NumberFormat numberFormat = Num ...