`
eimhee
  • 浏览: 2150582 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

heritrix 提高抓取速度

阅读更多

最近一直用heritrix爬取网站,  晚上heritrix一直运行着, 但奇怪的是heritrix 抓取速度非常慢, 抓取一个网站, 用了8个多小时, 竟然没有运行完。 于是根据LOG 分析了一下慢的原因

 

 -----===== SNOOZED QUEUES =====-----
SNOOZED#0:
Queue us,imageshack,img245,+2 (p1)
  1 items
   wakes in: 99m19s74ms
    last enqueued: http://img245.xxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg
      last peeked: http://img245.xxxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg
   total expended: 12 (total budget: -1)
   active balance: 2988
   last(avg) cost: 1(1)
   totalScheduled fetchSuccesses fetchFailures fetchDisregards fetchResponses robotsDenials successBytes totalBytes fetchNonResponses
   2 1 0 0 1 0 59 59 12
   SimplePrecedenceProvider
   1

 SNOOZED QUene 里面有一些图片一直在那里, 并且运行时间相当长,

用浏览器打开, 那图片不存在,于是那图片一直在QUENE当中。

 

接着我分析了一下heritrix 中代码:

 

workQueneFrontier 有下面代码, 由于图片不存在会进入needsRetrying代码块中。

      
        if (needsRetrying(curi)) {
            // Consider errors which can be retried, leaving uri atop queue
            if(curi.getFetchStatus()!=S_DEFERRED) {
                wq.expend(curi.getHolderCost()); // all retries but DEFERRED cost
            }
            long delay_sec = retryDelayFor(curi);
            curi.processingCleanup(); // lose state that shouldn't burden retry

                wq.unpeek(curi);
                // TODO: consider if this should happen automatically inside unpeek()
                wq.update(this, curi); // rewrite any changes
                if (delay_sec > 0) {
                    long delay_ms = delay_sec * 1000;
                    snoozeQueue(wq, now, delay_ms);
                } else {
                    reenqueueQueue(wq);
                }

            // Let everyone interested know that it will be retried.
            appCtx.publishEvent(
                new CrawlURIDispositionEvent(this,curi,DEFERRED_FOR_RETRY));
            doJournalRescheduled(curi);
            return;
        }

 

 

 

 retryDelayFor方法是用来抓取失败, 计算等待的时间, 代码于如下

 

    /**
     * Return a suitable value to wait before retrying the given URI.
     * 
     * @param curi
     *            CrawlURI to be retried
     * @return millisecond delay before retry
     */
    protected long retryDelayFor(CrawlURI curi) {
        int status = curi.getFetchStatus();
        return (status == S_CONNECT_FAILED || status == S_CONNECT_LOST ||
                status == S_DOMAIN_UNRESOLVABLE)? getRetryDelaySeconds() : 0;
                // no delay for most
    }

    public int getRetryDelaySeconds() {
        return (Integer) kp.get("retryDelaySeconds");
    }

 

由于heritrix 默认是等待900秒, 也就是15分钟, 如果抓取失败一个小时也只能运行4次, 8 个小时也就是32次, 难怪一直在运行啊

 

  /** for retryable problems, seconds to wait before a retry */
    {
        setRetryDelaySeconds(900);
    }

 知道原因后就好办了, 修改一下配置文件:

 

 <!-- FRONTIER: Record of all URIs discovered and queued-for-collection -->
 <bean id="frontier" 
   class="org.archive.crawler.frontier.BdbFrontier">
  <!-- <property name="holdQueues" value="true" /> -->
  <!-- <property name="queueTotalBudget" value="-1" /> -->
  <!-- <property name="balanceReplenishAmount" value="3000" /> -->
  <!-- <property name="errorPenaltyAmount" value="100" /> -->
  <!-- <property name="precedenceFloor" value="255" /> -->
  <!-- <property name="queuePrecedencePolicy">
        <bean class="org.archive.crawler.frontier.precedence.BaseQueuePrecedencePolicy" />
       </property> -->
  <!-- <property name="snoozeLongMs" value="300000" /> -->
   <property name="retryDelaySeconds" value="90" /> 
  <!-- <property name="maxRetries" value="30" /> -->
  <!-- <property name="recoveryDir" value="logs" /> -->
  <!-- <property name="recoveryLogEnabled" value="true" /> -->
  <!-- <property name="maxOutlinks" value="6000" /> -->
  <!-- <property name="outboundQueueCapacity" value="50" /> -->
  <!-- <property name="inboundQueueMultiple" value="3" /> -->
  <!-- <property name="dumpPendingAtClose" value="false" /> -->
 </bean>

 

这是heritrix3的配置, 把时间改成90秒, 也就是只等待1分半钟,

如果是H1的配置, 那可以用管理界面进行配置。

改了一下速度一下提高了很多, 原来8小时才能爬完一个网站, 现在2个小时就行了。

如果再用一下heritrix

增量抓取, 那下次再抓取这个网站时, 速度又会增加很多。这样问题解决了

 

 

4
0
分享到:
评论
1 楼 lanxueren458 2013-06-26  
朋友,可以交流一下么,我是用了一个固定的oder.xml来抓取,新浪搜狐网易都能抓取的到的,但是别的网站就抓取不到了,请问下怎么生成一个万能的oder.xml,我只抓取网页内容,而且由于效率,只抓取10M,就是列表页面,然后再匹配标题关键字,来进行二次抓取,用自己写的程序来二次抓取

相关推荐

    heritrix3.1 官方指导手册

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

    网络爬虫Heritrix1.14.4可直接用

    同时,它还提供了一些性能指标,如抓取速度、错误率等,方便用户监控爬虫运行情况。 8. **安全性与伦理**:使用Heritrix进行网络爬虫时,必须遵守网站的robots.txt规则,并尊重网站的版权。此外,合理的设置爬取...

    Heritrix+Lucene搜索例子

    在实际应用中,你可能会遇到性能优化的问题,比如通过批量添加文档来提高索引速度,或者使用分布式Lucene(如Solr或Elasticsearch)来处理大规模数据。此外,还需要考虑索引更新和维护,当Heritrix抓取到新的网页时...

    Heritrix爬虫框架 完整版

    2. **灵活的配置**:通过XML配置文件,用户可以详细定义爬虫的行为,如设置爬取速度、指定URL过滤规则、选择内容解析器等,这极大地增强了Heritrix的适应性。 3. **多线程处理**:Heritrix支持多线程爬取,能同时...

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

    你需要指定起始URLs、抓取深度、爬取速度、是否遵循robots.txt协议等。同时,可以设置抓取策略,如广度优先还是深度优先。 4. **模块配置**: Heritrix由多个可插拔模块组成,如抓取器、解析器、处理器等。每个模块...

    heritrix系统使用.ppt

    此外,通过调整`Profiles`中的`max-delay-ms`、`min-delay-ms`、`max-retries`和`retry-delay-seconds`等设置,可以优化爬取速度,同时通过设置`-Xmx`参数增加Java虚拟机(JVM)内存以提高性能。 Heritrix的一个...

    heritrix3.2

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

    Heritrix—开发自己的搜索引擎

    7. **日志与监控**:Heritrix提供了丰富的日志记录和性能监控功能,帮助开发者了解爬虫运行状态,如抓取速度、错误报告等,以便进行问题排查和优化。 8. **道德与法规**:使用Heritrix进行网页抓取时,必须遵守...

    lucene_heritrix 搜索引擎

    它与Lucene和Heritrix的关系可能在于,FMPP可以用来自动化生成配置文件或者索引展示页面,这样在构建搜索引擎时可以提高效率和一致性。 总结一下,Lucene和Heritrix是构建搜索引擎的关键组件。Lucene负责高效地索引...

    开发自己的搜索引擎——Lucene+Heritrix

    索引是搜索引擎的核心,它将网页内容转换成便于搜索的数据结构,使得查询速度得以提高。 4. **Lucene的索引过程**: 包括文档分析、字段分析、倒排索引的构建等。在分析过程中,文本会被分解成单独的词语(称为...

    搜索引擎Lucene+Heritrix(第二版)3

    此外,章节可能还讨论了优化策略,如提高索引速度、节省存储空间和提升搜索性能。 通过学习《搜索引擎Lucene+Heritrix(第二版)3》,你将掌握搜索引擎的基本原理和实践技巧,了解如何利用开源工具构建自己的搜索引擎...

    Heritrix3.0教程 使用入门(三) 配置文件crawler-beans.cxml介绍.docx

    通过对`crawler-beans.cxml`的深入理解,用户可以定制化Heritrix 3.0爬虫,以满足特定的抓取需求,包括对爬取范围、速度、深度、内容提取等方面的控制。这种灵活性使得Heritrix 3.0成为研究、数据分析和大规模数据...

    开发自己的搜索引擎Lucene2.0+Heritrix

    - **垂直搜索引擎**:Heritrix 可以针对特定领域或主题进行数据抓取,结合 Lucene 的强大搜索能力,可以构建出针对性强、效率高的垂直搜索引擎。 #### 四、总结 通过使用 Lucene 和 Heritrix,我们可以构建一个...

    heritrix-1.14.3

    4. **分布式爬取**:Heritrix可以通过多台服务器进行分布式爬取,从而提高抓取效率和处理大量数据的能力。 5. **日志与监控**:Heritrix提供丰富的日志记录和实时监控功能,帮助用户跟踪爬虫的运行状态,及时发现和...

    heritrix-1.14.0

    5. **多线程爬行**:为了提高效率,Heritrix使用多线程并行爬行,每个线程负责处理一个URL队列中的任务。 6. **日志和报告**:Heritrix记录详细的日志,包括抓取进度、错误信息和性能统计,便于用户监控和调试爬虫...

    开发自己的搜索引擎lucene+heritrix(第2版)(ch13-ch15源码)

    4. **性能优化**:通过合理配置Heritrix和Lucene,可以优化索引速度、查询响应时间,同时平衡资源消耗。 综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,...

    Lucene+Heritrix开发自己的搜索引擎3.rar

    Heritrix允许用户定义抓取策略,包括设置爬取深度、遵循或忽略特定链接、控制抓取速度等。抓取的网页数据可以保存在本地,为后续的处理和分析提供原始材料。与Lucene结合时,Heritrix可以作为数据采集前端,将抓取到...

Global site tag (gtag.js) - Google Analytics