# 请求去重器
去重是任务进行中一个重要的处理过程,目前风铃虫内置的去重器有两种 全路径去重器
和无查询参数去重器
两种
# 基础使用
# 全路径去重器
全路径去重器是系统中默认使用的去重器,它是根据 前请求对象 中的请求地址的全路径进行去重的,
在此模式下,只有请求目标地址完全相同时才会被认为是同一个请求。
下面是几个简单的示例
相同请求
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
不同请求
http://www.yishuifengxiao.com/aa/bb?ff=a1&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
不同请求
http://www.yishuifengxiao.cn/aa/bb?ff=aa&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
# 无查询参数去重器
无查询参数去重器 会忽略请求中的查询参数,只要请求中查询参数之外的部分相同即可认为是同一个请求。
下面是几个简单的示例
相同请求
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
相同请求
http://www.yishuifengxiao.com/aa/bb?ff=a1&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
不同请求
http://www.yishuifengxiao.cn/aa/bb?ff=aa&dd=rr&ss=ee
http://www.yishuifengxiao.com/aa/bb?ff=aa&dd=rr&ss=ee
# 高级使用
对于特殊某些情况下,系统内置的去重器可能满足不了用户的需求的,此时用户可以通过自定义去重器来实现自己的需求。
下面是一个自定义去重器的示例
public class SimpleDuplicateRemover implements DuplicateRemover {
/**
* 判断当前请求是否重复
*
* @param task 当前任务信息
* @param requestCache 请求任务缓存器
* @param request 当前需要判断的请求
* @return true表示当前请求没有存在过,需要调度器调度,以便后期进行该请求,false表示该请求已经进行过,调度器会抛弃该请求
*/
@Override
public boolean noDuplicate(final Task task, final RequestCache requestCache, final Request request) {
if (null == request) {
return false;
}
// 在历史链接记录集不存在时才处理
return !requestCache.exist(CrawlerConstant.REQUEST_HOSTORY + task.getName(), request);
}
/**
* 当前请求没有重复时需要进行的操作,一般来说,只需将该请求存入请求任务缓存器即可
*
* @param task 当前任务信息
* @param requestCache 请求任务缓存器
* @param request 当前需要判断的请求
*/
@Override
public void doWhenNoDuplicate(final Task task, final RequestCache requestCache, final Request request) {
// 存储在历史记录集之中
requestCache.save(new StringBuffer(CrawlerConstant.REQUEST_HOSTORY).append(task.getName()).toString(), request);
}
}
接下来就可以应用自定义去重器了
//获取风铃虫实例
Crawler crawler = ...
//注意此步骤一定要在风铃启动之前进行
crawler.setDuplicateRemover(new SimpleDuplicateRemover());
//启动风铃虫
crawler.start();