转:http://guoyunsky.iteye.com/blog/663370
近段时间在搞定Lucene的一些问题,所以Heritrix源码分析暂时告一段落。今天下午在群里有同学提到了Heritrix异常终止的问题以及让Heritrix不停的抓取(就是抓完一遍后载入种子继续抓取,目前他是写个定时器,定时检查Heritrix是否停止,如果停止了则重新初始化Heritrix,让Heritrix重新抓取,但这个方法就不可避免的会导致抓取重复URl,除非从recover.gz导入)。我想这2个问题都可以用我下面这个方法,但对于Heritrix异常终止的问题这个方法也只是治标不治本,要改动的地方蛮多,涉及到Heritrix的设计以及结构,不是一时可以完成。下面就介绍原理以及方法:
1.原理:
Heritrix的自然停止(就是非人为以及不可抗力因素,如Web UI界面出发停止命令)的依据是判断调度器里面是否还有URL可抓取,如果没有则当前线程退出,如果是单线程抓取的话,则也意味着Heritrix的结束。如果是多线程抓取的话,则每个线程在获取不到URL的时候都会置不在活动状态,当最后一个活动状态线程也获取不到URL的时候则Heritrix也会进入自然停止。所以我们可以在判断Heritrix是否还有URL可抓取的时候做一些处理,比较简单的方法就是重新载入种子以及唤醒所有抓取线程。但由于处在多线程抓取模式中,每个线程都会判断,如此会导致多次载入种子,造成不必要的浪费,所以这里也要做一些同步控制。不要导致过分载入种子,而是每抓完一次则重新载入种子。
2.方法:
修改org.archive.crawler.frontier.WorkQueueFrontier中的public CrawlURI next()方法,这里也对该方法做一些介绍,具体请看源码注释,改成如下,红色部分为改动部分:
/**
* 从调度中心获取下一个要抓取的URL
*
*/
public CrawlURI next() throws InterruptedException, EndedException {
while (true) {//一直不停的循环,直到遇到异常或终止
<span style="color: #ff0000;">// 郭芸修改,用于当队列里没有可抓取的URL的时候去获取种子继续
synchronized (this) {
if (this.controller.getFrontier().isEmpty()) { //如果没有可抓取的URL
loadSeeds(); //重新载入种子
this.controller.getToePool().notifyAll(); //唤醒所有抓取线程
}
}</span>
long now = System.currentTimeMillis();//开始获取时间
// 检查是否有暂停命令、结束命令以及宽带控制,这里会导致Heritrix结束
preNext(now);
/*
* 允许最多一个线程去填充准备队列(readyClassQueues)
*/
if (readyFiller.tryAcquire()) {// 表示没有线程去使用当前变量,当前类1次只允许1个线程同时使用
try {
// 空闲队列数=目标队列数-准备队列数
int activationsNeeded = targetSizeForReadyQueues()
- readyClassQueues.size();
// 如果空闲队列数大于0,并且不在活动状态的队列数不是空的,则表示需要将不在活动状态的队列转移到准备队列
while (activationsNeeded > 0 && !inactiveQueues.isEmpty()) {
activateInactiveQueue();//将不在活动状态队列的URL转移一定数目到活动状态队列
activationsNeeded--;
}
} finally {
readyFiller.release();// 必须释放,这样下次才可以继续使用
}
}
WorkQueue readyQ = null;//准备工作队列
// 获取并移除此准备队列表示的队列的头部(即准备队列的第一个元素)如果该队列没有可用元素,则等待指定的时间,这里是1000毫秒也就是1秒
Object key = readyClassQueues.poll(DEFAULT_WAIT,TimeUnit.MILLISECONDS);// 获得classKey,然后再通过classKey去获得队列
if (key != null) {
readyQ = (WorkQueue) this.allQueues.get(key);// 获得工作队列WorkQueue
}
if (readyQ != null) {
while (true) { // 一直循环,直到抛出异常或终止
CrawlURI curi = null;
synchronized (readyQ) {//锁定准备队列,让其他线程无法获取,避免脏读
curi = readyQ.peek(this); // 从数据库pendingUrls中获取CrawlURI
if (curi != null) {
// 检查该curi是否属于不同的队列
String currentQueueKey = getClassKey(curi);
if (currentQueueKey.equals(curi.getClassKey())) {
//在正确的队列,排放它
noteAboutToEmit(curi, readyQ);
inProcessQueues.add(readyQ);// 加入已处理队列
return curi;
}
curi.setClassKey(currentQueueKey);
readyQ.dequeue(this); //从调度器中删除刚获取到的URL
decrementQueuedCount(1); //计数
curi.setHolderKey(null);
} else {
readyQ.clearHeld();
break;
}
}
if (curi != null) {
sendToQueue(curi); //将获取到的URL发送到它该属于的队列
}
}
} else {
if (key != null) {
logger.severe("Key " + key
+ " in readyClassQueues but not allQueues");
}
}
//如果该强烈退出,则抛异常结束循环
if (shouldTerminate) {
throw new EndedException("shouldTerminate is true");
}
//如果没有处理中的队列,则刷新该队列
if (inProcessQueues.size() == 0) {
this.alreadyIncluded.requestFlush();
}
}
}
分享到:
相关推荐
Heritrix是互联网档案(Internet Archive)开发的一款开源网络爬虫工具,用于系统地抓取、存储和归档网页。这个“Heritrix源码”压缩包可能包含了Heritrix项目的完整源代码,以及相关的学习资料,对于深入理解...
### Heritrix源码分析(十一):Heritrix中的URL——CandidateURI和CrawlURI #### 一、概述 Heritrix是一款开源的网络爬虫工具,它主要用于归档和备份网页数据。Heritrix的设计非常灵活且可扩展性强,能够支持多种...
Heritrix是一款开源的网络爬虫工具,由互联网档案馆(Internet Archive)开发,用于大规模网页抓取。本文将深入探讨Heritrix的源码结构,帮助读者理解其内部工作原理。 首先,我们来了解Heritrix的核心包及其功能:...
**Lucene 和 Heritrix 源码分析** 在IT领域,搜索引擎的开发是一项复杂而重要的任务,它涉及到大量的文本处理、索引构建以及高效的查询算法。Lucene 和 Heritrix 是两个开源工具,分别专注于搜索的核心算法和网页...
7. **数据存储**:Heritrix可以将抓取的数据存储为WARC(Web ARChive)格式,这是一种标准的档案格式,便于长期保存和分析。WARC文件包含原始的HTTP响应,包括头部信息和内容,可以使用专门的工具进行解析和检索。 ...
Heritrix的工作模型基于一个循环过程,包括选择URI、下载内容、分析归档、选择新URI并添加到队列,以及标记已处理的URI。它的整体结构包括多个组件,协同工作以实现高效和可控的网页抓取。 配置和使用Heritrix主要...
Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护,用于抓取和保存互联网上的网页。这款工具的设计目标是提供一个可扩展、可配置的平台,以适应各种爬网需求。Heritrix的核心功能包括URL调度、网页...
Heritrix 3.2 源码的分析和理解有助于开发者深入掌握爬虫技术,定制自己的爬虫解决方案。 首先,让我们了解一下Heritrix 3.2 的核心特性: 1. **模块化设计**:Heritrix 3.2 采用组件化的架构,使得不同的爬取功能...
### Heritrix源码分析知识点概述 #### 一、Heritrix简介 Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护。它主要用于网页归档和大规模网络爬取任务。Heritrix的设计理念是高度可配置性和扩展性,...
Heritrix是互联网档案馆开发的一款开源Web抓取工具,专为大规模、可扩展的网页存档设计。这个“Heritrix1.14.4源码+项目”压缩包包含的是Heritrix 1.14.4版本的源代码和相关项目文件,对于学习和理解Web爬虫的工作...
heritrix1.14.4的源码包,包含heritrix1.14.4.zip和heritrix1.14.4-src.zip。heritrix是一种开源的网络爬虫,用于爬去互联网中的网页。如何配置和使用heritrix爬虫,请移步:...
本节将详细介绍如何在Eclipse环境中搭建Heritrix,并进行必要的配置,以便能够顺利地启动Heritrix并执行抓取任务。 ##### 2.1 在Eclipse中搭建MyHeritrix工程 1. **新建Java工程** 在Eclipse中新建一个名为`...
源码分析对于理解Heritrix的工作原理至关重要。通过对源码的阅读,我们可以了解其内部架构,包括线程模型、数据流控制和模块间的通信机制。例如,Heritrix采用多线程设计,每个组件如fetcher、parser和archiver都在...
最后,"heritrixProject"很可能包含了Heritrix的配置和源码,用于自定义网络爬取的行为和范围。 总结起来,Lucene和Heritrix是构建高效网络搜索系统的关键组件。Lucene提供强大的全文索引和搜索能力,而Heritrix则...
综上所述,"开发自己的搜索引擎lucene+heritrix(第2版)"的源码涵盖了从网络数据抓取到全文检索的全过程,适合开发者深入学习和实践搜索引擎技术。通过研究ch13至ch16的源代码,可以更深入地理解这两个工具的交互和...
Heritrix是一款开源的网络爬虫工具,由Internet Archive开发并维护,主要用于大规模网页抓取。Heritrix-1.14.4源代码的提供,对于那些希望深入理解网络爬虫工作原理、想要定制爬虫功能或者进行相关研究的开发者来说...
通过Heritrix的高效抓取能力,我们可以获取大量淘宝商城空调商品的详细信息,包括但不限于商品名称、价格、评价等,这些数据可用于市场分析、竞争情报或是其他商业用途。然而,务必注意合理使用抓取的数据,遵守相关...
Heritrix是一款强大的开源网络爬虫工具,由互联网档案馆(Internet Archive)开发,主要用于抓取和保存网页内容。Heritrix 1.14.4是该软件的一个较早版本,但依然具有广泛的适用性,尤其对于学习和研究网络爬虫技术...
- **URL管理**:Heritrix使用URL队列来管理待抓取的链接,并且可以设置URL过滤规则,避免重复抓取或不符合条件的URL。 - **内容解析**:Heritrix内置了HTML、XML、PDF等多种格式的解析器,可以解析网页内容并提取出...
Heritrix是一款开源的网络爬虫工具,由互联网档案馆(Internet Archive)开发,用于抓取和保存网页。它的配置是整个爬虫工作的关键,确保Heritrix正确完整地配置对于实现高效、有针对性的网络抓取至关重要。以下将...