一种读取网络资源站点信息的方法及其系统
技术领域
本发明涉及互联网技术领域,特别是一种读取网络资源站点信息的方法及其系统。
背景技术
搜索引擎技术是近几年非常热门的技术,以其为核心基础的网页搜索、新闻搜索、音乐搜索、图片搜索、地图搜索等都具有很大的实用价值和商业价值。比特流(BitTorrent,BT)种子搜索引擎是搜索引擎中提供BT种子文件下载链接和BT种子文件关键信息的搜索引擎。当前已经存在成熟商用的BT种子搜索引擎,比如BTChina等。
爬虫(Crawler)是搜索引擎中一个重要的组成部分,为搜索引擎提供最原始的数据来源,如网页、mp3格式的音频、图片、电子邮件、文档、软件等等,极大地丰富了搜索引擎在各种场合下的应用。在BT种子搜索引擎中,Crawler的作用是抓取BT种子链接,并将其发送给检测程序(Detector)进行处理。
Detector模块是BT种子搜索引擎中真正处理BT种子发布站点统一资源描述符(Uniform Resource Locator,URL)链接的模块。Detector对Crawler爬行的URL链接进行处理,下载BT种子文件,连接提供BT的服务器(Tracker)获取下载信息,并且把得到的索引信息进行合并后送索引(Index)模块建立索引。
由于现在中国网络上提供BT文件下载的网站很少,数量大概为几百,常用的信息比较多的BT发布站点更是只有几十个而已。再加上Crawler总是在某个时间段只爬行一个网站,那么一段时间内Detector从Crawler得到的一批URL只来自少数站点的几率非常高。同时,Detector是多线程去下载链接,大概为数百个线程,因此会向同一个网站建立非常多的超文本传输协议(HTTP)请求。根据HTTP 1.0的规范,同一个IP地址对同一个网站的HTTP请求数目是有限的,如果HTTP请求数目超过限制,网站会直接关闭超过限制的HTTP请求。
如何均衡地链接BT种子发布站点,使得Detector在能够开辟尽量多的HTTP请求的同时,又保证每个HTTP请求不被网站关闭,成为BT种子搜索引擎开发中一个重要的技术问题,这个问题直接影响了Detector的爬行效率。要想使得Detector达到高效率,必须开辟上百数千的HTTP和传输控制协议(TCP)请求,以最高效地利用网络带宽。另外,经过测试,CPU速度和内存等已经不是瓶颈,因此HTTP和TCP请求可以根据网络带宽的上限,开的越多越好。这样使得每个Detector并发的效率很高,占用尽量少的服务器,节省运营开支。根据公式:并发量=服务器数量×单台服务器并发量,提高单台服务器并发量,可以节省运营中的服务器数量,减少硬件投资和维护。
解决上述问题不仅需要提高并发连接的HTTP请求数目,还需要保证每个HTTP链接必须成功。这还需要有对于实现方式、扩展方式等的考虑,解决方法应该避免每个Detector和Crawler之间的交互,使得在分布式Detector中可以动态地根据网络流量,增加或减少Detector服务的数目,达到灵活配置的目的。
解决此问题的关键在于平衡BT种子发布站点的请求,因为每个站点只能进行有限的HTTP和TCP连接(10个左右),而Detector为了效率要同时进行上千个HTTP请求,最好的办法就是每次进行的HTTP请求尽量来自不同的BT种子发布站点。因此需要对网站URL进行判断,每次提取尽量分散的URL链接。
现有的一般做法是在内存中建立一个大批量缓存(cache),缓存大批量的URL,在内存中直接进行URL的站点判断,取出符合条件的URL。该方法对服务器的要求非常高,因为搜索引擎Crawler爬行的数据都非常大,最大可以达到T级别,建立大批量缓存需要服务器具有大内存,初步估计需要2G以上的内存才可以满足要求。同时因为Detector占用过多内存,服务器的可用内存会迅速降低,导致服务器几乎被Detector独占,无法进行其他服务。另外,该方案的实际效果并不太好。
也有公司采用HTTP 1.1中的某些高级特性进行规避。在这种方案中,高版本HTTP协议需要BT发布站点的支持。这样会同时要求Detector结构更加复杂,如果BT发布站点不支持的话,此方法会失效。同时由于Detector需要设计更加复杂的结构,很大程度上增加了开发成本。
发明内容
有鉴于此,本发明提出了一种读取网络资源站点信息的方法,用以降低Detector的并发量,并提高效率。本发明的另一个目的是提出一种读取网络资源站点信息的系统,用以降低Detector的并发量,并提高效率。
根据上述目的,本发明提供了一种读取网络资源站点信息的方法,该方法包括以下步骤:
A.将网络资源站点信息进行哈希(hash)计算得到hash值,并将该网络资源站点信息及对应的hash值存入数据库表;
B.初始化hash指针数组;
C.对所述数据库表进行顺序读取,如果顺序读取到一条记录,其对应的hash值在当前hash数组中不存在,则在hash指针数组中加入该hash值,并将对应的指针数组置为0;如果hash指针数组的容量达到预定的上限,则执行步骤D,否则重复执行步骤C;
D.对所述数据库表进行hash读取,如果某个hash值读取的记录为空,则从hash数组中去除该hash值,执行步骤C,否则重复执行步骤D。
进一步,所述网络资源站点信息为BT种子发布站点的URL。
所述对数据库表进行读取后进一步包括:根据所读取的网络资源站点信息建立网络连接。
较佳地,所述hash数组预定的上限为同时建立的网络连接数目的四分之一。
所述数据库表为多表结构。
本发明还提供了一种读取网络资源站点信息的系统,该系统包括:hash值计算模块,用于将网络资源站点信息进行hash计算得到hash值,并将该网络资源站点信息及对应的hash值存入数据库表;存储有数据库表的数据库表模块,其中数据库表用于保存所述网络资源站点信息及其对应的hash值;读取模块,用于初始化hash指针数组,并按以下方式从数据库表中读取网络资源站点的记录:对所述数据库表进行顺序读取,在对数据库表进行顺序读取的过程中,当顺序读取到一条记录且与其对应的hash值在当前hash数组中不存在时,在hash指针数组中加入该hash值并将对应的指针数组置为0,如果hash指针数组的容量达到预定的上限,则对数据库表进行hash读取,否则对数据库表进行顺序读取;在对数据库表进行hash读取的过程中,如果某个hash值读取的记录为空,则从hash数组中去除该hash值,并对数据库表进行顺序读取,否则继续对数据库表进行hash读取。
所述网络资源站点信息为BT种子发布站点的URL。
该系统可以进一步包括网络连接模块,该网络连接模块用于根据所述读取模块读取的网络资源站点信息建立网络连接。
较佳地,所述数据库表采用多表结构。
另外,上述读取网络资源站点信息的系统可以用在各种搜索引擎当中。
从上述方案中可以看出,由于本发明采用海量数据处理、负载平衡、低版本HTTP协议请求(HTTP 1.0)、哈希(hash)算法等技术,提供了一种BT种子搜索引擎平衡下载链接URL的方法及其系统,大幅提高BT种子搜索引擎系统中Detector并行链接网页的数目,平衡下载BT种子发布站点的信息,用低成本解决BT种子搜索引擎Detector并发量和效率问题。相对于现有解决方案,本发明的明显优点是:效果明显,可以完全解决Detector并发量和效率的问题,比其他方案成功率高;具有良好的通用性,采用成熟的HTTP技术,可以适应于所有网站;成本低,不需要对Detector进行复杂设计,从而降低了开发成本。
另外,实验数据表明,根据本发明的模块的综合性能,达到业内同等水平,能满足搜索引擎系统的需要。
附图说明
图1为通用的Detector抓取BT种子连接的方案示意图;
图2为根据本发明实施例的逻辑结构示意图;
图3为根据本发明实施例的流程图。
图4为根据本发明实施例的系统的框图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,以下举实施例对本发明进一步详细说明。
本发明可以用于读取各种网络资源站点信息,在下面的实施例中仅以BT种子发布站点的URL为例,但是本领域技术人员应当理解,本发明并不局限于此。
图1为通用的Detector抓取BT种子连接的方案示意图,而图2为根据本发明实施例的逻辑结构示意图。在图1中,Crawler得到URL后,直接交给Detector,然后Detector建立大量到主页A的网络连接。与图1中所示结构不同,参照图2,根据本发明实施例的系统逻辑结构示意图不仅包括Crawler和Detector,还包括了一个多表数据库(DB)。多表DB是存放Crawler爬行记录的数据库,采用多表设计,对于任何爬行的URL,Crawler都不直接发送到Detector进行处理,而是先对URL的网站信息进行hash计算,将URL和对应的hash值存入数据库。Detector对数据库进行hash平衡读取,并且存入缓存。Detector爬行URL的时候,先从Cache进行平衡读取,如果能够读取不同网站的所有URL,则进行一次爬行。否则从数据库DB进行平衡读取。这里因为是对网站建立hash,进行BT网站的平衡下载,有可能出现hash冲突。考虑到hash冲突的可能性,当hash冲突的时候,得到的URL从同一个hash值来的,可能来自不同的发布站点。此时可以直接按照同一个站点的情况进行处理。可能出现的最坏情况是导致链接不成功。但是根据概率和影响来说,在如此小的概率下,HTTP链接不成功对结果是不会有任何影响的。
首先描述Crawler进行URL在数据库的多表存放。考虑到大量数据(甚至海量数据)的影响,在DB中进行多表设计,设计一定容量的表格(比如如果考虑到2亿的容量,可以设计分属不同数据库的200个表),对Crawler爬行的URL结果,不直接送入Detector处理,为了达到平衡下载的效果,计算每个URL的网站信息。URL是以字符串形式存在的,网站信息也是URL的一部分,如果单纯地比较字符串是否相同会导致判断效率非常低。一般的做法是将URL字符串以某种哈希算法计算成一个32位的哈希数,并且认为哈希数相同的URL,其字符串形式也相同。由于32位哈希数空间范围为0到4.1亿,有效的BT种子网站URL大概在一万以内。所以上述例外情况从概率学上可以忽略。问题转换成为如何在已有的URL的Hosthash中平衡下载。
下面描述本发明实施例的方法中对数据库表的平衡读取。Detector对已有的记录,分析hash的组合(可以用数据库特性查询得到),然后进行顺序读取和hash读取两种方式进行URL读取。重点保证Detector取得的URL尽量来自不同的站点。Detector同时维护一个hash的内存数组,对得到的记录存放hash缓存,然后按照hash缓存的记录进行hash读取,直到某个hash值从数据库读取不到记录为止,此时从hash数组中把此hash值删除掉,再找寻新的hash值。
采用此方法进行跨表的hash读取也可以读取到比较平衡的URL记录。当hash数组的值设定为Detector同时链接数目1/4的时候,能够达到比较好的效果,例如假设Detector开启1000个链接,那么hash数组为250的时候,能够达到比较好的效果。
图3为根据本发明实施例的流程图。参照图3,本发明实施例中Detector端方法的流程如下:
步骤101,对于从Crawler传来的URL,Detector不直接进行处理,而是根据hash计算其hash值,并将URL和对应的hash值存入数据库表。Detector将所维护的哈希指针数组初始化为空。Detector启动,转到步骤102。
步骤102,判断hash数组的容量是否达到预定的上限,如果是则执行步骤110,进行完全的hash读取,否则执行步骤103。
步骤103,Detector对数据库表进行hash读取。进一步,根据所读取的URL建立网络连接,进行相关操作。
步骤104,判断当前hash值读取的记录是否为空,如果是,则执行步骤105,否则执行步骤106。
步骤105,将该hash值从hash数组中删除。
步骤106,对数据库表进行顺序读取。进一步,根据所读取的URL建立网络连接,进行相关操作。
步骤107,判断数据库表中是否无记录,如果是,则结束流程,否则执行步骤108。
步骤108,对于所顺序读取到的记录,判断其对应的hash值在当前hash数组中是否存在,即判断是否有新的hash值,如果有新的hash值,则执行步骤109,否则执行步骤103。
步骤109,将上述新的hash值插入hash数组,然后执行步骤102。
另一方面,步骤110,Detector对数据库表进行hash读取。进一步,根据所读取的URL建立网络连接,进行相关操作。
步骤111,判断当前hash值读取的记录是否为空,如果是,则执行步骤112,否则执行步骤110。
步骤112,将该hash值从hash数组中删除,然后执行步骤102。
上述读取方法可以通过如图4所示的读取网络资源站点信息的系统来实现。
参照图4,该系统包括hash值计算模块、数据库表模块和读取模块,还可以进一步包括网络连接模块。该系统可以用在各种搜索引擎当中。
在该系统中,首先由hash值计算模块将从Crawler传出的URL进行hash计算得到hash值,并将该URL及对应的hash值存入数据库表。数据库表模块存储有数据库表,数据库表用于保存上述URL及与其对应的hash值,并且数据库表可以优选地使用多表结构。
读取模块利用上述方法从数据库表中读取URL,简单地说就是:对所述数据库表进行顺序读取,在对数据库表进行顺序读取的过程中,当顺序读取到一条记录且与其对应的hash值在当前hash数组中不存在时,在hash指针数组中加入该hash值并将对应的指针数组置为0;如果hash指针数组的容量达到预定的上限,则对数据库表进行hash读取,否则顺序读取下一条记录;在对数据库表进行hash读取的过程中,如果某个hash值读取的记录为空,则从hash数组中去除该hash值,并对数据库表进行顺序读取,否则继续对数据库表进行hash读取。
另外,网络连接模块可以根据读取模块读取的URL建立网络连接,进行相关操作。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。