`

提升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 3.1.1 是一个强大的网络爬虫工具,专为处理现代Web内容设计,具有高度可配置性和灵活性。它允许用户通过源代码对网页进行深度抓取,从而收集、保存并分析互联网上的数据。这款软件是开放源码的,这意味着...

    heritrix抓取的操作和扩展

    在实际应用中,Heritrix通常用于大规模的网页抓取项目,例如学术研究、数据挖掘、网站备份或监控。通过调整配置和扩展,Heritrix可以适应各种复杂的抓取场景,提供稳定且灵活的服务。然而,由于其丰富的配置选项和...

    heritrix抓取指南

    《Heritrix抓取指南》 Heritrix是一款强大的网络爬虫工具,广泛应用于数据采集和分析。本指南将详细介绍如何利用Heritrix抓取淘宝商城大家电分类下的空调商品信息。 首先,确定我们的目标:抓取淘宝商城空调商品...

    Heritrix安装详细过程

    本节将详细介绍如何在Eclipse环境中搭建Heritrix,并进行必要的配置,以便能够顺利地启动Heritrix并执行抓取任务。 ##### 2.1 在Eclipse中搭建MyHeritrix工程 1. **新建Java工程** 在Eclipse中新建一个名为`...

    heritrix3.1 官方指导手册

    Heritrix 支持分布式部署模式,可以在多台机器上并行执行抓取任务,大大提高了抓取速度和效率。 #### 二十八、Heritrix 3.x API 指南 Heritrix 提供了一套丰富的 API 接口,用户可以利用这些接口开发定制化的应用...

    很好的heritrix学习资料

    Heritrix是一款强大的开源网络爬虫工具,专为大规模、深度网页抓取设计。这款工具由互联网档案馆(Internet Archive)开发,旨在提供灵活、可扩展的网页抓取框架,适用于学术研究、数据挖掘和历史记录保存等多种用途...

    开发自己的搜索引擎 lucene + heritrix

    Heritrix 支持各种复杂的抓取策略和规则,如深度优先、广度优先,以及各种过滤器和钩子,能够有效地抓取互联网上的资源。它能够处理大规模的网页抓取任务,并支持对抓取内容的归档管理。 综合Lucene和Heritrix,...

    Heritrix+Lucene搜索例子

    Heritrix是一款开源的互联网档案爬虫工具,用于抓取并保存网页以便进行后续处理或分析。Lucene则是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的强大功能。这个“Heritrix+...

    网络爬虫Heritrix1.14.4可直接用

    Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,主要用于抓取和保存网页内容。Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术...

    heritrix3.2

    3. **多线程与并发**:Heritrix 3.2 支持多线程和并发处理,可以同时处理多个HTTP请求,提高抓取效率。通过调整线程池参数,用户可以根据网络状况和服务器负载优化抓取速度。 4. **数据存储与处理**:Heritrix 内置...

    heritrix-1.12.1

    Heritrix是一个强大的开源网络爬虫工具,专为大规模网页抓取而设计。这个软件项目的标题"heritrix-1.12.1"表明我们正在讨论Heritrix的一个特定版本,即1.12.1版。这个版本可能包含了一些修复、改进或新功能,以提升...

    Lucene2.0+Heritrix(源代码)

    首先,Heritrix负责抓取网络上的数据,将其保存到本地或者某种持久化存储中。然后,Lucene2.0会读取这些数据,进行分析和索引,建立可供快速搜索的结构。用户通过搜索引擎的前端界面输入查询,查询会被发送到Lucene...

    heritrix-3.1.0 最新jar包

    Heritrix 3.1.0 是一个强大的网络爬虫工具,主要用于抓取和存档互联网上的网页。这个最新版本的jar包包含了Heritrix的核心功能,为用户提供了一个高效的网页抓取框架。Heritrix的设计理念是模块化和可配置性,使得它...

    Heritrix爬虫框架 完整版

    3. **多线程处理**:Heritrix支持多线程爬取,能同时处理多个连接,提高了爬取效率,尤其是在处理大量网页时。 4. **元数据管理**:Heritrix能够收集并存储关于抓取内容的元数据,如HTTP响应头、网页编码、抓取时间...

    Heritrix1.14.4(含源码包)

    Heritrix是一款开源的互联网档案爬虫工具,由...在深入了解和实践Heritrix 1.14.4的过程中,你不仅会掌握网络爬虫的基本原理和技术,还能提升Java编程和项目管理能力,为更高级的Web数据挖掘和分析打下坚实的基础。

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

    Heritrix是一款开源的网络爬虫工具,由互联网档案馆(Internet Archive)开发,用于抓取和保存网页。它的配置是整个爬虫工作的关键,确保Heritrix正确完整地配置对于实现高效、有针对性的网络抓取至关重要。以下将...

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

    Heritrix是一个强大的Java开发的开源网络爬虫,主要用于从互联网上抓取各种资源。它由www.archive.org提供,以其高度的可扩展性而...学习和掌握Heritrix的使用和开发,将有助于提升你在网络数据获取领域的专业技能。

Global site tag (gtag.js) - Google Analytics