Webmagic 深度加载
前言:网上参考了大量的 webmagic 深度的例子都不太好用,所以自己整理了一下,直接切
入主题吧。(思路+主要代码)
1. main()里通过 request 的 extras 属性加初始深度如下:
Request request = new Request();
Map extras = new HashMap();
extras.put("_level", 0);
request.setExtras(extras);
request.setUrl(“www.baidu.com”);
2.webmagic 逻辑类 process()里 url 加入队列之前判断当前深
度
//取符合标签的所有URL
List all = page.getHtml().links().all();
for (String s : all) {
// 添加爬取深度
Request request = new Request();
Map extras = new HashMap();
extras.put("_level", (Integer) page.getRequest().getExtra("_level")
+ 1);
request.setExtras(extras);
request.setUrl(s);
System.out.println(request.getExtra("_level"));
page.addTargetRequest(request);
}
3.深度类 LevelLimitScheduler 继承 PriorityScheduler 类
package com.org.business.utils;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.scheduler.PriorityScheduler;
/**
* @author: xxxx
* description: webMagic爬取深度设置
* date:
* param:
*/
public class LevelLimitScheduler extends PriorityScheduler {
/**
* 构造方法
*/
private int levelLimit = 0;
public LevelLimitScheduler(int levelLimit) {
this.levelLimit = levelLimit;
}
@Override
public synchronized void push(Request request, Task task) {
//深度判断
if (((Integer) request.getExtra("_level")) <= levelLimit) {
super.push(request, task);
}
}
4. 爬虫启动方法
//webmagic 逻辑类(实现 PageProcessor 接口)
WebMegicService webMegicService = new WebMegicService();
//实例化schedule深度
LevelLimitScheduler schedule = new LevelLimitScheduler(5);
//配置Spider并启动爬虫
Spider spider = Spider
.create(webMegicService)
//第一步初始化的 request
.addRequest(request)
.setScheduler(schedule)
.thread(10);
spider.run();