# 请求去重器

去重是任务进行中一个重要的处理过程,目前风铃虫内置的去重器有两种 全路径去重器无查询参数去重器两种

# 基础使用

# 全路径去重器

全路径去重器是系统中默认使用的去重器,它是根据 前请求对象 中的请求地址的全路径进行去重的,

在此模式下,只有请求目标地址完全相同时才会被认为是同一个请求。

下面是几个简单的示例

相同请求

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();
Last Updated: 5/24/2020, 9:59:14 AM