Webmagic
开源Java垂直爬虫框架
最早接触爬虫源于兴趣,当时Python很火,带着他火起来的正是爬虫。
对这些有趣的东西毫无抵抗力,只是当时没想到,后来我找到了爬虫相关的工作。
为什么用java写爬虫,用Python做后端,没有那么多为什么,需要就去学习好了。
Webmagic是个不错的轮子,可以非常方便地开启多线程,但也有一些遗留的bug至今没完全修复,例如抓部分HTTPS时会抛出SSLException。作者给出了个解决方案。
Webmagic的官方教程很易上手,主要有四大组件。
Downloader
负责从互联网下载页面Page,交给Pageprocessor进行后续处理。webmagic默认使用Apache HttpClient作为下载工具。
PageProcessor
负责解析页面,并根据自己的需求抽取有用信息(包括新的链接)。
Scheduler
负责管理待抓取的URL,除此URL的去重也由Schedule负责完成。
Pipeline
负责了抽取结果的处理。比如你想把爬取的数据保存至数据库就可以通过Pipeline实现(需要自己写对应的Pipeline),webmagic默认提供了输出至控制台和保存到文件两种方案。
这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。当然,根据需求或者代码习惯,不使用pipeline也可以实现持久化,反正代码自己写,认为合理即可。
maven依赖
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.4</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.4</version>
</dependency>
官方的教程非常详细,这里主要放一些他没有的代码
post的表单模式
request.setRequestBody(HttpRequestBody.form(params, “UTF-8”));
public static Request getNextPageRequest(int pageNo,String url) {
Request request = new Request(url);
request.setMethod(HttpConstant.Method.POST);
request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
Map<String, Object> params = new HashMap<String, Object>();
params.put("pageNumber", pageNo);
try {
request.setRequestBody(HttpRequestBody.form(params, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return request;
}
post的json模式
request.setRequestBody(HttpRequestBody.json(json, “UTF-8”));
//发送json格式的post请求
public static Request getNextPageRequest(int pageNo,String url) {
Request request = new Request(url);
request.setMethod(HttpConstant.Method.POST);
request.addHeader("Content-Type", "application/json");
try {
String json = "{\"page\":{\"pageSize\":10,\"currentPage\":" + pageNo + "},\"modelObj\":{},\"queryCondition\":{},\"orderByStr\":\" update_time desc\"}";
request.setRequestBody(HttpRequestBody.json(json, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return request;
}
post的xml模式
request.setRequestBody(HttpRequestBody.xml(String.valueOf(id), “UTF-8”));
//发送xml格式的post请求
public static Request getContentRequest(int id, String url) {
Request request = new Request(url);
request.setMethod(HttpConstant.Method.POST);
try {
request.setRequestBody(HttpRequestBody.xml(String.valueOf(id), "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return request;
}
留言