最近一直用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
增量抓取, 那下次再抓取这个网站时, 速度又会增加很多。这样问题解决了
分享到:
相关推荐
Heritrix 支持分布式部署模式,可以在多台机器上并行执行抓取任务,大大提高了抓取速度和效率。 #### 二十八、Heritrix 3.x API 指南 Heritrix 提供了一套丰富的 API 接口,用户可以利用这些接口开发定制化的应用...
同时,它还提供了一些性能指标,如抓取速度、错误率等,方便用户监控爬虫运行情况。 8. **安全性与伦理**:使用Heritrix进行网络爬虫时,必须遵守网站的robots.txt规则,并尊重网站的版权。此外,合理的设置爬取...
在实际应用中,你可能会遇到性能优化的问题,比如通过批量添加文档来提高索引速度,或者使用分布式Lucene(如Solr或Elasticsearch)来处理大规模数据。此外,还需要考虑索引更新和维护,当Heritrix抓取到新的网页时...
2. **灵活的配置**:通过XML配置文件,用户可以详细定义爬虫的行为,如设置爬取速度、指定URL过滤规则、选择内容解析器等,这极大地增强了Heritrix的适应性。 3. **多线程处理**:Heritrix支持多线程爬取,能同时...
你需要指定起始URLs、抓取深度、爬取速度、是否遵循robots.txt协议等。同时,可以设置抓取策略,如广度优先还是深度优先。 4. **模块配置**: Heritrix由多个可插拔模块组成,如抓取器、解析器、处理器等。每个模块...
此外,通过调整`Profiles`中的`max-delay-ms`、`min-delay-ms`、`max-retries`和`retry-delay-seconds`等设置,可以优化爬取速度,同时通过设置`-Xmx`参数增加Java虚拟机(JVM)内存以提高性能。 Heritrix的一个...
3. **多线程与并发**:Heritrix 3.2 支持多线程和并发处理,可以同时处理多个HTTP请求,提高抓取效率。通过调整线程池参数,用户可以根据网络状况和服务器负载优化抓取速度。 4. **数据存储与处理**:Heritrix 内置...
7. **日志与监控**:Heritrix提供了丰富的日志记录和性能监控功能,帮助开发者了解爬虫运行状态,如抓取速度、错误报告等,以便进行问题排查和优化。 8. **道德与法规**:使用Heritrix进行网页抓取时,必须遵守...
它与Lucene和Heritrix的关系可能在于,FMPP可以用来自动化生成配置文件或者索引展示页面,这样在构建搜索引擎时可以提高效率和一致性。 总结一下,Lucene和Heritrix是构建搜索引擎的关键组件。Lucene负责高效地索引...
索引是搜索引擎的核心,它将网页内容转换成便于搜索的数据结构,使得查询速度得以提高。 4. **Lucene的索引过程**: 包括文档分析、字段分析、倒排索引的构建等。在分析过程中,文本会被分解成单独的词语(称为...
此外,章节可能还讨论了优化策略,如提高索引速度、节省存储空间和提升搜索性能。 通过学习《搜索引擎Lucene+Heritrix(第二版)3》,你将掌握搜索引擎的基本原理和实践技巧,了解如何利用开源工具构建自己的搜索引擎...
通过对`crawler-beans.cxml`的深入理解,用户可以定制化Heritrix 3.0爬虫,以满足特定的抓取需求,包括对爬取范围、速度、深度、内容提取等方面的控制。这种灵活性使得Heritrix 3.0成为研究、数据分析和大规模数据...
- **垂直搜索引擎**:Heritrix 可以针对特定领域或主题进行数据抓取,结合 Lucene 的强大搜索能力,可以构建出针对性强、效率高的垂直搜索引擎。 #### 四、总结 通过使用 Lucene 和 Heritrix,我们可以构建一个...
4. **分布式爬取**:Heritrix可以通过多台服务器进行分布式爬取,从而提高抓取效率和处理大量数据的能力。 5. **日志与监控**:Heritrix提供丰富的日志记录和实时监控功能,帮助用户跟踪爬虫的运行状态,及时发现和...
5. **多线程爬行**:为了提高效率,Heritrix使用多线程并行爬行,每个线程负责处理一个URL队列中的任务。 6. **日志和报告**:Heritrix记录详细的日志,包括抓取进度、错误信息和性能统计,便于用户监控和调试爬虫...
4. **性能优化**:通过合理配置Heritrix和Lucene,可以优化索引速度、查询响应时间,同时平衡资源消耗。 综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,...
Heritrix允许用户定义抓取策略,包括设置爬取深度、遵循或忽略特定链接、控制抓取速度等。抓取的网页数据可以保存在本地,为后续的处理和分析提供原始材料。与Lucene结合时,Heritrix可以作为数据采集前端,将抓取到...