最近用heritrix 爬取网站, 发现很慢,
heritrix 的QUEUE的分配策略 会影响速度,
比如用HostnameQueueAssignmentPolicy, 一个网站只分配一个Queue,
如果这个网站有很多页面要爬取, 这些页面全部放到一个queue里面,
很多页面就会阻塞在这个Queue里, 要经过很长时间才能处理。
相比之下, 对一个网站的爬取用SurtAuthorityQueueAssignmentPolicy 策略会好很多,
会根据网站的URL结构放入不同的queue中,
比如
http://www.ebookl.com/magazine/men
http://www.ebookl.com/937100-restorative-therapies-parkinsons-disease-repost
这倆个页面会放在不同的Queue当中, 一个是category页面(共二级), 一个是内容页。
有兴趣可以看一下源代码的实现。
但是有些网站并不能考URL 来区分, 这时候可以考虑自定一个queueAssignmentPolicy, 修改SRPING XML配置,
<!-- QUEUE ASSIGNMENT POLICY -->
<bean id="queueAssignmentPolicy"
class="com.spider.util.CustomQueueAssignmentPolicy">
<property name="forceQueueAssignment" value="" />
<property name="deferToPrevious" value="true" />
<property name="parallelQueues" value="10" />
</bean>
这里我是继承SurtAuthorityQueueAssignmentPolicy,由于category页面URL包含all-ebo, 我就用第六个Queue, 其他内容页以html结尾, 我就用hashcode 取余数来分配到哪一个Queue.
public class CustomQueueAssignmentPolicy extends
SurtAuthorityQueueAssignmentPolicy {
private static final long serialVersionUID = -282094213180482046L;
private static final Logger logger = Logger
.getLogger(CustomQueueAssignmentPolicy.class.getName());
@Override
protected int getSubqueue(UURI basisUuri, int parallelQueues) {
if (basisUuri.toString().contains("all-ebo")) {
return 6;
} else if (basisUuri.toString().endsWith(".html")) {
int hashCode = basisUuri.toString().hashCode();
return Math.abs(hashCode) % 3;
}
return super.getSubqueue(basisUuri, parallelQueues);
}
}
虽然我写的很简单, 但是经过测试category和内容页都是很公平的处理, 内容页不会阻塞category页面的处理, 速度自然块了一些。
来自:http://laravel.iteye.com/blog/2052920