`

提升Heritrix3.1.1的抓取效率

阅读更多

 

Heritrix3.1.1是老外写的爬虫,可配置性非常好,但是有一点不好,老外很懂礼貌,所以这个爬虫也很懂礼貌,爬起来非常的慢,1万多个链接,一天也爬不完。

仔细研究它的源代码和文档,网上的文档非常的少,基本要看源代码。

根据网上的这篇文档https://webarchive.jira.com/wiki/display/Heritrix/Politeness+parameters

这个爬虫对网站的礼貌主要是单线程,对同一网站只有一个线程。。。好吧,这个我们没什么办法了,因为它是单线的。

第二个可以设置的地方是politeness参数,这个线程取一个url,处理完成以后,在处理队列里的下一个url之前,先要睡一小觉(snooze),而睡多长时间,是由DispositionProcessor这个bean来决定的,里面有好几个参数,基本上是根据前一个uri的抓取需要的时间,乘上delayFactor来决定。。。缺省的设置是5倍,就是说,如果前一个uri花了1秒来获取,那么这个线程就要睡5秒。

处理的代码片断如下:

    /**
     * Update any scheduling structures with the new information in this
     * CrawlURI. Chiefly means make necessary arrangements for no other URIs at
     * the same host to be visited within the appropriate politeness window.
     * 
     * @param curi
     *            The CrawlURI
     * @return millisecond politeness delay
     */
    protected long politenessDelayFor(CrawlURI curi) {
        long durationToWait = 0;
        Map<String,Object> cdata = curi.getData();
        if (cdata.containsKey(A_FETCH_BEGAN_TIME)
                && cdata.containsKey(A_FETCH_COMPLETED_TIME)) {

            long completeTime = curi.getFetchCompletedTime();
            long durationTaken = (completeTime - curi.getFetchBeginTime());
            durationToWait = (long)(getDelayFactor() * durationTaken);

            long minDelay = getMinDelayMs();
            if (minDelay > durationToWait) {
                // wait at least the minimum
                durationToWait = minDelay;
            }

            long maxDelay = getMaxDelayMs();
            if (durationToWait > maxDelay) {
                // wait no more than the maximum
                durationToWait = maxDelay;
            }
            
            long respectThreshold = getRespectCrawlDelayUpToSeconds() * 1000;
            if (durationToWait<respectThreshold) {
                // may need to extend wait
                CrawlServer s = getServerCache().getServerFor(curi.getUURI());
                String ua = curi.getUserAgent();
                if (ua == null) {
                    ua = metadata.getUserAgent();
                }
                Robotstxt rep = s.getRobotstxt();
                if (rep != null) {
                    long crawlDelay = (long)(1000 * rep.getDirectivesFor(ua).getCrawlDelay());
                    crawlDelay = 
                        (crawlDelay > respectThreshold) 
                            ? respectThreshold 
                            : crawlDelay;
                    if (crawlDelay > durationToWait) {
                        // wait at least the directive crawl-delay
                        durationToWait = crawlDelay;
                    }
                }
            }
            
            long now = System.currentTimeMillis();
            int maxBandwidthKB = getMaxPerHostBandwidthUsageKbSec();
            if (maxBandwidthKB > 0) {
                // Enforce bandwidth limit
                ServerCache cache = this.getServerCache();
                CrawlHost host = cache.getHostFor(curi.getUURI());
                long minDurationToWait = host.getEarliestNextURIEmitTime()
                        - now;
                float maxBandwidth = maxBandwidthKB * 1.024F; // kilo factor
                long processedBytes = curi.getContentSize();
                host
                        .setEarliestNextURIEmitTime((long)(processedBytes / maxBandwidth)
                                + now);

                if (minDurationToWait > durationToWait) {
                    durationToWait = minDurationToWait;
                }
            }
        }
        return durationToWait;
    }
 

仔细看一下上面的代码,发现maxDelayMs这个参数可以直接设置为0。。。哈哈,改了一下再试,这个线程就没法睡觉了。。。睡啥啊,干完活想睡多久睡多久

 <bean id="disposition" class="org.archive.crawler.postprocessor.DispositionProcessor">
  <!-- <property name="delayFactor" value="5.0" /> -->
  <!-- <property name="minDelayMs" value="3000" /> -->
  <!-- <property name="respectCrawlDelayUpToSeconds" value="300" /> -->
  <property name="maxDelayMs" value="0" />
  <!-- <property name="maxPerHostBandwidthUsageKbSec" value="0" /> -->
 </bean>

实战结果统计为:

0.57 URIs/sec (0.64 avg); 35 KB/sec (28 avg)

而之前这个值为:

 0.1 URIs/sec (0.07 avg)       6 KB/sec(4 avg)

提升了5倍左右

分享到:
评论

相关推荐

    heritrix3.1.1

    较新的网络爬虫,能用源码,可以抓取任何网站上的所有链接,很强大,好东东,值得下载,学习

    heritrix抓取指南

    heritrix抓取指南heritrix抓取指南 heritrix抓取指南

    heritrix抓取的操作和扩展

    对heritrix抓取的操作和扩展 里面有MirrorWriterProcessor扩展的类文件修改

    Heritrix学习ppt

    NULL 博文链接:https://badxy.iteye.com/blog/860874

    web爬虫Heritrix.zip

    Heritrix是按多线程方式抓取的爬虫,主线程把任务分配给Teo线程(处理线程),每个Teo线程每次处理一个URL。Teo线程对每个URL执行一遍URL处理器链。URL处理器链包括如下5个处理步骤。整个流程都在图2.1中。 (1)预取链...

    Heritrix3手册翻译

    Heritrix User Manual https://webarchive.jira.com/wiki/display/Heritrix/Heritrix3 Heritrix3(或简称H3)指Heritrix的3.0发布。 目前官方的Heritrix 3.0.0版已经发布(2009年12月)。 后续的发行H3将是3.0.1...

    heritrix正确完整的配置heritrix正确完整的配置

    heritrix正确完整的配置heritrix正确完整的配置heritrix正确完整的配置heritrix正确完整的配置heritrix正确完整的配置

    网络爬虫Heritrix1.14.4可直接用

    在/Heritrix1/src/org/archive/crawler/Heritrix.java启动之后,访问https://localhost:8089登录admin密码admin直接用

    heritrix 配置

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Eclipse 中的配置、运行。

    Heritrix安装详细过程

    按照这个步骤安装绝对会让你安装成功的。步骤非常的清晰。Heritrix是一个不错的选择。网络爬虫,更快更好的帮你捕捉到你想要的网页

    heritrix-3.4.0-SNAPSHOT-src.zip

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。官网下载好像要翻墙,我下下来方便大家使用,这是3.4版本,配合heritrix-3.4.0-SNAPSHOT-dist.zip使用

    heritrix系统使用.ppt

    heritrix系统使用、一个ppt 介绍heritrix的基本概念、以及原理知识

    Heritrix(windows版)

    包含: heritrix-3.1.0-dist.zip heritrix-3.1.0-src.zip 官网下载地址。

    Heritrix—开发自己的搜索引擎

    开发自己的搜索引擎,Heritrix是一种网页抓取的有效工具

    heritrix网络爬虫

    Heritrix是一个开源,可扩展的web爬虫项目。用户可以使用它来从网上抓取想要的资源。Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取...

    heritrix1.14.4源码包

    heritrix1.14.4的源码包,包含heritrix1.14.4.zip和heritrix1.14.4-src.zip。heritrix是一种开源的网络爬虫,用于爬去互联网中的网页。如何配置和使用heritrix爬虫,请移步:...

    Heritrix爬虫框架 完整版

    Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑

    heritrix-3.1.0 最新jar包

    heritrix-3.1.0 最新官网jar包。包括heritrix-3.1.0-dist.zip包与heritrix-3.1.0-src.zip包。是爬虫神器

    Heritrix使用详解与高级开发应用

    Heritrix使用详解与高级开发应用 Heritrix开发应用详细

    heritrix1.14.0jar包

    爬虫时我们会使用heritrix,搭建工程时要导入这些jar包,该jar包是1.14.0版本的。

Global site tag (gtag.js) - Google Analytics