用于下载网站数据的分布式方法和系统的制作方法

文档序号:6503256阅读:176来源:国知局
用于下载网站数据的分布式方法和系统的制作方法
【专利摘要】本发明提供了用于下载网站数据的分布式方法和系统。该方法包括以下步骤:设定一个或多个下载组;在数据库中针对每个下载组维护相应的网站列表;一个或多个下载模块中的每个下载模块根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列;以及所述每个下载模块根据所述一个或多个下载队列来进行下载。
【专利说明】用于下载网站数据的分布式方法和系统
【技术领域】
[0001]本发明总体上涉及分布式数据下载,更具体地涉及用于下载网站数据的分布式方法和系统。
【背景技术】
[0002]在当今的搜索引擎领域中,为了更快速有效地对互联网上的网页进行搜索,通常需要由搜索引擎提供商来预先从各个网站上抓取/爬取/下载(在下文中,这些术语可作为同义词互换使用)各种网页/应用程序/音频/视频等并进行分析。为了实现该网页抓取,不可避免地要用到各种网页抓取程序(也被称为网络爬虫、网络蜘蛛等,下文中统称为网络爬虫)。
[0003]现有的网络爬虫一般由一些起始地址开始下载网页,然后通过解析所下载的页面内容来决定后续爬取的页面。通常需要在爬虫程序内实现一个爬取队列,用于存放起始地址与解析出来的后续爬取地址。此外,还需要实现一个用于存放下载过的页面地址的去重过滤器,以避免重复爬取。
[0004]与单机的爬虫程序相比,可同时部署在多个节点上的分布式网络爬虫在计算机硬件资源和/或网络带宽资源的使用以及与ip、地域有关问题的处理上能够更加灵活。现有的分布式网络爬虫通常通过共享爬取队列和去重过滤器来实现。
[0005]然而,现有的爬虫系统至少存在以下问题:(1)不支持使用不同的下载配置来下载不同类型的数据;(2)其去重过滤器不支持有效期,即,其不支持对一些会更新的网页进行重复爬取;(3)不支持对爬取规则的设定以及对JavaScript (下文中简称为JS)的分析。
[0006]此外,现有的分布式爬虫系统还至少存在以下问题:(I)难以统一部署和配置,由于分布式爬虫系统通常部署在多台计算机上,因此对各个爬虫节点(模块)进行集中管理和统一配置非常困难。特别地,在需要对多个网站进行爬取的时候,常常需要在开始、停止爬取网站时登录爬虫服务器,进行修改配置、启动/停止相关进程等操作。当网站数量较大时,这些过程变得非常繁琐且容易出错;(2)难以设置针对特定网站的整体爬取间隔,通常需要控制网络爬虫对网站的访问间隔,以避免影响网站正常运转,减少对网站造成太大的负担,然而现有技术仅能在单个爬虫程序上对自身的爬取间隔进行限制,无法将所有分布式爬虫节点作为一个整体来进行控制,换言之,尽管可以限制单个爬虫对同一网站的各自的访问频率,但是难以避免出现很多爬虫同时或几乎同时访问该同一网站的情况,在该情况下,网站的正常运转受到了突发访问高峰的干扰,严重时有可能使网站宕机或下线;以及
(3)难以收集统计信息,无法直接获得分布式爬虫的总体统计信息,通常需要另外搭建一套日志系统来实现此功能。

【发明内容】

[0007]因此,本发明提供了至少解决上述技术问题的用于下载网站数据的分布式方法和系统。[0008]具体地,根据本发明的第一方案,提供了一种用于下载网站数据的分布式方法。该方法包括以下步骤:a)读取起始地址列表中的一个或多个地址,并将所述一个或多个地址存入在数据库中维护的多个下载队列中的至少一个下载队列,其中,所述多个下载队列至少包括第一下载队列和第二下载队列,且各个下载队列对应于不同类型的数据;b)根据所述多个下载队列来分别下载多个类型的数据;c)从根据所述第一下载队列下载的数据中解析出要下载的后续地址;d)判断所述后续地址属于哪个下载队列;e)根据步骤d)中的判断结果,将所述后续地址存入相应下载队列中;以及f)重复上述步骤b)至e),直到满足预定条件为止。
[0009]在一些实施例中,步骤b)包括:按照在所述数据库中集中维护的针对各个网站的下载间隔,根据相应下载队列中的记录,从相应网站下载数据。
[0010]在一些实施例中,所述第一下载队列是网页下载队列,以及所述第二下载队列是应用下载队列。
[0011]在一些实施例中,针对每个要下载的网站,预定义由多个下载模块统一使用的、并针对所述网站的不同页面类型单独规定的一条或多条爬取规则。
[0012]在一些实施例中,步骤d)包括:当所述爬取规则包括指示所述后续地址的类型的第一属性时,根据所述第一属性来判断所述后续地址属于哪个下载队列。
[0013]在一些实施例中,步骤d)还包括:当所述爬取规则不包括指示所述后续地址的类型的第一属性时,判断所述后续地址属于第二下载队列。
[0014]在一些实施例中,步骤e)包括:进一步判断所述后续地址是否满足由所述爬取规则中的第二属性所定义的正则表达式,如果满足所述正则表达式,则将作为所述后续地址与所述正则表达式匹配的结果的各字符串拼接为要存入相应下载队列中的地址,否则跳过所述后续地址。
[0015]在一些实施例中,步骤c)包括:根据所述爬取规则中用于描述后续地址的字符串构成特征的第三属性,从下载的数据中解析出要下载的后续地址。
[0016]在一些实施例中,所述第三属性是xpath表达式。
[0017]在一些实施例中,步骤b)包括:从第一下载队列中读取一条记录;使用在所述数据库中维护的第一去重列表,对所述记录进行去重;以及根据所述记录来下载相应数据。
[0018]在一些实施例中,对所述记录进行去重的步骤包括:当确定所述记录与所述第一去重列表中的记录匹配时,跳过所述记录并从所述第一下载队列中读取下一条记录。
[0019]在一些实施例中,在步骤e)之前,所述方法还包括以下步骤:使用所述记录中的地址来更新所述第一去重列表;以及步骤e)包括:在所述后续地址属于所述第一下载队列的情况下,使用更新后的所述第一去重列表对所述后续地址去重,并将其存入所述第一下载队列;以及在所述后续地址属于所述第二下载队列的情况下,使用在所述数据库中维护的第二去重列表对所述后续地址去重,相应更新所述第二去重列表,并将其存入所述第二下载队列。
[0020]在一些实施例中,步骤b)包括:按优先级从所述第二下载队列中读取待下载地址;使用在所述数据库中维护的第三去重列表对所述待下载地址进行去重;对由所述待下载地址指向的数据进行下载;以及更新所述第三去重列表。
[0021]在一些实施例中,步骤b)还包括:对已下载的数据进行检查;计算已下载的数据的数字摘要;基于所述数字摘要,使用在所述数据库中维护的第四去重列表对已下载的数据进行去重;更新所述第四去重列表;以及将所述已下载的数据存入文件系统中。
[0022]在一些实施例中,所述第一去重列表、所述第二去重列表和所述第三去重列表中的每条记录均包括有效期,当使用各个去重列表对相应地址进行去重并且在去重列表中存在与相应地址匹配的记录时,所述方法包括以下步骤:判断所述记录的有效期是否已到期,如果已到期,则不对相应地址进行去重,如果未到期,则对相应地址进行去重。
[0023]在一些实施例中,所述爬取规则还包括第四属性,当所述第四属性的值为“真”时,通过记录对包括所述第四属性在内的所述爬取规则的使用的次数,来识别当前下载的链接在相应网站的应用列表的第几页上。
[0024]在一些实施例中,在更新所述第一去重列表、所述第二去重列表或所述第三去重列表时,在当前下载的链接在应用列表的预定页数的页面上的情况下,与当前下载的链接在应用列表的预定页数之后的页面上的情况下相比,将去重列表中对应记录的有效期设置为更大。
[0025]在一些实施例中,所述预定页数小于等于5页。
[0026]在一些实施例中,由所述数据库来提供与网站数据下载相关的统计信息。
[0027]在一些实施例中,所述统计信息包括以下一项或多项:所述多个下载队列的当前长度、指定时间段内各个去重列表的长度、或各个去重列表的总长度。
[0028]在一些实施例中,所述数据库是key-value型数据库。
[0029]在一些实施例中,所述数据库是Redi s数据库。
[0030]在一些实施例中,所述预定条件是所有下载队列为空、达到预定爬取深度、或二者的组合。
[0031]根据本发明的第二方面,提供了一种用于下载网站数据的分布式系统。该系统包括:控制器,读取起始地址列表中的一个或多个地址,并将所述一个或多个地址存入在数据库中维护的多个下载队列中的至少一个下载队列;数据库,用于维护多个下载队列,其中,所述多个下载队列至少包括第一下载队列和第二下载队列,且各个下载队列对应于不同类型的数据;多个下载模块,用于根据所述多个下载队列来分别下载多个类型的数据,从根据所述第一下载队列下载的数据中解析出要下载的后续地址,判断所述后续地址属于哪个下载队列,根据所述判断的结果,将所述后续地址存入相应下载队列中;以及重复上述过程,直到满足预定条件为止。
[0032]在一些实施例中,所述多个下载模块被进一步配置为:按照在所述数据库中集中维护的针对各个网站的下载间隔,根据相应下载队列中的记录,从相应网站下载数据。
[0033]在一些实施例中,所述第一下载队列是网页下载队列,以及所述第二下载队列是应用下载队列。
[0034]在一些实施例中,针对每个要下载的网站,预定义由多个下载模块统一使用的、并针对所述网站的不同页面类型单独规定的一条或多条爬取规则。
[0035]在一些实施例中,所述下载模块被配置为:当所述爬取规则包括指示所述后续地址的类型的第一属性时,根据所述第一属性来判断所述后续地址属于哪个下载队列。
[0036]在一些实施例中,所述下载模块还被配置为:当所述爬取规则不包括指示所述后续地址的类型的第一属性时,判断所述后续地址属于第二下载队列。[0037]在一些实施例中,所述下载模块被配置为:进一步判断所述后续地址是否满足由所述爬取规则中的第二属性所定义的正则表达式,如果满足所述正则表达式,则将作为所述后续地址与所述正则表达式匹配的结果的各字符串拼接为要存入相应下载队列中的地址,否则跳过所述后续地址。
[0038]在一些实施例中,所述下载模块被配置为:根据所述爬取规则中用于描述后续地址的字符串构成特征的第三属性,从下载的数据中解析出要下载的后续地址。
[0039]在一些实施例中,所述第三属性是xpath表达式。
[0040]在一些实施例中,所述下载模块被配置为:从第一下载队列中读取一条记录;使用在所述数据库中维护的第一去重列表,对所述记录进行去重;以及根据所述记录来下载相应数据。
[0041]在一些实施例中,所述下载模块还被配置为:当确定所述记录与所述第一去重列表中的记录匹配时,跳过所述记录并从所述第一下载队列中读取下一条记录。
[0042]在一些实施例中,所述下载模块被配置为:使用所述记录中的地址来更新所述第一去重列表;在所述后续地址属于所述第一下载队列的情况下,使用更新后的所述第一去重列表对所述后续地址去重,并将其存入所述第一下载队列;以及在所述后续地址属于所述第二下载队列的情况下,使用在所述数据库中维护的第二去重列表对所述后续地址去重,相应更新所述第二去重列表,并将其存入所述第二下载队列。
[0043]在一些实施例中,所述下载模块还被配置为:按优先级从所述第二下载队列中读取待下载地址;使用在所述数据库中维护的第三去重列表对所述待下载地址进行去重;对由所述待下载地址指向的数据进行下载;以及更新所述第三去重列表。
[0044]在一些实施例中,所述下载模块还被配置为:对已下载的数据进行检查;计算已下载的数据的数字摘要;基于所述数字摘要,使用在所述数据库中维护的第四去重列表对已下载的数据进行去重;更新所述第四去重列表;以及将所述已下载的数据存入文件系统中。
[0045]在一些实施例中,所述第一去重列表、所述第二去重列表和所述第三去重列表中的每条记录均包括有效期,当使用各个去重列表对相应地址进行去重并且在去重列表中存在与相应地址匹配的记录时,所述下载模块还被配置为:
[0046]判断所述记录的有效期是否已到期,如果已到期,则不对相应地址进行去重,如果未到期,则对相应地址进行去重。
[0047]在一些实施例中,所述爬取规则还包括第四属性,当所述第四属性的值为“真”时,通过记录对包括所述第四属性在内的所述爬取规则的使用的次数,来识别当前下载的链接在相应网站的应用列表的第几页上。
[0048]在一些实施例中,在更新所述第一去重列表、所述第二去重列表或所述第三去重列表时,在当前下载的链接在应用列表的预定页数的页面上的情况下,与当前下载的链接在应用列表的预定页数之后的页面上的情况下相比,所述下载模块将去重列表中对应记录的有效期设置为更大。
[0049]在一些实施例中,所述预定页数小于等于5页。
[0050]在一些实施例中,由所述数据库来提供与网站数据下载相关的统计信息。
[0051]在一些实施例中,所述统计信息包括以下一项或多项:所述多个下载队列的当前长度、指定时间段内各个去重列表的长度、或各个去重列表的总长度。
[0052]在一些实施例中,所述数据库是key-value型数据库。
[0053]在一些实施例中,所述数据库是Redis数据库。
[0054]在一些实施例中,所述预定条件是所有下载队列为空、达到预定爬取深度、或二者的组合。
[0055]根据本发明的第三方面,提供了一种用于下载网站数据的分布式方法。该方法包括以下步骤:设定一个或多个下载组,在数据库中针对每个下载组维护相应的网站列表;一个或多个下载模块中的每个下载模块根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列;以及所述每个下载模块根据所述一个或多个下载队列来进行下载。
[0056]在一些实施例中,通过在启动所述下载模块时指定组名,将所述下载模块和与所述组名相关联的下载组相关联。
[0057]在一些实施例中,当在启动所述下载模块时未指定组名时,将所述下载模块与缺省下载组相关联。
[0058]在一些实施例中,所述网站列表中的记录均具有下次下载时间项,以及下载模块根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列的步骤还包括:所述下载模块仅获取下次下载时间项的值小于当前时间的记录来获取相应网站的一个或多个下载队列。
[0059]在一些实施例中,所述一个或多个下载模块至少包括第一下载模块和第二下载模块,以及在获得网站列表的同时如下更新所述下次下载时间项的值:针对所述第一下载模块,所述下次下载时间项的值等于当前时间与爬取间隔之和;以及针对所述第二下载模块,所述下次下载时间项的值等于当前时间、下载超时时间、以及下载间隔之和。
[0060]在一些实施例中,所述爬取间隔是2秒。
[0061]在一些实施例中,所述下载间隔是10秒。
[0062]在一些实施例中,针对所述第二下载模块,在完成下载之后,使用当前时间与下载间隔之和再次更新所述下次下载时间项。
[0063]在一些实施例中,所述第一下载模块以固定时间间隔来获取网站列表。
[0064]在一些实施例中,所述第二下载模块在预定事件发生时获取网站列表,同时也以固定时间间隔来获取网站列表。
[0065]在一些实施例中,通过向网站列表中插入/移除记录来控制针对相应网站的下载
的启动/停止。
[0066]在一些实施例中,该方法还包括:根据网站的结构设置爬取规则;根据所述爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据;检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题;在确认数据正常之后,清除所述测试专用组;以及在目标组中正式启动相应下载模块来下载所述网站的数据。
[0067]在一些实施例中,该方法还包括:查询统计信息,检查是否存在网站数据的下载异常;如果存在异常,则停止发生异常的下载;根据针对下载异常的网站的爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据;检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题;在确认数据正常之后,清除所述测试专用组;以及正式启动和与下载异常的网站相对应的下载组相关联的下载模块来重新下载所述网站的数据。
[0068]在一些实施例中,所述当前时间以所述数据库中的时间为准。
[0069]在一些实施例中,所述方法还包括:如果针对下载队列中的地址下载失败,则将所述地址以较低优先级置回所述下载队列中,以便重新调度下载。
[0070]根据本发明的第四方面,提供了一种用于下载网站数据的分布式系统。该系统包括:控制器,用于设定一个或多个下载组,数据库,用于针对每个下载组来维护相应的网站列表;以及一个或多个下载模块,每个下载模块用于根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列,以及根据所述一个或多个下载队列来进行下载。
[0071 ] 在一些实施例中,通过在启动所述下载模块时指定组名,将所述下载模块和与所述组名相关联的下载组相关联。
[0072]在一些实施例中,当在启动所述下载模块时未指定组名时,将所述下载模块与缺省下载组相关联。
[0073]在一些实施例中,所述网站列表中的记录均具有下次下载时间项,以及所述下载模块还被配置为:仅获取下次下载时间项的值小于当前时间的记录来获取相应网站的一个或多个下载队列。
[0074]在一些实施例中,所述一个或多个下载模块至少包括第一下载模块和第二下载模块,以及在获得网站列表的同时如下更新所述下次下载时间项的值:针对所述第一下载模块,所述下次下载时间项的值等于当前时间与爬取间隔之和;以及针对所述第二下载模块,所述下次下载时间项的值等于当前时间、下载超时时间、以及下载间隔之和。
[0075]在一些实施例中,所述爬取间隔是2秒。
[0076]在一些实施例中,所述下载间隔是10秒。
[0077]在一些实施例中,针对所述第二下载模块,在完成下载之后,使用当前时间与下载间隔之和再次更新所述下次下载时间项。
[0078]在一些实施例中,所述第一下载模块以固定时间间隔来获取网站列表。
[0079]在一些实施例中,所述第二下载模块在预定事件发生时获取网站列表,同时也以固定时间间隔来获取网站列表。
[0080]在一些实施例中,所述控制器通过向网站列表中插入/移除记录来控制针对相应网站的下载的启动/停止。
[0081]在一些实施例中,通过以下方式来部署针对网站的爬取规则:根据网站的结构设置爬取规则;根据所述爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据;检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题;在确认数据正常之后,清除所述测试专用组;以及在目标组中正式启动相应下载模块来下载所述网站的数据。
[0082]在一些实施例中,通过以下方式来调整针对网站的爬取规则:查询统计信息,检查是否存在网站数据的下载异常;如果存在异常,则停止发生异常的下载;根据针对下载异常的网站的爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据;检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题;在确认数据正常之后,清除所述测试专用组;以及正式启动和与下载异常的网站相对应的下载组相关联的下载模块来重新下载所述网站的数据。
[0083]在一些实施例中,所述当前时间以所述数据库中的时间为准。
[0084]在一些实施例中,所述下载模块还被配置为:如果针对下载队列中的地址下载失败,则将所述地址以较低优先级置回所述下载队列中,以便重新调度下载。
[0085]通过使用本发明提供的方法和系统,可以按照要获取的数据的类型,例如(但不限于):网页文件(例如,111:1111、1111:1111、8111:1111等等)、应用程序(例如,在Windows平台上运行的exe文件、针对Android系统的apk应用程序包等)、文档文件(例如,WORD文件、PDF文件等)、动态图像文件(例如,AVI文件、MP4文件等等)、静态图像文件(例如,JPG文件、BMP文件等等)、音频文件(MP3、WMA等等)、以及其他各种数据类型(例如,Flash等等),由爬虫(下载器)采用不同的下载和处理流程来进行处理。充分利用了这些不同类型数据在处理器/存储器资源和/或网络资源等方面上的不同特性。
[0086]此外,通过使用本发明提供的方法和系统,可以提供针对去重列表中任意记录的有效期,使得对一些可能会更新的网页的重复爬取成为可能。
[0087]此外,通过使用本发明提供的方法和系统,可以通过使用xpath表达式和正则表达式,在很大程度上处理了网页文件中以JS格式表达的网络地址的问题。
[0088]此外,通过使用本发明提供的方法和系统,支持由多个爬虫模块统一使用的、并针对不同页面类型单独提供的爬取规则,使得在简化了对多个爬虫模块的爬取规则的维护的同时,让爬取规则支持更为复杂的设置,以更方便地针对各个网站来设计爬取规则。特别地,通过让爬取规则支持翻页规则,使得用户可以针对不同页数来采取不同的爬取策略和更新去重列表的策略。
[0089]此外,通过使用本发明提供的方法和系统,借助专门的控制器和数据库来操作爬虫模块,包括:启动/停止/查看状态/修改配置等等,而无需在部署各个爬虫模块的节点上分别进行操作。
[0090]此外,通过使用本发明提供的方法和系统,借助数据库中统一维护的针对各个爬取/下载组维护的列表,可以对所有爬虫(下载器)的针对某一个网站的爬取间隔进行限制。此外,借助数据库中统一维护的爬取队列,支持多个分布式爬虫采用相同的爬取队列。
[0091]此外,通过使用本发明提供的方法和系统,借助针对数据库中维护的各个列表/队列的统计功能,可以获取相关统计信息,包括(但不限于):当前爬取队列/下载队列大小、以及总体/特定时间段内的爬取页面数/解析下载链接数/下载数/新文件数等。
[0092]换言之,通过使用本发明提供的方法和系统,可以解决或至少减轻现有技术所具有的前述技术问题。
【专利附图】

【附图说明】
[0093]通过下面结合【专利附图】
附图
【附图说明】本发明的优选实施例,将使本发明的上述及其它目的、特征和优点更加清楚,其中:
[0094]图1示出了根据本发明的实施例的用于下载网站数据的示例分布式系统的简化框图;[0095]图2示出了在图1所示的数据库中维护的一些示例数据结构的示意图;
[0096]图3?9示出了根据本发明的实施例的用于设计示例爬取规则的示例过程的屏幕截图;
[0097]图10示出了根据本发明的实施例的用于下载网站数据的分布式方法的示例的爬取部分的流程图;以及
[0098]图11示出了根据本发明的实施例的用于下载网站数据的分布式方法的示例的下载部分的流程图。
[0099]在本发明的所有附图中,相同或相似的结构均以相同或相似的附图标记来标识。【具体实施方式】
[0100]下面参照附图对本发明的优选实施例进行详细说明,在描述过程中省略了对于本发明来说是不必要的细节和功能,以防止对本发明的理解造成混淆。以下,将结合特定的实施例来详细描述本发明的方法和系统。但是本领域技术人员应当理解:以下描述的各个特定实施例并不限制本发明的范围;相反地,应当将这些特定实施例理解为被包括在由所附权利要求限定的本发明的精神和范围中,且本领域技术人员可以在不脱离由所附权利要求限定的本发明的精神和范围的情况下,对本发明做出各种修改、添加、删除、或替换。
[0101]首先,参见图1,其示出了根据本发明的实施例的用于下载网站数据的示例分布式系统10的简化框图。分布式系统10包括:控制器110、数据库120、多个爬虫130_1?130_N (N代表爬虫的数目)、以及多个下载器140_1?140_M(M代表下载器的数目)。控制器110与数据库120相连,且数据库120与各个爬虫130_1?130_N和各个下载器140_1?140_M相连,形成以数据库120为中心的星型拓扑结构,进而控制器110可以通过数据库120来控制各个爬虫130_1?130_N和各个下载器140_1?140_M,且各个爬虫130_1?130_N和各个下载器140_1?140_11可以通过数据库120向控制器110反馈各种信息。当然,在另一些实施例中,控制器110可以与各个爬虫130_1?130_N和各个下载器140_1?140_M直接相连并通信。
[0102]在本实施例中,数据库120是key-value型数据库,更优选地,是Redis数据库。当然,数据库120也可以是其它key-value型数据库,例如(但不限于):Berkeley DB、MemCacheDB> BigTable> Dynamo> Tokyo Cabinet 等等。此外,数据库 120 也可以是其它非key-value 型数据库,例如(但不限于):MySQL> Microsoft SQL、Oracle RDBMS 等。
[0103]然而,与传统的关系型数据库相比,key-value型数据库能够提供更高的查询速度、更大的数据容量、更高的并发数、更适合通过主键进行查询,因此优选地使用key-value型数据库为本发明的各个模块提供队列/列表/配置/数据文件的存储和管理等等。此夕卜,由于Redis数据库提供了多种数据结构(包括字符串(string)、双向链表(list)、集合(set)、以及有序集合(zset)),因此其与其它key-value型数据库相比,更适于实现本发明的方法和系统。在下文中将描述通过这些数据结构,特别是有序集合(zset),来实现根据本发明的实施例的在数据库120中存储的各种数据结构。
[0104]为了方便对下文的理解,下面简要介绍一下zset的结构。zset是一个集合类的数据结构,其中每个元素均额外具有一个顺序属性(z值,又被称为score值)。可以在添加或修改元素的时候指定这一属性。每次指定后,zset会自动按新的z值来重新调整zset中各元素的顺序。可以跟据Z值指定的顺序,以很高的效率对zset中的元素进行存取。更多细节可以参考 zset 的使用说明:http://redis.1o/commands#sorted_set。
[0105]现在,返回图1,将继续描述分布式系统10。在本实施例中,分布式系统10主要用于对指定网站的网页和在网页中提供的应用程序进行下载,并对下载到的网页进行分析,从中提取出可供后续下载的网页和/或应用程序的地址。在另一示例中,分布式系统10也可以用于对其他类型的数据进行下载,例如对网页和在网页中提供的视频进行下载、分析等。在另一示例中,分布式系统10也可以用于对一种或三种以上的数据(例如,网页、应用程序、音频等)进行下载、分析等。
[0106]在分布式系统10中,控制器110通过数据库120提供的数据库接口来处理在数据库120中维护的各个数据结构等,从而间接地控制各个爬虫130_1~130_N和各个下载器140_1 ~140_M。
[0107]在本实施例中,爬虫130_1~130_N和下载器140_1~140_M是基于开源爬虫框架scrapyl.6开发的,但本发明的实施例不限于此,也可以使用其它爬虫程序。
[0108]因此,在图1所示的分布式系统10中,各个模块的主要功能和使用方式如表1所示。
[0109]
模块名称模块的主要功能使用方式
数据库120 存储关键数据,为分布式系统一直运行
10中各模块间协调工作所需的
_数据结构提供载体__
控制器110更新网站配置,启动、停止网站需要查看、调整
爬取,同时也提供一些查看爬虫爬虫状态时由
和下载器状态信息等工具的命管理员使用
__令接口__
爬虫爬取,解析网页,获取下载链接一直运行
130—I~130—N
下癥器根据爬虫获取的下载链接来下一直运行 140_1~140_M I载应用程序__
[0110]表1
[0111]根据表1,可以看到,分布式系统10以数据库120为流程控制的核心,系统的各模块间相互独立,通过操作数据库120来交换信息。
[0112]接下来,将参照图2来说明在数据库120中维护的用于协调和控制各个爬虫130_1~130_N和各个下载器140_1~140_M的列表和队列的具体示例。参见图2,在数据库120中维护了以下数据结构:针对每个要下载的网站的爬取队列(第一下载队列)121_1~121_L(L代表要下载的网站数目,下同)和下载队列(第二下载队列)122_1~122_L、针对每个要下载的网站的爬虫去重列表(第一去重列表)123_1~123_L、解析去重列表(第二去重列表)124_1~124_L、下载去重列表(第二去重列表)125_1~125_1^和文件去重列表(第四去重列表)126_1~126_L、针对每个要下载的网站的起始地址列表127_1~127_L、针对每个爬取/下载组的访问限制列表128_1?128_P(P代表爬取/下载组的数目)、针对网页的每个类型的类型配置列表129_1?129_Q(Q代表网页类型的数目)、针对每个网站的网站配置列表130_1?130_L、以及针对每个类型配置列表和网站配置列表的配置更新列表 131。
[0113]接下来,将详细描述上述每个数据结构的格式以及用途。
[0114](I)针对每个要下载的网站的爬取队列121_1?121_L和下载队列122_1?122_L
[0115]针对每个需要爬取的网站,在数据库120中各自维护一个爬取队列和一个下载队列,其用于保存待爬取/下载的网络地址。这两个队列均采用zset实现,这两个队列的键名可以分别通过“craWl_queue_”+ “网站名”和“d0Wn_queue_” + “网站名”来指定。队列中每个成员(待处理地址)对应的z值为相应网络地址的抓取优先级(以下简称优先级)的负值。通过获取集合中z值最小的元素(通过zrange命令),即可取得队列中优先级最高的成员。
[0116](2)针对每个要下载的网站的爬虫去重列表123_1?123_L、解析去重列表124_1?124_L、下载去重列表125_1?125_L和文件去重列表126_1?126_L
[0117]针对每个需要爬取的网站,在数据库120中维护了上述多种去重列表。这些去重列表均采用zset实现,键名通过“预设字符串”+ “网站名”这种方式来指定(不同的去重列表采用不同的预设字符串)。去重列表中每个成员对应的z值为对应元素上次被处理时的时间戳。
[0118]对于不存在有效期(B卩,不需要重复爬取)的地址,通过判断列表中是否存在该元素(zrank命令)即可判断该元素是否重复。对于存在有效期的地址,通过zscore方法获取对应元素的z值,然后判断该时间戳+有效期是否大于当前时间,即可判断出该元素是否重复,在后文中将详细描述。
[0119]zset数据结构支持查询特定z值落在特定区间内的所有元素(通过zrangebyscore命令)。控制器110获取爬虫系统的统计信息时利用了该特性,在后文中将详细描述。
[0120]此外,由于分布式系统中各模块所在计算机的本地时间之间通常存在偏移量,为了保证与时间戳相关的流程的正常工作,分布式系统10可以统一采用数据库120所在的计算机上提供的时间作为基准值。各模块第一次获取时间时通过数据库120的数据库接口获取服务器系统时间(例如,通过time命令),并记录下该时间与自身系统时间的差值。之后每次需要使用时间戳时均通过获取自身系统时间(例如,通过命令time, time O),并加上记录下的差值作为实际时间。
[0121]当然,这只是一个可行的方式,并不意味着本发明受限于此。实际上,在各模块之间进行时间同步的方式还有很多,例如通过NTP(网络时间协议)在各服务器之间进行时间同步等。在下文中,为了说明的简单,假定各模块之间的时间是同步的,且因此不需要考虑时间同步的问题。
[0122](3)针对每个要下载的网站的起始地址列表127_1?127_L
[0123]针对每个需要爬取的网站,在数据库120中维护一个对应的起始地址列表。该列表采用zset实现,键名为“start_url_”+“网站名”。起始地址列表中每个成员对应的z值为该地址下次可被推入爬取队列的最小时间。爬虫(或控制器或任何其他模块)以固定或可变时间间隔从该列表中取出Z值小于当前时间(zrangebyscore命令)的成员,将其推入爬取队列,并将起始地址列表中对应项的z值更新为当前时间+有效期。
[0124](4)针对每个爬取/下载组的访问限制列表128_1?128_P
[0125]可以将要下载的一个或多个网站进行分组,将它们分为爬取/下载组。针对每个爬取/下载组,在数据库120中维护一个对应的列表。该列表采用zset实现,键名分别为“crawl_group_” + “网站名”与“down_group_” + “网站名”。列表内各成员对应的z值为该网站允许下一次爬取/下载的时间。爬虫/下载器通过查询其所在的爬取/下载组的访问限制列表中的z值小于当前时间(通过例如zrangebyscore命令)的成员,即可取得需要爬取/下载的网站名称。通过该访问限制列表,可以针对不同的爬取/下载组来分别设置各自组针对特定网站的访问频率,从而更灵活有效地控制各个爬虫/下载器。
[0126](5)针对网页的每个类型的类型配置列表129_1?129_Q、针对每个网站的网站配置列表130_1?130_L
[0127]针对每个类型配置/网站配置,在数据库120中维护一个String类型的值,其键名分别为“type_COnfig_”+ “类型名”与“spider_COnfig_” + “网站名”,内容为配置文件中对应xml节点的字符串形式,下文将详细描述。
[0128](6)针对每个类型配置列表和网站配置列表的配置更新列表131
[0129]该列表用于存放配置的更新信息,当已存在的类型配置/网站配置发生变化后,相应的信息将被存入该列表中,以通知各模块进行更新。该列表采用zset实现,键名为“config_update_list”。其成员为已更新的配置文件在数据库120中对应的键名,z值为更新时间。系统任意模块启动后,均会记录下启动时间作为最后更新时间。之后每隔一段固定时间(1000秒)检查一次该列表。若存在更新时间(z值)大于程序最后更新时间的成员,即将该成员对应的配置重新读入更新。检查完该列表后,将最后更新时间设置为当前时间,以避免重复更新。
[0130]此外,上述所有列表/队列的键名的命名规则不限于上述示例给出的字符串,其也可以是用于区别队列/列表的其他字符串。
[0131]接下来,将参照图3?9来详细描述用于设计示例爬取规则的示例过程。在本发明中,爬取规则用于指导爬虫(模块)如何爬取网站并解析出后续爬取/下载地址。在本示例中,针对软件下载类网站的特点,本系统通过将网页分类,对不同类型的页面采用不同的爬取规则进行爬取。当然,也可以针对其他类型的网站的特点对爬取规则进行设计,本发明不限于此。爬取规则主要通过xpath表达式来指定,并可使用正则表达式来过滤一些不希望爬取的页面。
[0132]具体地,在本实施例中,使用Firefox浏览器的Firebug插件以及Firepath插件来演示如何设计爬取规则的示例。当然也可以使用其他浏览器的其他xpath相关插件或使用其他开发界面或调试工具来演示设计爬取规则的过程。此外,在本实施例中,针对单一网站(“安极市场”)来设计爬取规则,但应当理解:也可以针对一个或多个网站来类似地设计爬取规则,只要其能实现相同的目的即可。
[0133]首先以网站“安极市场”为例,通常如下所述得到爬取规则。参见图3,爬虫从起始页http://apk.angeeks.com开始抓取页面,并将该页面的页面类型定义为“home”。通过基于xpath语法的表达式
[0134]//dd[iid vtit' ]//a
[0135]来选取各主列表页作为下一个要爬取的页面类型“list_”。
[0136]表达式“//dd[@id = ' Vtiti ]//a”的语义即表示选中当前网页中“定义列表”项(definition list,语法为“dd” )下所有的引用项(reference,语法为“a”),且这些定义列表项的属性“id”为字符串“vtit”。xpath的具体语法请参考xpath和html的使用说明,例如分别参见 http://www.w3school.com.cn/h.asp 和 http://www.w3school.com.cn/xpatho
[0137]如图3所示,通过上述xpath表达式选中了 “安极市场”主页上的抬头列表项,例如“首页”、“游戏”、“应用”等等,在网页中以虚线框来标识被选中的项。可以在图3的下半部分中看到提取出的列表项具有完全或部分的网页链接(地址)的形式,例如“/index,jsp”、“http://apk.angeeks.com/1 ist/c-8.html”。请注意:此处的“首页”、“装机必备”、“机型专区”这三个主列表页链接并非我们所需要的下载列表页,为了减少不必要的爬取,可通过正则表达式对提取出的地址进行进一步过滤,以选中链接中包含字符串“list”的链接,从而将“首页”、“装机必备”、“机型专区”等三个链接过滤掉。鉴于正则表达式的语法是本领域技术人员众所周知的,本申请将不再赘述。
[0138]这样,通过上述xpath表达式和正则表达式,选中了“游戏”、“应用”、“电子书”、“主题”和“壁纸”等五个页面。接下来,以“游戏”页面为例进行后续说明。参见图4,其示出了在游戏页面中进行的后续操作。具体地,如参照图3所述,将“游戏”、“应用”、“电子书”、“主题”和“壁纸”等五个主列表页面的页面类型定义为“list_”。尽管类型的页面也为(主)列表页,但由于希望能按时间顺序抓取程序包(例如,为了优先抓取最近更新的程序包),所以此类页面并不适合作为获取下载地址的列表页。当然,对于其他网站来说,有可能默认提供的页面就是按时间顺序排列的列表页,此时也就不需要图4所示的步骤。这应当完全取决于所要抓取的网站的具体设计。
[0139]返回图4,为了在“游戏”页面上选中“按更新时间排序”,使用以下xpath表达式
[0140]//div[iclass = ' mytak/ ]/p[last O]/a
[0141]来选取“按更新时间排序”链接,并将所获取的链接定义为“list”类型。如图4所示,在网页中以虚线框来标识被选中的项。
[0142]在选中“按更新时间排序”后,还需要两条爬取规则来进行后续操作。第一条爬取规则负责解析当前列表页面上所有要下载的应用软件的信息页(即,提供要下载的应用软件的相关信息以及下载链接的页面)。第二条爬取规则负责将当前列表页面翻到下一页,即负责获取下一个列表页面。
[0143]针对上述第一条爬取规则,参见图5,其示出了获取当前列表页面上所有待下载应用软件的信息页的步骤。此处,使用xpath表达式
[0144]//div[iclass = ' info' ]/a
[0145]来获取类型被定义为“topic”的各待下载应用软件的页面。如图5所示,通过该xpath表达式选中了 “游戏”页面上“按更新时间排序”模式下的各软件信息页,例如“Mechanical Zuma”、“职业桌球(中文版)”、“象棋巫师”等等,在网页中以虚线框来标识被选中的项。可以在图5的下半部分中看到提取出的信息页具有部分的网页链接(地址)的形式,例如“/soft/10119542, html”。当然,对于其他网站来说,信息页的网页地址不限于部分地址,其也可以是完全的地址,这完全取决于网站的具体设计。
[0146]针对上述第二条爬取规则,参见图6,其示出了获取当前列表页面上指向下一页的“>”按钮的网页地址的步骤。此处,使用xpath表达式[0147]//div[iclass = 1 pagenumt1 ]/a[last()_l]
[0148]来获取类型也被定义为“list”的下一个列表页。如图6所示,通过该xpath表达式选中了网页上的“>”按钮所对应的网页地址,在网页中以虚线框来标识被选中的项。因此,第二条爬取规则也被称为“翻页规则”。可以在图6的下半部分中看到提取出的列表页具有部分的网页链接(地址)的形式,例如“/list/C-8-2-l.html”。
[0149]这样,通过反复应用上述第一条爬取规则和第二条爬取规则,即可获得“安极市场”的“游戏”页面在“按更新时间排序”模式下的所有应用软件的信息页(下载页)的链接。需要注意的是,在根据上述第二条规则翻到最后一页时,由于使用上述xpath表达式获取到的地址实际上指向的还是最后一页(即,该时刻的当前页),因此将通过去重列表或其他终止手段(例如,另一条爬取规则或正则表达式等)来结束图6所示的解析过程,本发明不限于上述终止手段。当然,针对不同网站应当设计并使用相应的爬取规则。
[0150]接下来,将参照图7来详细描述如何在每个信息页上获取用于下载相应软件的地址。参见图7,其以软件“职业桌球(中文版)”为例,示出了通过xpath表达式来获取“职业桌球(中文版)”下载链接的步骤。在图7中,通过使用xpath表达式
[0151]//img[isrc = " /images/wandoujiabutton.jpg" ]/..[0152]来获取软件的下载链接。通过该xpath表达式选中了网页上以虚线框来标识的“一键安装”按钮所对应的网页地址。可以在图7的下半部分中看到提取出的下载页具有完全网页链接(地址)的形式,例如 “http://apk.angeeks.com/downloadAPK.do ? soft_id=10119517”。
[0153]这样,通过图3~7所述的方法步骤,可以得出针对“安极市场”的各条爬取规则。根据这些爬取规则,可以由爬虫得到各个软件的按更新时间排序的应用下载列表,将其存入下载队列,并由下载器按照下载队列来进行下载。
[0154]此外,值得一提的是绝大部分应用软件下载页面在其软件的详细信息页(在本实施例中,“topic”页)上均会提供大量的软件相关信息,采用类似提取下载链接的方式(xpath表达式)可以很方便的将下载的软件包的相关信息一并获取。
[0155]接下来,为了通过配置文件来配置爬虫模块和下载模块,需要将上面针对特定网站生成的爬取规则加以规范化。例如,在以xml格式来定义配置文件的情况下,可以将上述爬取规则定义为配置文件中的一个spider节点。例如如下所示:
[0156]
[0157]接下来详细解释该spider节点中各项的语义。
[0158](I) spider 节点[0159]spider节点的“name”属性用于在本发明的系统内部表示网站的简称,针对图3~7所示的示例,可以将“name”属性赋值为“angeeks”(安极)。“channel”属性用于标识网站进而与后续系统对接。
[0160](2) spider 节点的 start_url 节点
[0161]start_url节点用于定义起始页。起始页可以有多个,因此也就可以存在多个start_url节点。在本实施例中,起始页类型默认为“home”,但是也可以通过为该节点增加“type”属性来指定其类型。在存在多个起始页时,也可分别指定类型。start_url节点的“url ”属性表示该节点所指向的具体URL,在本示例中,起始页面只有一个,其页面地址即为“url” 属性中的 “http://apk.angeeks.com/,,。
[0162](3) spider 节点的 crawl_rule 节点
[0163]crawl_rule节点用于定义单条爬取规则。其“from”属性指定了将该规则应用于哪种类型的页面,而“to”属性指定应用该规则后解析出来的地址指向的页面属于哪种类型。该属性忽略时解析出的地址将作为下载链接被提交给下载器。例如,在上述spider节点的最后一个crawlrule节点中,不存在“to”属性,则根据该爬取规则所解析出的地址将被视为下载链接,并在经过去重之后添加到下载队列中,该规则与图7所示步骤相对应。而上述示例中的前四条具有“to”属性的爬取规则(Crawl_rule)分别与图3~6所示的爬取规则相对应。
[0164]此外,在其他实施例中,也可以将另一特定类型的地址(页面)作为下载链接。例如,可以定义“download”类型的地址作为下载链接的类型,并在“to”属性中赋值“download”来表明根据该爬取规则解析出来的地址是应当被添加到下载队列中的下载地 址。
[0165]此外,爬取规则(crawl_rule)节点中的xpath表达式可以通过两种方式指定:“xpath”属性和“restrict_xpath”属性。“restrict_xpath”属性提取的是html文件中的“a”标签,并将该“a”标签的“href”属性的值作为新地址。而“xpath”属性则直接提取地址字符串。由上述描述可知,“xpath”属性的功能强于“restrict_xpath”属性。但为了后向兼容性,需要提供“restrict_xpath”属性来兼容一些早期的网站。当两个属性同时存在时,本系统将忽略restrict_xpath属性。
[0166]crawl_rule节点的“filter_regex”属性指定了正则表达式。该正则表达式用于匹配根据“restrict_xpath”或“xpath”属性所提取出的地址字符串。若“ f i Iter_regex”属性存在,则程序会将根据“restrict_xpath”或“xpath”属性提取出的地址与相应正则表达式进行匹配。若匹配失败,则跳过该地址。若匹配成功,则将匹配出来的所有组(group)拼接起来作为最终的地址。例如,在提取出的地址字符串中出现的像“timestamp”这种参数在网页爬取时有可能会引发各种问题,因此针对例如以下网址:
[0167]WWW.domain, com/item ? imestamp = 6666&itemid = 8888
[0168]可以使用类似于
[0169](.*/item ? ) timestamp = \d*&(itemid = \d*)
[0170]之类的正则表达式来进行匹配。通过这种形式的正则匹配,将中间“timestamp”参数所在的那部分去除,仅留下前面的地址(字符串)以及需要的“itemid”参数(字符串)。并通过将这些字符串拼接起来得到最终的地址WWW.domain, com/item ? itemid = 8888。当然,字符串的数目不限于2个,在其他示例中,也可以是I个或3个以上。
[0171]当crawl_rule节点的“next_page”属性存在且为“true”时,意味着该规则为前述“翻页规则”。爬虫在爬取时通过记录已使用过这种规则的次数,可以识别当前爬取的链接在该网站的应用列表的第几页上。在本实施例中,在设计爬取规则时,要求仅在翻取“按更新时间排序”的列表时才定义该属性。在另一些实施例中,可以针对其他状态下的列表也定义该属性,即未必在“按更新时间排序”的状态下翻动列表。
[0172]当然,以上这些节点和/或属性的名称可以根据实现本发明的系统的需要而相应改变,并不限于以上示例所给出的形式。
[0173]此外,存在嵌入JS来生成页面链接的一些网站。而本系统的将xpath表达式与正则表达式相结合的爬取规则定义方式为处理此类网站提供了非常大的灵活性。参见图8和9,其示出了这种情况的一个较为简单的示例:“安智市场”的下载链接的提取。
[0174]如图8所示,“安智市场”的应用软件的下载链接并非实际的网络地址,而是一段JS代码,且下载地址嵌在该代码内部。在这种情况下,可以通过xpath表达式来选中相应html文件中的相应节点,然后用正则表达式匹配其中的下载链接。
[0175]例如,一条对应的爬取规则的示例如下:
[0176]<crawl_rulefrom = " topic" restrict_xpath = " //div[iclass = ' detail_down, ]/a" filter_regex =" , (dl_app['1 ]*) , " />
[0177]其中,“from”属性表示本条爬取规则适用于“topic”属性的页面(即,信息页);没有“to”属性,表示根据本条爬取规则所解析出的地址是要被加入下载队列的下载链接;“restrict_xpath”属性表示从当前页面中提取出如上所述包含JS代码在内的相应html节点;以及“filter_regex”属性表示用于从该相应节点中提取相应下载地址的正则表达式,其中,在本示例中,该地址具有部分地址的形式。
[0178]实际上,利用xpath自带的字符串操作函数,我们能够处理一些更复杂的情况。例如,在软件下载网站“豌豆荚”的页面上并不存在直接的下载链接,而通过网络抓包工具“wireshark”侦听下载“豌豆荚”的apk类型软件时的数据包,可得知其下载链接具有以下形式:
[0179]http: //apps.wandou jia.com/apps/ 包名 /download
[0180]于是我们可以如图9所示根据以下爬取规则从网页中提取出包名并拼接出下载地址:
[0181]<crawl_rule from = " topic" xpath = " concathttp://apps.wandouj ia.com/apps/' , //a/idata-packagename, ' download' ) " />
[0182]接下来,将详细描述在图1和2所示的示例分布式系统10中如何实现爬取规则。
[0183]在本实施例中,可以使用基于python的Ixml库来解析具有xml格式的配置文件,并通过Ixml自带的xpath相关功能提取出爬虫配置节点。当然,也可以使用基于其他语言的其他解析xml格式文件并处理xpath表达式的库来解析该配置文件,本发明不限于上述方法。
[0184]在本实施例中,定义了与前文所述的“spider”、“start_urI”和“crawl_rule”配置节点分别对应的3个类SpiderConfig(针对爬虫的配置)、StartUrl (起始地址)、CrawlRule (爬取规则)。SpiderConfig类具有两个list对象,分别保存该节点内所有的StartUrl与CrawlRule配置。提取出的配置节点在内存中被转换为一个SpiderConfig类的实例供爬虫程序使用。
[0185]在控制器110解析起始地址之后,将起始地址写入爬取队列121_1~121_L中对应的爬取队列。在一个实施例中,可以按如下方式写入爬取队列:
[0186]I
[0187]angeeks
[0188]2
[0189]url = ‘http://apk.angeeks.com/,,meta[ ‘type,] =‘home,,meta[ ‘depth,]=0,meta[ ‘page’ ] = 0,meta[ ‘spider’ ] = ‘angeeks’,meta[ ‘expire’ ] = 3020
[0190]其中,“angeeks”表示该网站的简称,其用于在系统内部表示网站简称;“url”项的值表示该起始地址的URL,在本示例中为安极市场的URL ;“type”项表示该URL指向的网页的类型,在本示例中为“home ” ; “ depth ”项表示该起始地址的初始爬取深度,在本示例中为“O” ;“page”项表示该URL位于应用下载列表的第几页上,缺省为0,表示该起始地址不为翻页规则所针对的地址,spider”项表示该起始地址所属的网站的简称,在本示例中为“angeeks” ;以及“expire”项表示如果该起始地址被成功抓取,下一次最早重复抓取的时间,在本不例中,该最早重复抓取时间是在3020秒之后。
[0191]接下来,将详细描述在本发明的系统和方法中所使用的重爬机制。在通常情况下,会将已经爬取过的网址记录在去重列表中。而在新解析出的地址进入爬取队列(下载队列)前,都会将其与去重列表 中的网址进行比较,并丢弃重复的地址以避免对网页的重复爬取。然而所有正常运转的软件下载网站都会对其提供下载的内容进行更新,而这些更新的内容通常会出现在应用下载列表的前几页上(例如,在按更新时间排序的情况下)。同时,这些最新更新的内容对于用户而言通常也较为重要。
[0192]但是由于去重列表的存在,现有的爬虫程序将会在判断出要爬取的地址是重爬列表中已经爬取过的地址时,自动放弃爬取该更新后的页面。为了应对这种页面(软件)更新的情况,我们需要一套新的重爬机制来保证应用列表的前几页(例如,在按更新时间排序的情况下)会以一定频率被重复爬取。
[0193]在本系统中,存在与重爬相关的两种机制,它们分别基于要爬取页面的类型和要爬取页面所在的页数。
[0194](I)基于页面类型的重爬机制
[0195]对于不同类型的网页,为其分别定义去重列表中对应条目的有效期。在本示例中,由于详细信息页通常与要下载的软件包呈一一对应的关系,因此网页有效期的定义通常仅限于在解析出详细信息页(“topic”页)之前的网页。例如,在本示例中针对“home”、
类型的页面定义有效期。在另一个实施例中,也可以为“topic”页设置有效期。在又一个实施例中,也可以不为其他类型页面设置有效期。针对页面的有效期的设置可以是根据具体需要来设置的。
[0196]该基于页面类型的重爬机制主要包括以下几点:
[0197]?使用Redis数据库的zset数据类型来存放去重列表。当爬虫完成对某个网址的爬取时,不仅需要将该网址记录在去重列表中,还需要将当前时间在具有zset数据类型的去重列表的对应z值中(以时间戳的形式)一并记录下来。[0198]?将具体的有效期记录在爬取规则(crawl_rule)与起始地址(start_url)中。当通过某条爬取规则解析出或从起始地址列表中获取一个待爬取地址时,将该爬取规则或起始地址的有效期作为该地址的有效期。然后,将该地址的有效期与去重列表中对应的记录进行比对。若去重列表中无对应记录或对应记录已过期,则将该地址联同其有效期信息一同推入爬取队列。
[0199].由于对于内容较为丰富的网站,解析出网址的时间与爬取该网址的时间可能相隔很久,因此为了避免由于相隔过久而导致有效期过期并重复爬取,在将网址从爬取队列中读出之后并在准备爬取之前,应当再次在去重列表中进行比较。“再次比较”主要是为了防止以下情况:由于解析地址和爬取地址之间相隔时间过久,导致去重列表中的有效期过
期,而可能出现不想要的重复爬取。例如,在爬取队列中存在100个待爬取地址P1、P2.....PlOOo在第一轮爬取中,顺序爬取P1、P2、...、PlOO所指向的网页,并对它们进行解析,得
到了新的待爬取网页,例如P101。假定一轮的爬取并解析PUP2.....PlOO所耗费的时间
是!\。当T1大于去重列表中的有效期时,由于P1、P2.....PlOO在去重列表中对应项已过
期,因此有可能不继续对PlOl进行爬取和解析,而是进行新一轮(第二轮)爬取并解析P1、
P2.....PlOO0假定这一轮的爬取并解析P1、P2.....PlOO所耗费的时间是T2 (由于例如
系统负载的变化、网页内容的变化等导致T2与T1不同)。如果
[0200]PlOl的去重列表对应项的有效期< T2 < Pl~PlOO的去重列表对应项的有效期<?\此时,再一次解析出的Pl Ol同样将被添加到爬取队列中(因为其在去重列表中对应项的有效期已过,即T2大于其有效期)。此时,在爬取队列中存在两个相同的爬取地址Ρ101,且很有可能它们的优先级是相同的。此外,由于T2小于Pl~PlOO的去重列表对应项的有效期,则不会重复爬取Pl~Ρ100。此时,如果不在爬取之前在去重列表中对PlOl再次进行去重,则这两个相同的爬取地址很有可能在短时间内被重复爬取,造成目标网站的负载增高或者导致爬取失败。
[0201]如下表2所示,其描述了针对某一特定地址的多次爬取(下载)请求的可能处理情况(假定去重列表内的网页的有效期为3000秒):
[0202]
【权利要求】
1.一种用于下载网站数据的分布式方法,包括以下步骤: 设定一个或多个下载组, 在数据库中针对每个下载组维护相应的网站列表; 一个或多个下载模块中的每个下载模块根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列;以及 所述每个下载模块根据所述一个或多个下载队列来进行下载。
2.根据权利要求1所述的方法,其中,通过在启动所述下载模块时指定组名,将所述下载模块和与所述组名相关联的下载组相关联。
3.根据权利要求1所述的方法,其中,当在启动所述下载模块时未指定组名时,将所述下载模块与缺省下载组相关联。
4.根据权利要求1所述的方法,其中,所述网站列表中的记录均具有下次下载时间项,以及下载模块根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列的步骤还包括: 所述下载模块仅获取下次下载时间项的值小于当前时间的记录来获取相应网站的一个或多个下载队列。
5.根据权利要求4所述的方法,其中,所述一个或多个下载模块至少包括第一下载模块和第二下载模块,以及在获得网站列表的同时如下更新所述下次下载时间项的值: 针对所述第一下载模块,所述下次下 载时间项的值等于当前时间与爬取间隔之和;以及 针对所述第二下载模块,所述下次下载时间项的值等于当前时间、下载超时时间、以及下载间隔之和。
6.根据权利要求5所述的方法,其中,所述爬取间隔是2秒。
7.根据权利要求5所述的方法,其中,所述下载间隔是10秒。
8.根据权利要求5所述的方法,其中,针对所述第二下载模块,在完成下载之后,使用当前时间与下载间隔之和再次更新所述下次下载时间项。
9.根据权利要求5所述的方法,其中,所述第一下载模块以固定时间间隔来获取网站列表。
10.根据权利要求5所述的方法,其中,所述第二下载模块在预定事件发生时获取网站列表,同时也以固定时间间隔来获取网站列表。
11.根据权利要求1所述的方法,其中,通过向网站列表中插入/移除记录来控制针对相应网站的下载的启动/停止。
12.根据权利要求1所述的方法,还包括: 根据网站的结构设置爬取规则; 根据所述爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据; 检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题; 在确认数据正常之后,清除所述测试专用组;以及 在目标组中正式启动相应下载模块来下载所述网站的数据。
13.根据权利要求1所述的方法,还包括: 查询统计信息,检查是否存在网站数据的下载异常; 如果存在异常,则停止发生异常的下载; 根据针对下载异常的网站的爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据; 检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题; 在确认数据正常之后,清除所述测试专用组;以及 正式启动和与下载异常的网站相对应的下载组相关联的下载模块来重新下载所述网站的数据。
14.根据权利要求4所述的方法,其中,所述当前时间以所述数据库中的时间为准。
15.根据权利要求1所述的方法,还包括: 如果针对下载队列中的地址下载失败,则将所述地址以较低优先级置回所述下载队列中,以便重新调度下载。
16.一种用于下载网站数据的分布式系统,包括: 控制器,用于设定一个或多个下载组, 数据库,用于针对每个下 载组来维护相应的网站列表;以及 一个或多个下载模块,每个下载模块用于根据针对与其相关联的下载组所维护的网站列表来获取相应网站的一个或多个下载队列,以及根据所述一个或多个下载队列来进行下载。
17.根据权利要求16所述的系统,其中,通过在启动所述下载模块时指定组名,将所述下载模块和与所述组名相关联的下载组相关联。
18.根据权利要求16所述的系统,其中,当在启动所述下载模块时未指定组名时,将所述下载模块与缺省下载组相关联。
19.根据权利要求16所述的系统,其中,所述网站列表中的记录均具有下次下载时间项,以及所述下载模块还被配置为: 仅获取下次下载时间项的值小于当前时间的记录来获取相应网站的一个或多个下载队列。
20.根据权利要求19所述的系统,其中,所述一个或多个下载模块至少包括第一下载模块和第二下载模块,以及在获得网站列表的同时如下更新所述下次下载时间项的值: 针对所述第一下载模块,所述下次下载时间项的值等于当前时间与爬取间隔之和;以及 针对所述第二下载模块,所述下次下载时间项的值等于当前时间、下载超时时间、以及下载间隔之和。
21.根据权利要求20所述的系统,其中,所述爬取间隔是2秒。
22.根据权利要求20所述的系统,其中,所述下载间隔是10秒。
23.根据权利要求20所述的系统,其中,针对所述第二下载模块,在完成下载之后,使用当前时间与下载间隔之和再次更新所述下次下载时间项。
24.根据权利要求20所述的系统,其中,所述第一下载模块以固定时间间隔来获取网站列表。
25.根据权利要求20所述的系统,其中,所述第二下载模块在预定事件发生时获取网站列表,同时也以固定时间间隔来获取网站列表。
26.根据权利要求16所述的系统,其中,所述控制器通过向网站列表中插入/移除记录来控制针对相应网站的下载的启动/停止。
27.根据权利要求16所述的系统,其中,通过以下方式来部署针对网站的爬取规则: 根据网站的结构设置爬取规则; 根据所述爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据; 检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题; 在确认数据正常之后,清除所述测试专用组;以及 在目标组中正式启动相应下载模块来下载所述网站的数据。
28.根据权利要求16所述的系统,其中,通过以下方式来调整针对网站的爬取规则: 查询统计信息,检查是否存在网站数据的下载异常; 如果存在异常,则停止发生异常的下载; 根据针对下载异常的网站的爬取规则,使用与测试专用组相关联的下载模块来尝试下载所述网站的数据; 检查下载到的数据,确认是否存在异常,如果存在异常,则在本地调试所述爬取规则并解决导致异常出现的问题; 在确认数据正常之后,清除所述测试专用组;以及 正式启动和与下载异常的网站相对应的下载组相关联的下载模块来重新下载所述网站的数据。
29.根据权利要求19所述的系统,其中,所述当前时间以所述数据库中的时间为准。
30.根据权利要求16所述的系统,其中,所述下载模块还被配置为: 如果针对下载队列中的地址下载失败,则将所述地址以较低优先级置回所述下载队列中,以便重新调度下载。
【文档编号】G06F17/30GK103475687SQ201310198673
【公开日】2013年12月25日 申请日期:2013年5月24日 优先权日:2013年5月24日
【发明者】吴自立 申请人:北京网秦天下科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1