刚刚实现了一个控制页面深度的schedler,既然没有人回答的话可以简单说一下。
首先明白,webmagic中是存在一个待爬取得队列的,所有将要爬取的links都存放在这个队列里面。每次爬虫取一个link爬取,下载页面后分析出页面的内容产生新的link,新的link又推入队列,如此工作(这里不讨论去重了)
webmagic依靠继承schedler类来维护待爬取的links。关键的问题来了,需要控制深度,如何才能知道某一个link处于哪一层呢?如果知道了这个那么问题就迎刃而解了。
然而在webmagic里面,link是作为request对象存储的,而request对象是可以自己增加标记字段的。这样一来思路就来了,我们每次向待爬队列中推入的其实是一个request对象。
如此:
page.addTargetRequest(request);
那么我们直接在将这个request入队列之前增加一个标记位来标记它的层数就ok了。
Map extras = new HashMap();
extras.put("_level",(Integer)page.getRequest().getExtra("_level")+1);
request.setExtras(extras);
request.setUrl(url);
这个_level字段用来记录层数即可。
接下来我们只需要在processor里面每次判断一个当前page的request对象在第几层。新产生的request层数加1即可。
然后再schedler中判断层数是否到达了深度限制,如果到了就不入队列,
private BlockingQueue que