基于Heritrix限定爬虫的设计与实现
- 格式:pdf
- 大小:330.23 KB
- 文档页数:4
摘要网络爬虫是一种自动搜集互联网信息的程序。
通过网络爬虫不仅能够为搜索引擎采集网络信息,而且可以作为定向信息采集器,定向采集某些网站下的特定信息,如招聘信息,租房信息等。
本文通过JAVA实现了一个基于广度优先算法的多线程爬虫程序。
本论文阐述了网络爬虫实现中一些主要问题:为何使用广度优先的爬行策略,以及如何实现广度优先爬行;为何要使用多线程,以及如何实现多线程;系统实现过程中的数据存储;网页信息解析等。
通过实现这一爬虫程序,可以搜集某一站点的URLs,并将搜集到的URLs 存入数据库。
【关键字】网络爬虫;JAVA;广度优先;多线程。
ABSTRACTSPIDER is a program which can auto collect informations from internet. SPIDER can collect data for search engines, also can be a Directional information collector, collects specifically informations from some web sites, such as HR informations, this paper, use JAVA implements a breadth-first algorithm multi-thread SPDIER. This paper expatiates some major problems of SPIDER: why to use breadth-first crawling strategy, and collect URLs from one web site, and store URLs into database.【KEY WORD】SPIDER; JA V A; Breadth First Search; multi-threads.目录第一章引言 (1)第二章相关技术介绍 (2)2.1JAVA线程 (2)2.1.1 线程概述 (2)2.1.2 JAVA线程模型 (2)2.1.3 创建线程 (3)2.1.4 JAVA中的线程的生命周期 (4)2.1.5 JAVA线程的结束方式 (4)2.1.6 多线程同步 (5)2.2URL消重 (5)2.2.1 URL消重的意义 (5)2.2.2 网络爬虫URL去重储存库设计 (5)2.2.3 LRU算法实现URL消重 (7)2.3URL类访问网络 (8)2.4爬行策略浅析 (8)2.4.1宽度或深度优先搜索策略 (8)2.4.2 聚焦搜索策略 (9)2.4.3基于内容评价的搜索策略 (9)2.4.4 基于链接结构评价的搜索策略 (10)2.4.5 基于巩固学习的聚焦搜索 (11)2.4.6 基于语境图的聚焦搜索 (11)第三章系统需求分析及模块设计 (13)3.1系统需求分析 (13)3.2SPIDER体系结构 (13)3.3各主要功能模块(类)设计 (14)3.4SPIDER工作过程 (14)第四章系统分析与设计 (16)4.1SPIDER构造分析 (16)4.2爬行策略分析 (17)4.3URL抽取,解析和保存 (18)4.3.1 URL抽取 (18)4.3.2 URL解析 (19)4.3.3 URL保存 (19)第五章系统实现 (21)5.1实现工具 (21)5.2爬虫工作 (21)5.3URL解析 (22)5.4URL队列管理 (24)5.4.1 URL消重处理 (24)5.4.2 URL等待队列维护 (26)5.4.3 数据库设计 (27)第六章系统测试 (29)第七章结论 (32)参考文献 (33)致谢 (34)外文资料原文 (35)译文 (51)第一章引言随着互联网的飞速发展,网络上的信息呈爆炸式增长。
爬虫爬取课程设计一、课程目标知识目标:1. 学生能理解爬虫的基本概念、工作原理及应用场景。
2. 学生能掌握至少一种编程语言(如Python)的基本语法,并运用其编写简单的爬虫程序。
3. 学生能了解网络数据抓取的基本方法,如HTTP请求、HTML解析等。
4. 学生了解数据存储与处理的基本方法,如文件存储、数据库操作等。
技能目标:1. 学生能独立完成简单的网络数据抓取任务,具备实际操作能力。
2. 学生能运用所学知识解决实际问题,具备一定的编程思维和分析解决问题的能力。
3. 学生能在团队中协作完成复杂的数据抓取项目,具备良好的沟通与协作能力。
情感态度价值观目标:1. 学生对爬虫技术产生兴趣,提高对计算机编程和数据科学的热情。
2. 学生能认识到网络数据抓取在现实生活中的应用价值,培养学以致用的意识。
3. 学生在学习和实践过程中,培养良好的道德素养,遵循法律法规,尊重数据版权。
本课程针对高年级学生,结合爬虫技术在实际应用中的需求,以提高学生的实际操作能力和编程思维为核心。
课程性质为实践性、应用性较强的课程,要求学生在掌握基本理论知识的基础上,注重实践操作,培养解决实际问题的能力。
通过本课程的学习,学生将能够具备一定的网络数据抓取和处理能力,为后续相关课程打下坚实基础。
二、教学内容1. 爬虫基本概念与原理- 爬虫的定义与作用- 爬虫的工作流程- 常见爬虫类型及特点2. 编程语言基础- Python语言简介与安装- Python基本语法- Python常用库与函数3. 网络数据抓取- HTTP协议基础- 网络请求库的使用(如requests)- HTML解析库的使用(如BeautifulSoup)4. 数据存储与处理- 文件存储(如CSV、JSON)- 数据库操作(如SQLite)- 数据清洗与处理5. 实践项目与案例分析- 简单爬虫案例实现- 复杂爬虫项目分析与实现- 爬虫实战经验分享6. 爬虫伦理与法律法规- 爬虫与数据版权- 网络爬虫的合规性- 爬虫道德规范本教学内容按照教学大纲,循序渐进地安排,使学生能够系统地掌握爬虫技术。
Lucene很强大,这点在前面的章节中,已经作了详细介绍。
但是,无论多么强大的搜索引擎工具,在其后台,都需要一样东西来支援它,那就是网络爬虫Spi der。
网络爬虫,又被称为蜘蛛Spider,或是网络机器人、BOT等,这些都无关紧要,最重要的是要认识到,由于爬虫的存在,才使得搜索引擎有了丰富的资源。
Heritrix是一个纯由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源。
它来自于。
Heritrix最出色之处在于它的可扩展性,开发者可以扩展它的各个组件,来实现自己的抓取逻辑。
本章就来详细介绍一下Heritrix和它的各个组件。
10.1 Heritrix的使用入门要想学会使用Heritrix,当然首先得能把它运行起来。
然而,运行Heritrix并非一件容易的事,需要进行很多配置。
在Heritrix的文档中对它的运行有详细的介绍,不过尽管如此,笔者仍然花了大量时间,才将其配置好并运行成功。
10.1.1 下载和运行HeritrixHeritrix的下载页面为:/downloads.html。
从上面可以链接到SourceForge的下载页面。
当前Heritrix的最新版本为1.10。
(1)在下载完Heritrix的完整开发包后,解压到本地的一个目录下,如图10-1所示。
图10-1 Heritrix的目录结构其中,Heritrix所用到的工具类库都存于lib下,heritrix-1.10.1.jar是Her itrix的Jar包。
另外,在Heritrix目录下有一个conf目录,其中包含了一个很重要的文件:heritrix.properties。
(2)在heritrix.properties中配置了大量与Heritrix运行息息相关的参数,这些参数主要是配置了Heritrix运行时的一些默认工具类、WebUI的启动参数,以及Heritrix的日志格式等。
当第一次运行Heritrix时,只需要修改该文件,为其加入WebUI的登录名和密码,如图10-2所示。
基于主题的网络爬虫系统的研究与实现作者:谭翔纬来源:《科学与信息化》2016年第22期摘要针对高校软件教学中有效学习资源获取困难的现状,拟通过对开源的网络爬虫框架Heritrix进行二次开发,在爬虫的网络资源识别、数据筛选等功能点上开展研究工作,提出一种基于主题的数据采集方案,并在此基础上实现一种基于指定主题的网络爬虫系统,以满足高校软件教学对高质量学习资源的需求。
关键词学习资源;网络爬虫;HeritrixResearch and Implementation of Topic - based Web Crawler SystemTan xiang-weiSouth China Institute of Software Engineering, Guangzhou University Guangzhou 510990,ChinaAbstract In view of the difficulty of acquisition of effective learning resources in the software teaching of colleges and universities, it is proposed to carry out the secondary development of Heritrix, an open-source web crawler framework, and carry out research work on the reptile network resource identification and data selection, etc., and propose a theme- Data acquisition program, and on this basis to achieve a designated theme based on the network crawler system to meet the software teaching of high-quality learning resources needs.Key words Learning resources; web crawler; Heritrix引言现在高校软件专业的教学活动开展越来越离不开网络,体现在教师课前备课需要上网搜索相关的课程资源、学生课后自学需要上网获取对应的学习资源。
Lucene很强大,这点在前面的章节中,已经作了详细介绍。
但是,无论多么强大的搜索引擎工具,在其后台,都需要一样东西来支援它,那就是网络爬虫Spi der。
网络爬虫,又被称为蜘蛛Spider,或是网络机器人、BOT等,这些都无关紧要,最重要的是要认识到,由于爬虫的存在,才使得搜索引擎有了丰富的资源。
Heritrix是一个纯由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源。
它来自于。
Heritrix最出色之处在于它的可扩展性,开发者可以扩展它的各个组件,来实现自己的抓取逻辑。
本章就来详细介绍一下Heritrix和它的各个组件。
10.1 Heritrix的使用入门要想学会使用Heritrix,当然首先得能把它运行起来。
然而,运行Heritrix并非一件容易的事,需要进行很多配置。
在Heritrix的文档中对它的运行有详细的介绍,不过尽管如此,笔者仍然花了大量时间,才将其配置好并运行成功。
10.1.1 下载和运行HeritrixHeritrix的下载页面为:/downloads.html。
从上面可以链接到SourceForge的下载页面。
当前Heritrix的最新版本为1.10。
(1)在下载完Heritrix的完整开发包后,解压到本地的一个目录下,如图10-1所示。
图10-1 Heritrix的目录结构其中,Heritrix所用到的工具类库都存于lib下,heritrix-1.10.1.jar是Her itrix的Jar包。
另外,在Heritrix目录下有一个conf目录,其中包含了一个很重要的文件:heritrix.properties。
(2)在heritrix.properties中配置了大量与Heritrix运行息息相关的参数,这些参数主要是配置了Heritrix运行时的一些默认工具类、WebUI的启动参数,以及Heritrix的日志格式等。
当第一次运行Heritrix时,只需要修改该文件,为其加入WebUI的登录名和密码,如图10-2所示。
本科毕业设计(论文)基于Lucene与Heritrix的搜索引擎构建学院(系):计算机科学与工程专业:软件工程学生姓名:学号:指导教师:评阅教师:完成日期:摘要在互联网蓬勃发展的今天,互联网上的信息更是浩如烟海。
人们在享受互联网带来的便利的同时,却面临着一个如何在如此海量的内容中准确、快捷地找到自己所需要的信息的问题,由此互联网搜索引擎应运而生。
本文在对搜索引擎的原理、组成、数据结构和工作流程等方面深入研究的基础上,对搜索引擎的三个核心部分即网络蜘蛛、网页索引和搜索的分析及实现过程进行阐述。
网络蜘蛛部分采用了基于递归和归档机制的Heritrix网络爬虫;网页索引部分利用开源的Lucene引擎架构设计并实现了一个可复用的、可扩展的索引建立与管理子系统;搜索部分在Ajax技术支持上,设计并实现了一个灵活、简洁的用户接口。
本系统具有抓取网页、建立和管理索引、建立日志以及搜索信息等功能,具备一定的应用前景。
关键词:搜索引擎;中文分词;索引The Construction of Search Engine Based on Lucene and HeritrixAbstractThe contents on the Web are increasing exponentially as the rapid development of the Internet. A problem how to obtain the useful information from vast contents quickly and accurately is facing us while people are enjoying the convenience of the Internet. The solver of this problem is Web Search Engine.The analysis and implementation process of three basic components of search engine(Crawler, Indexer and Searcher) is described in this paper on the basis of further study on the principles, composition, data structure and work flow of search engine. The crawler component is implemented with Heritrix crawler based on the mechanism of recursion and archiving; A reusable, extensible index establishment and management subsystem are designed and implemented by open-source package named “Lucene” in the indexer component; The Searcher component based on the Ajax technology is designed and realized as a flexible, concise user interface. The system has some functions, such as crawling web page, establishment and management index, establishment log and search information, it has a certain application prospect.Key Words:Search Engine;Chinese Word Segmentation;Index目录摘要 (I)Abstract (II)1 绪论 (1)1.1 项目背景 (1)1.2 国内外发展现状 (1)2 系统的开发平台及相关技术 (3)2.1 系统开发平台 (3)2.2 系统开发技术 (3)2.2.1 Heritrix网络爬虫简介 (3)2.2.2 Lucene技术简介 (4)2.2.3 Ajax技术简介 (4)3 系统分析与设计 (6)3.1 系统需求分析 (6)3.1.1 系统架构分析 (6)3.1.2 系统用例模型 (6)3.1.3 系统领域模型 (10)3.2 系统概要设计 (11)3.3 系统详细设计 (12)3.3.1 索引建立子系统 (13)3.3.2 用户接口子系统 (17)4 系统的实现 (18)4.1 系统包框架的构建 (18)4.1.1 索引建立子系统 (18)4.1.2 用户接口子系统 (19)4.2 系统主要功能实现 (19)4.2.1 索引建立子系统 (19)4.2.2 用户接口子系统 (22)结论 (24)参考文献 (25)致谢 (26)1 绪论1.1 项目背景1994年左右,万维网(world wide web)出现了。
网络爬虫heritrix1、heritrix的安装、配置首先需下载heritrix1.14.4.zip和heritrix-1.14.4-src.zip(最新版本)。
下载地址:/projects/archive-crawler/files/archive-crawler%20(heritrix%201.x)/ Heritrix的安装有两种方式:命令行方式运行和在Eclipse中配置Heritrix。
1.1 命令行方式运行。
a、将得到的heritrix-1.14.4.zip压缩包直接解压缩到某一目录,我选择的是E:\Heritrix。
b、然后,将E:\Heritrix 目录中的heritrix-1.14.4.jar文件解压缩,把profiles\default下的两个文件order.xml和seeds.txt复制到E:\Heritrix\conf 目录下。
c、以文本编辑方式打开E:\Heritrix\conf 下的heritrix.properties文件,在“heritrix.cmdline.admin = ” 项的后面加入你所要设定的管理员账户和密码,用“:”分割,如:heritrix.cmdline.admin = admin:admind、复制E:\Heritrix\conf 下的jmxremote.password.template文件到主目录E:\Heritrix下,并更名为jmxremote.password,属性最好设置为只读文件。
编辑此文件,更改最后两行"monitorRole @PASSWORD@"、"controlRole @PASSWORD@"中的"@PASSWORD@"为管理员密码。
如:monitorRole admincontrolRole admine、打开“运行”,将cmd定位到E:\heritrix\bin下,执行"heritrix--admin=admin:admin" 命令,即可启动heritrix。
本科毕业设计题目:基于网络爬虫的搜索引擎设计与实现系别:专业:计算机科学与技术班级:学号:姓名:同组人:指导教师:教师职称:协助指导教师:教师职称:摘要本文从搜索引擎的应用出发,探讨了网络蜘蛛在搜索引擎中的作用和地住,提出了网络蜘蛛的功能和设计要求。
在对网络蜘蛛系统结构和工作原理所作分析的基础上,研究了页面爬取、解析等策略和算法,并使用Java实现了一个网络蜘蛛的程序,对其运行结果做了分析。
关键字:爬虫、搜索引擎AbstractThe paper,discussing from the application of the search engine,searches the importance and function of Web spider in the search engine.and puts forward its demand of function and design.On the base of analyzing Web Spider’s system strtucture and working elements.this paper also researches the method and strategy of multithreading scheduler,Web page crawling and HTML parsing.And then.a program of web page crawling based on Java is applied and analyzed.Keyword: spider, search engine目录摘要 (1)Abstract (2)一、项目背景 (4)1.1搜索引擎现状分析 (4)1.2课题开发背景 (4)1.3网络爬虫的工作原理 (5)二、系统开发工具和平台 (5)2.1关于java语言 (5)2.2 Jbuilder介绍 (6)2.3 servlet的原理 (6)三、系统总体设计 (8)3.1系统总体结构 (8)3.2系统类图 (8)四、系统详细设计 (10)4.1搜索引擎界面设计 (10)4.2 servlet的实现 (12)4.3网页的解析实现 (13)4.3.1网页的分析 (13)4.3.2网页的处理队列 (14)4.3.3 搜索字符串的匹配 (14)4.3.4网页分析类的实现 (15)4.4网络爬虫的实现 (17)五、系统测试 (25)六、结论 (26)致谢 (26)参考文献 (27)一、项目背景1.1搜索引擎现状分析互联网被普及前,人们查阅资料首先想到的便是拥有大量书籍的图书馆,而在当今很多人都会选择一种更方便、快捷、全面、准确的方式——互联网.如果说互联网是一个知识宝库,那么搜索引擎就是打开知识宝库的一把钥匙.搜索引擎是随着WEB信息的迅速增加,从1995年开始逐渐发展起来的技术,用于帮助互联网用户查询信息的搜索工具.搜索引擎以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的.目前搜索引擎已经成为倍受网络用户关注的焦点,也成为计算机工业界和学术界争相研究、开发的对象.目前较流行的搜索引擎已有Google, Yahoo, Info seek, baidu等. 出于商业机密的考虑, 目前各个搜索引擎使用的Crawler 系统的技术内幕一般都不公开, 现有的文献也仅限于概要性介绍. 随着W eb 信息资源呈指数级增长及Web 信息资源动态变化, 传统的搜索引擎提供的信息检索服务已不能满足人们日益增长的对个性化服务的需要, 它们正面临着巨大的挑战. 以何种策略访问Web, 提高搜索效率, 成为近年来专业搜索引擎网络爬虫研究的主要问题之一。
Heritrix使用小结1. Heritrix 简介Heritrix是一个专门为互联网上的网页进行存档而开发的网页检索器。
它使用Java编写并且完全开源。
它主要的用户界面可以通过一个web流量器来访问并通过它来控制检索器的行为,另外,它还有一个命令行工具来供用户选择调用。
Heritrix是由互联网档案馆和北欧国家图书馆联合规范化编写于2003年初。
第一次正式发布是在2004年1月,并不断的被互联网档案馆和其他感兴趣的第三方改进着。
到现在已经成为一个成熟的开源爬虫,并被广泛使用。
Heritrix的操作模型:从模型中可以看到,利用Heritrix我们可以轻松从互联网上获取信息并将它们全部存储下来,然后可以任意的访问获取到的网页信息并可以查看报告。
Heritrix的整体结构简图如下:它的工作流程是一个循环,具体流程是:1 在预定的URI中选择一个。
2 从选择的URI的网址下载远程文件3 分析,归档下载到的内容4 从分析到的内容里面选择感兴趣的URI。
加入预定队列。
5 标记已经处理过的URI在大概的了解了Heritrix及它的工作机制之后,我们就可以开始Heritrix的使用了。
2. Heritrix 的配置与使用1) 安装与配置从官方网站/下载最新版本的Heritrix运行包,解压到一个文件夹内。
其中,Heritrix所用到的工具类库都存于lib下,另外,在Heritrix目录下有一个conf目录,其中包含了一个很重要的文件:heritrix.properties在 heritrix.properties中配置了大量与Heritrix运行息息相关的参数,这些参数主要是配置了Heritrix运行时的一些默认工具类、WebUI的启动参数,以及Heritrix的日志格式等。
当第一次运行Heritrix时,只需要修改该文件,为其加入WebUI的登录名和密码。
在"heritrix.cmdline.admin="后面增加账户和密码,比如heritrix.cmdline.admin=admin:admin 。
毕业设计(论文)说明书学院专业年级姓名指导教师年月日毕业设计(论文)任务书题目:图像检索系统的设计与实现学生姓名王超学院名称软件学院专业软件工程学号3007218015指导教师于永新职称讲师一、原始依据(包括设计或论文的工作基础、研究条件、应用环境、工作目的等。
)随着互联网的飞速发展,网络上的图片信息呈爆炸式增长,这使得人们在网上找到所需的图片越来越困难,图片检索技术成为当今非常热门的研究话题。
图像检索一直是信息检索领域的一个主流问题,涉及到图像处理、图像分割、模式识别及机器学习等多个方面。
检索的智能化和自动化是图像检索的目标。
目前主流的图像检索方法大致可以分为两大类,即基于文本的图像检索(TBIR)和基于内容的图像检索(CBIR)。
在检索原理上,无论是基于文本的图像检索还是基于内容的图像检索,主要包括三方面:一方面对用户需求的分析和转化,形成可以检索索引数据库的提问;另一方面,收集和加工图像资源,提取特征,分析并进行标引,建立图像的索引数据库;最后一方面是根据相似度算法,计算用户提问与索引数据库中记录的相似度大小,提取出满足阈值的记录作为结果,按照相似度降序的方式输出。
而搜集图片和建立索引又是实现图像检索技术的非常重要的一个环节。
网络爬虫程序就是用来搜集网页和图片的程序。
本文的研究重点在于使用网络爬虫框架Heritrix进行扩展,从网络上下载所需网页及图片并利用HTMLParser进行网页分析和图片相关信息提取。
完成上述工作后,再将图片的目录位置和提取的信息存入数据库。
并建立一个图片检索系统的Web工程,实现检索功能。
开发语言为Java, 开发工具为MyEclipse和MySQL及Tomcat.二、参考文献[1]Ritendra Datta, Dhiraj Joshi, Jia Li et al. Image Retrieval: Ideas, Influences, and Trends ofthe New Age[J].ACM Comput. Surv. 40, 2, Article 5 .April 2008.[2]李晓明,闫宏飞,王继民. 搜索引擎-原理,技术与系统[M].北京:科学出版社,2004.[3]马自萍.形状和颜色特征的混合图像检索[D].银川:北方民族大学,2010.7.[4]陈剑雄,张蓓.简析图像检索中的CBIR技术[J].情报探索(第7期),2010.7.[5]Rafael C.Gonzalez and Richard E.Woods.Digital Image Processing Second Edition[M].Prentice Hall, 2003-3.[6]沈兰荪,张箐,李晓光。
Heritrix源码分析(⼗四)近段时间在搞定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()⽅法,这⾥也对该⽅法做⼀些介绍,具体请看源码注释,改成如下,红⾊部分为改动部分:Java代码1. /**2. * 从调度中⼼获取下⼀个要抓取的URL3. *4. */5. public CrawlURI next() throws InterruptedException, EndedException {6. while (true) {//⼀直不停的循环,直到遇到异常或终⽌7. <span style="color: #ff0000;">// 郭芸修改,⽤于当队列⾥没有可抓取的URL的时候去获取种⼦继续8. synchronized (this) {9. if (this.controller.getFrontier().isEmpty()) { //如果没有可抓取的URL10. loadSeeds(); //重新载⼊种⼦11. this.controller.getToePool().notifyAll(); //唤醒所有抓取线程12. }13.14. }</span>15.16. long now = System.currentTimeMillis();//开始获取时间17.18. // 检查是否有暂停命令、结束命令以及宽带控制,这⾥会导致Heritrix结束19. preNext(now);20.21. /*22. * 允许最多⼀个线程去填充准备队列(readyClassQueues)23. */24. if (readyFiller.tryAcquire()) {// 表⽰没有线程去使⽤当前变量,当前类1次只允许1个线程同时使⽤25. try {26.27. // 空闲队列数=⽬标队列数-准备队列数28. int activationsNeeded = targetSizeForReadyQueues()29. - readyClassQueues.size();30. // 如果空闲队列数⼤于0,并且不在活动状态的队列数不是空的,则表⽰需要将不在活动状态的队列转移到准备队列31. while (activationsNeeded > 0 && !inactiveQueues.isEmpty()) {32. activateInactiveQueue();//将不在活动状态队列的URL转移⼀定数⽬到活动状态队列33. activationsNeeded--;34. }35. } finally {36. readyFiller.release();// 必须释放,这样下次才可以继续使⽤37. }38. }39.40. WorkQueue readyQ = null;//准备⼯作队列41. // 获取并移除此准备队列表⽰的队列的头部(即准备队列的第⼀个元素)如果该队列没有可⽤元素,则等待指定的时间,这⾥是1000毫秒也就是1秒42. Object key = readyClassQueues.poll(DEFAULT_WAIT,LISECONDS);// 获得classKey,然后再通过classKey去获得队列43.44. if (key != null) {45. readyQ = (WorkQueue) this.allQueues.get(key);// 获得⼯作队列WorkQueue46. }47. if (readyQ != null) {48. while (true) { // ⼀直循环,直到抛出异常或终⽌49. CrawlURI curi = null;50. synchronized (readyQ) {//锁定准备队列,让其他线程⽆法获取,避免脏读51. curi = readyQ.peek(this); // 从数据库pendingUrls中获取CrawlURI52. if (curi != null) {53. // 检查该curi是否属于不同的队列54. String currentQueueKey = getClassKey(curi);55. if (currentQueueKey.equals(curi.getClassKey())) {56. //在正确的队列,排放它57. noteAboutToEmit(curi, readyQ);58. inProcessQueues.add(readyQ);// 加⼊已处理队列59. return curi;60. }61.62. curi.setClassKey(currentQueueKey);63. readyQ.dequeue(this); //从调度器中删除刚获取到的URL64. decrementQueuedCount(1); //计数65. curi.setHolderKey(null);66. } else {67. readyQ.clearHeld();68. break;69. }70. }71. if (curi != null) {72. sendToQueue(curi); //将获取到的URL发送到它该属于的队列73. }74. }75. } else {76. if (key != null) {77. logger.severe("Key " + key78. + " in readyClassQueues but not allQueues");79. }80. }81. //如果该强烈退出,则抛异常结束循环82. if (shouldTerminate) {83. throw new EndedException("shouldTerminate is true");84. }85. //如果没有处理中的队列,则刷新该队列86. if (inProcessQueues.size() == 0) {87. this.alreadyIncluded.requestFlush();88. }89. }90. }。