使用Java爬虫爬取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
爬取目标页面
1、使用Maven构建一个普通Java工程
加入依赖:
<!--用来解析Html页面的第三方Jar-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!--用来模拟Http客户端的第三方Jar-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1</version>
</dependency>
2、第一个类,开始爬取入口类
package com.yomihu.spider;
import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* mini-spider 单页面爬取启动类
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class SinglePageSpiderStarter {
/**
* 开始页面的URL(一个微信公众号的页面)
*/
private static final String START_URL = "https://mp.weixin.qq.com/s/zzkEWbcb81pbsr-PJvVzQA";
/**
* 目标图片存放目录
*/
private static final String IMG_SAVE_PATH = "E:/jj";
public static void main(String[] args) throws Exception {
//使用Jsoup将目标Url的Html页面获取为Document变量
Document rootdocument = Jsoup.connect(START_URL).get();
List<String> urlList = new ArrayList<String>();
//将页面中的目标Url解析为列表
ParseHtml.singlePageParseImg(rootdocument, urlList);
//初始化HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//控制图片名称的变量
int i = 0;
for (String url : urlList) {
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent();
//保存图片
File file = new File(IMG_SAVE_PATH);
if (!file.exists()) {
//不存在就创建该目录
file.mkdirs();
}
String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
//保存图片
FileOutputStream fos = new FileOutputStream(imgName);
i++;
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
fos.write(data, 0, len);
}
//释放资源
response.close();
}
httpClient.close();
}
}
3、第二个类,解析Html页面
package com.yomihu.parse;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.List;
/**
* mini-spider Html页面结构解析
*
* @Author 孙龙
* @Date 2018/1/28
*/
public class ParseHtml {
/**
* 微信单页面结构解析,这里我们只要将页面中的图片对应的URL取出
* (方法中的解析逻辑是根据分析页面结构和各元素的特征来解析的)
*
* @param document
* @param urls
*/
public static void singlePageParseImg(Document document, List<String> urls) {
Elements divElements = document.select("[class=rich_media_content]");
Elements pElements = divElements.select("p");
Elements imgElements = pElements.select("img");
for (Element imgElement : imgElements) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
}
Elements spanElements = pElements.select("span");
Elements imgElemnets = spanElements.select("img");
for (Element imgElement : imgElemnets) {
urls.add(imgElement.attr("data-src"));
//打印目标数据,查看是否正确
System.out.println(imgElement.attr("data-src"));
}
}
}
4、启动第一个类中的main函数
查看我们爬取的目标图片是否已经存在目录中。
总结
其实爬虫并不难写,首先要先知道爬虫是什么东西。爬虫就是使用程序模拟一个浏览器对页面上的数据进行不断的连接获取解析并保存;这里我只是使用Apache开源的成熟框架进行开发,实现了一个简单的单页面抓取,同样的多页面循环抓取就需要在程序中做不断的迭代,并不断的更新爬取目标;即在使用程序解析页面的时候将下一个目标页的Url保存在待爬取的列表中。
爬虫并不难实现,难的是对目标页面分析,找到页面中个元素之间的规律,对页面进行规律性解析,并获取到我们想要的数据;当然更难的是有些大网站服务器上的反爬虫机制。
接下来我会实现一个多页面循环抓取的Demo
示例代码