介绍

  本篇博客将继续上一篇博客: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爬虫之下载全世界国家的国旗图片的更多相关文章

  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. 我的C#跨平台之旅(六):发布应用

    由于此架构从一开始就将.NET Framework 的依赖降低到最低,且不依赖IIS,在ORM层面,完全实现代码优先,即真正做到数据库无关: Windows服务器部署: 在Windows应用服务器上安 ...

  2. day20_雷神_django第三天

    django第三天 动态路由,实现统一删除功能 urls url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'), t ...

  3. Python 基础API

    针对python的os库一些API记录,觉得python的命名并不好,很多API看名字,并不知道具体功能是什么 1. os.path.basename() 得到文件名称,不包括路径,例子:/var/t ...

  4. [编译] 2、minGW gcc在windows搭建编译win32程序环境

    1.普通下载一个MinGW程序.安装之后可以直接将MinGW目录拷贝到总工程的tool里面: demo_mesh_common tree -L 2 . ├── app ├── bin ├── buil ...

  5. 【高速接口-RapidIO】3、RapidIO串行物理层的包传输过程

    一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议包括读事务(NREAD),写事务(NWRITE),流写事务(SWRITE),有响应的写事务(NWRITE_R ...

  6. Kali学习笔记21:缓冲区溢出实验(漏洞发现)

    上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...

  7. psnr的定义和python实现

    psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限性,一般是用于最大值信号和背景噪音之间的一个工程项目. peak的中文意思是 ...

  8. Emmet/Zen Coding 快速入门说明

    快速参考 以下是支持的特性: ele creates an HTML element tag 展开一个HTML元素标签 # creates an id attribute 作用于元素标签,展开一个id ...

  9. ALL_DB_LINKS

    类型:View Owner:SYS 内容:记录了当前用户下可访问的所有的DB links 字段: OWNER : DB Link的owner DB_LINK : DB Link名称 USERNAME ...

  10. Intellij IDEA神器居然还有这些小技巧

    概述 Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intel ...