java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
优采云 发布时间: 2021-10-04 06:22java爬虫抓取网页数据(使用Java爬虫爬取公众号页面图片使用和HttpClient实现)
使用Java爬虫抓取人民日报公众号页面图片
使用Java框架Jsoup和HttpClient实现,先看代码
抓取目标页面
1、使用Maven构建一个普通的Java项目
添加依赖:
org.jsoup
jsoup
1.11.2
org.apache.httpcomponents
httpclient
4.3.1
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 urlList = new ArrayList();
//将页面中的目标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 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成熟的开源框架进行开发,实现了简单的单页爬取,同样多页循环爬取Fetching需要在程序中不断迭代,不断更新爬取目标;即程序在解析页面时,将下一个目标页面的Url保存在待爬取的列表中。
爬虫不难实现。难的是分析目标页面,找到页面元素之间的规律,定期分析页面,得到我们想要的数据;当然,更难的是服务器上的一些大网站反爬虫机制。
下面我来实现一个多页面循环爬取的demo
示例代码