具体实施方式
下面结合附图及具体实施方式对本发明进行进一步的说明。
如图1所示,本实施方式中论坛回帖增量采集系统包括判断装置11,与判断装置11连接的提取装置12。其中,判断装置11包括第一队列单元111、第一获取单元112、列表页提取单元113和判断单元114。提取装置12包括第二队列单元121、扫描单元122、第二获取单元123、内容页提取单元124和消重单元125。
判断装置11用于根据帖子首页URL和帖子回复数信息,周期性判断所有需要采集的论坛列表页中是否存在新增帖子和具有新回帖的帖子。其中,第一队列单元111用于将所有需要采集的论坛列表页URL添加到列表页采集队列。第一获取单元112用于从列表页采集队列中取出每个列表页URL。列表页提取单元113用于对取出的每个列表页URL,获取该列表页URL对应的网页内容,从所述网页内容中提取出每个帖子首页URL和当前回复数。判断单元113用于根据帖子首页URL判断每个帖子在已采集帖子信息表中是否存在;如果存在,则继续判断该帖子当前回复数是否大于已采集帖子信息表中记录的本次回复数,如果大于,则该帖子有新回帖,更新已采集帖子信息表中该帖子的上次回复数和本次回复数;如果该帖子在已采集帖子信息表中不存在,则该帖子为新增帖子,将该帖子首页URL和当前回复数添加到已采集帖子信息表中。
提取装置12用于对新增帖子,从新增帖子中提取出主帖和回帖信息;对具有新回帖的帖子,计算新回帖起点和新回帖个数,根据新回帖起点和新回帖个数从具有新回帖的帖子中提取出新回帖信息。其中,第二队列单元121用于将新增帖子的首页URL和具有新回帖的帖子URL添加到内容页采集队列。扫描单元122用于定时扫描内容页采集队列。第二获取单元123用于从内容页采集队列中取出每个URL。内容页提取单元124用于获取URL对应的网页内容,并从所述网页内容中提取主帖和/或回帖和/或翻页URL。消重单元125用于对论坛翻页方式为下一页翻页方式时从网页内容中提取的翻页URL进行消重处理。第二队列单元121还用于将消重后的翻页URL添加到内容页采集队列。
如图2所示,本实施方式中基于图1所示系统的论坛回帖增量采集方法的流程,包括以下步骤:
(1)判断装置11周期性判断所有需要采集的论坛列表页中是否存在新增帖子和/或具有新回帖的帖子。
如图3所示,本实施方式中采用的判断方法包括以下步骤:
(a)第一队列单元111将所有需要采集的论坛列表页URL添加到列表页采集队列。所述列表页是指论坛中包含所有帖子标题、URL(统一资源定位符)、点击数、回复数等信息的列表页面,不包括帖子的具体内容。如搜狐论坛的财经大杂烩频道的列表页,其URL如下:
http://club.business.sohu.com/l-enjoy-0-0-0-0.html。
再如人民网强国社区的国际论坛频道的列表页,其URL如下:
http://bbs1.people.com.cn/boardList.do?action=postList&boardId=6。
本实施方式中,对每个需要采集的论坛列表页均设定采集时间间隔,如每隔5分钟采集一次;监控每个列表页的采集时间间隔;当某个列表页达到采集时间间隔时,便将该列表页URL添加到列表页采集队列。
优选的,刷新间隔根据论坛的更新频率动态调整;论坛的更新频率越快,刷新间隔越短;论坛的更新频率越慢,则刷新间隔越长。如预先设定每隔5分钟采集一次,在后续采集过程中,如果发现论坛更新频率增加,则将刷新间隔缩短为3分钟,进而缩短为1分钟或更短。
论坛的更新频率的计算方法可参见中国专利申请“一种网页数据信息的定向采集方法及装置”(申请号:201010236363.7),此处不再赘述。
(b)第一获取单元112从列表页采集队列中取出每个列表页URL。
本实施方式中,从列表页采集队列中取出列表页URL采用的方法为:定时扫描列表页采集队列(扫描间隔时间可由用户根据具体应用情况设置),如果列表页采集队列不空,则按照先进先出顺序依次从列表页采集队列中取出列表页URL(从队列中取出URL后,该URL便会自动从队列中删除),并且满足该列表页URL所属网站的友好访问条件。如果某列表页URL不满足该列表页URL所属网站的友好访问条件,则在本次扫描中忽略该列表页URL,继续判断下一个列表页URL,该列表页URL留待后续扫描中处理。网站的友好反问条件包括当前访问数量限制和访问的时间间隔限制。判断是否满足网站的友好反问条件的方法可参见中国专利申请“一种从网站中多个不同IP的服务器抓取网页的方法及系统”(申请号:201010546334.0),此处不再赘述。
(c)列表页提取单元113对取出的每个列表页URL,获取该列表页URL对应的网页内容;再从网页内容中提取出每个帖子首页URL和当前回复数。
根据每个列表页的URL,向该URL所属网站发送获取该URL对应网页内容的HTTP请求,然后接收返回的网页内容。从网页内容中提取帖子首页URL和当前回复数为现有技术,此处不再赘述。
(d)判断单元113根据帖子首页URL判断该帖子在已采集帖子信息表中是否存在。如果存在,则说明该帖子已采集过,继续判断该帖子当前回复数是否大于已采集帖子信息表中记录的本次回复数。如果大于,则说明该帖子有新回帖,在已采集帖子信息表中更新该帖子的上次回复数和本次回复数,即用已采集帖子信息表中该帖子的本次回复数的数值替换上次回复数的数值,用该帖子当前回复数的数值替换已采集帖子信息表中该帖子的本次回复数的数值。如果不大于,则说明该帖子没有新回帖,抛弃该URL不作任何后续处理。如果该帖子在已采集帖子信息表中不存在,则说明该帖子为新增帖子,将该帖子首页URL和当前回复数添加到已采集帖子信息表中,该帖子的上次回复数为0,本次回复数为当前回复数。
已采集帖子信息表中存储有已采集帖子首页URL和已采集帖子的上次回复数和本次回复数,其结构如下表所示:
已采集帖子首页URL |
上次回复数 |
本次回复数 |
URL1(URL1的MD5值) |
a1 |
a2 |
URL2(URL2的MD5值) |
b1 |
b2 |
… |
|
… |
URLn(URLn的MD5值) |
n1 |
n2 |
优选的,在已采集帖子信息表中存储帖子首页URL的标识信息,如MD5码。通过比较标识信息确定帖子首页URL在已采集帖子信息表中是否存在。这样可以提高URL的比较效率。
(2)在所有需要采集的论坛列表页中如果存在新增帖子和/或具有新回帖的帖子,则提取装置12从所述新增帖子中提取出主帖和回帖信息,从所述具有新回帖的帖子中提取出新回帖信息。
如图4所示,本实施方式中采用的提取方法包括以下步骤:
(i)第二队列单元121将新增帖子的首页URL和具有新回帖的帖子URL添加到内容页采集队列。
对于新增帖子,如果该帖子首页URL在内容页采集队列中存在,则将该帖子首页URL取出,并将已采集帖子信息表中记录的该帖子本次回复数修改为当前回复数,再将其插入到内容页采集队列中。如果该帖子首页URL在内容页采集队列中不存在,则直接将该帖子首页URL添加到内容页采集队列。
对于具有新回帖的帖子,如果该帖子所属论坛的翻页方式为计算翻页方式,则直接将具有新回帖的帖子首页URL添加到内容页采集队列;如果该帖子所属论坛的翻页方式为下一页翻页方式,则查找该帖子的翻页URL信息表,将该表中最后一个翻页URL添加到内容页采集队列。
所述计算翻页方式是指每页回帖个数确定的翻页方式,如人民网强国社区的国际论坛中的帖子
http://bbs1.people.com.cn/postDetail.do?boardId=6&view=1&id=91384467便为计算翻页的方式。
所述下一页翻页方式是指每页回帖个数不确定的翻页方式,如天涯杂谈中的帖子
http://www.tianya.cn/publicforum/content/free/1/1880805.shtml便为下一页翻页方式。
(ii)扫描单元122定时扫描内容页采集队列。扫描间隔时间可由用户根据具体应用情况设置。
(iii)如果内容页采集队列不空,则第二获取单元123从内容页采集队列中取出每个URL。从队列中取出URL后,该URL便会自动从队列中删除。
本实施方式中,第二获取单元123从内容页采集队列中取URL的方法与第一获取单元112从列表页采集队列中取URL的方法相同,此处不再赘述。
(iv)内容页提取单元124获取取出的URL对应的网页内容,并从所述网页内容中提取主帖和/或回帖和/或翻页URL,并将翻页URL添加到内容页采集队列。
本实施方式中,从网页内容中提取主帖和/或回帖采用的具体方法如下:
如果该URL为帖子首页URL并且是第一次采集,即该帖子是新增帖子,则从该URL对应的网页内容中提取主帖和回帖信息。具体的,首先确定该帖子的主回帖风格是否一致,如果一致,则按照同一抽取方式逐个抽取信息,将抽取的第一个信息作为主帖,其他信息作为回帖;如果不一致,则先按照既定规则抽取主帖信息,然后再抽取每个回帖信息。所述帖子的主回帖风格是否一致由人工设定,所述既定规则是人工设定的关键词或者正则表达式。
如果该URL为帖子首页URL但不是第一次采集,即该帖子是具有新回帖的帖子,则根据如下公式确定新回帖起点S′From和新回帖个数C′ParseCount,从新回帖起点S′From开始提取C′ParseCount个新回帖信息。
C′ParseCount=RCurNum-RPreNum
其中,RPreNum表示上次采集时该帖子的回复数,RCurNum表示该帖子当前的回复数,NPerPage表示该帖子每页的回帖个数。
如果该URL不是帖子首页URL,则进一步判断是否是重叠页URL。所述重叠页是指该页面内均为回帖信息且部分回帖为新回帖的页面。判断依据为该URL对应的页码与当前应该提取页的页码相同。当前应该提取页的页码的计算公式如下:
其中,PBegin表示当前应该提取页的页码;ceil表示向上取整运算。
如果是重叠页,则采用如下公式计算新回帖起点S′′From和新回帖个数C′′ParseCount,从新回帖起点S′′From开始提取C′′ParseCount个新回帖信息。
其中,“%”表示取余数运算。
如果该URL既不是帖子首页URL,也不是重叠页URL,即该页内容均为新回帖,则采用如下公式计算新回帖起点S′′′From和新回帖个数C′′′ParseCount,从新回帖起点S′′′From开始提取C′′′ParseCount个新回帖信息。
S′′′From=0;
C′′′ParseCount
从网页内容中提取翻页URL采用的具体方法如下:
①如果论坛翻页方式为计算翻页方式,且URL为帖子首页URL,则先采用如下公式计算翻页的起始页码和终止页码,即新回帖所在的起始页码和终止页码。如果URL不是帖子首页URL,则不提取翻页URL。
如果SFrom=0且RPreNum>0,则令SFrom=NPerPage,PBegin=PBegin+1。
其中,PBegin和PEnd分别为翻页的起始页码和终止页码,SFrom表示新回帖起点,从该起点开始至终止页码内的所有回帖均为新回帖。由上述公式计算出翻页的起始页码和终止页码后,结合预设的翻页URL规则,拼接出所有翻页URL。
具体的URL拼接方法为:根据配置的翻页规则、翻页的起始页码、翻页基数来进行翻页URL的拼接。本实施方式中,在配置的翻页规则中,将翻页的URL分割成了三个部分,其中第一部分和第三部分为不变部分,分别记为strBeforePage和strAfterPage;第二部分为变化部分,记为nPageUp。翻页URL的拼接过程的伪代码如下:
for(inti=PBegin;i<PEnd;i++)
其中,nPageNo表示新回帖所在页码;nFirstPostPageIndex表示帖子首页页码。在实际论坛中,nFirstPostPageIndex可能的取值为0或1,即帖子页码从0开始编号,首页页码为0;或者帖子页码从1开始编号,帖子首页页码为1。nPageUp表示填写在待拼接URL内的表示翻页的页码值,即第二部分的数值;nPageUsBaseNum表示翻页基数。strPostPageUrl表示拼接后的URL。
举例说明如下:
实例一:
人民网强国社区的国际论坛频道的一篇帖子的URL为:
http://bbs1.people.com.cn/postDetail.do?boardId=6&view=1&id=91384467
其翻页链接规则为:
/postDetail\.do\?id=\d+&view=\d+&pageNo=(\d+)&boardId=6
起始页码nFirstPostPageIndex为1,翻页基数nPageUsBaseNum为1,NPerPage为20。
根据翻页链接规则,提取出翻页URL的第一部分和第三部分,分别为:“/postDetail.do?id=91384467&view=1&pageNo=”和“&boardId=6”。
根据以上信息,假设第一次采集该帖子时,该帖子已经有了210个回帖,则拼接获取的翻页URL共10个,分别为:
/postDetail.do?id=91384467&view=1&pageNo=2&boardId=6
/postDetail.do?id=91384467&view=1&pageNo=3&boardId=6
/postDetail.do?id=91384467&view=1&pageNo=4&boardId=6
……
/postDetail.do?id=91384467&view=1&pageNo=11&boardId=6
实例二:
百度贴吧的帖子URL为:http://tieba.baidu.com/f?kz=919731090。
其翻页链接规则为:
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=30。
起始页码为0,翻页基数为30。根据翻页链接规则,提取出翻页URL的第一部分为:
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=。第三部分无内容。
NPerPage为30。根据以上信息,假设第一次采集该帖子时,该帖子已经有了210个回帖,则拼接获取的翻页URL共6个,分别为:
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=30
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=60
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=90
……
/f?z=919731090&ct=335544320&lm=0&sc=0&rn=30&tn=baiduPostBrowser&word=%B6%B7%C6%C6%B2%D4%F1%B7&pn=210
最后将所有拼接好的翻页URL处理为完整带域名信息的URL,再将处理后的所有翻页URL添加到内容页采集队列中。
②如果论坛翻页方式为下一页翻页方式,则从网页内容中提取翻页URL。如果网页内容中不存在翻页URL,则说明该页是最后一页,没有翻页。
对于翻页方式为下一页翻页方式,从网页内容中提取出翻页URL后,添加到内容页采集队列之前,消重单元125对翻页URL进行消重处理。具体的处理过程如下:
在翻页URL信息表中查找该翻页URL所属帖子是否存在。如果不存在,则将该翻页URL所属帖子的翻页信息插入到翻页URL信息表中,并将翻页URL添加到内容页采集队列中。如果存在,则继续判断该帖子的当前翻页页码是否大于翻页URL信息表中记录的该帖子的翻页页码。如果大于,则在翻页URL信息表中将该帖子的翻页页码更新为当前翻页页码,并将该翻页URL添加到内容页采集任务队列中。如果不大于,则无需更新翻页URL信息表中该帖子的翻页页码,直接删除该翻页URL即可。
所述翻页URL信息表存储帖子首页URL(或标识信息)、当前已采集过的翻页页码、当前已采集过的页面上最后一个回帖位置、当前已采集过的翻页URL,其表头结构如下表所示:
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其同等技术的范围之内,则本发明也意图包含这些改动和变型在内。