社交网络信息采集技术研究与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
社交网络信息采集技术研究与实现
【摘要】社交网站作为网络舆情的有效载体,在传播舆情方面有着重要作用。近年迅猛发展起来的微博就是一种典型的社交网站。本文针对微博类网站设计了支持Ajax(Asynchronous JavaScript and XML)技术的网络爬虫,采用协议驱动和事件驱动结合的采集策略,将爬取分为用户爬取和内容爬取两部分,使用基于模板的抽取方法,实现了对微博数据的成功抽取和存储。抽样结果证明,支持Ajax技术的网络爬虫,较BFS爬虫相比,提高了信息采集的效率和覆盖率。随着DOM Tree复杂度的提高,还有待于设计更高灵活性的网络爬虫。
【关键词】网络爬虫;社交网络;web信息抽取;AJAX
1.引言
随着信息技术的发展,各种新闻、论坛和博客网站为人们提供了发表评论的平台,对相关部门掌握舆情的走向起着重要作用,使得舆情研究变得有价值。由于Ajax技术的广泛使用,用于信息搜索的常规网络爬虫技术面临严重挑战,出现了针对Ajax技术的爬虫。2007年,瑞士苏黎世联邦理工学院的Gianni Frey[1,2]通过解析网页中的脚本,实现了Ajax动态信息的采集;随后Cristian[3]等人提出了基于脚本函数以及参数的热点检测机制,减少了重复信息的采集;2008年,荷兰理工大学的Ali[4]等人利用浏览器接口模拟用户对页面元素操作获取动态信息。在我国,2007年浙江大学的罗兵[5]在普通爬虫的基础上增加了JS(JavaScript)解析和DOM(Document Object Model)操作模块,实现了对JavaScript代码的解析和JavaScript代码中相关DOM操作的支持,完成了对Ajax 加载内容的分析;2009年,中国科学技术大学的曾伟辉[6]采用改进动态脚本分析方法,实现了基于对象的程序切片算法达到抓取Ajax站点URL的目的;同年,袁小节[7]以采集新闻主题信息为例,采用基于协议驱动采集和事件驱动采集相结合的方法完成了聚焦信息的采集。2010年,夏天[8]对Ajax站点数据采集进行了总结,分析了采集Ajax网页动态信息的研究重点以及发展趋势。本文在分析研究了现有爬虫技术后,针对微博类网站设计了支持Ajax技术的爬虫,该爬虫将爬取分为用户爬取和内容爬取两部分,采用协议驱动和事件驱动结合的采集策略以及基于模板的抽取方法,实现了对微博内容的抽取和保存,提高了信息采集的覆盖率。
2.面向微博的Web爬虫设计与实现
微博在网络事件中对舆论的导向起到重要作用[9]。网络舆情具有源数据针对性、时效性、后续更新连续性等特点。本文设计时,将要爬取的空间限制在微博网站中,考虑微博发布的时间、内容、评论和转发数等,以最大限度的信息采集量为目标进行设计,保证获取新增评论内容。
2.1 面向微博的网络爬虫框架
微博网站的更新是通过用户在自己的微博上发表文章来实现。由于没有包含所有文章的列表,在设计该类爬虫时,必须以用户为单位,先找到用户,再进入其微博主页获取微博的内容、发布时间、评论和转发数等。
根据以上思路,将基于微博的网络爬虫程序分为两个模块:获取用户信息模块和获取微博内容模块,基本框架如图2-1所示。
图2-1 基于微博的网络爬虫框架
在获取用户信息模块中,由于信息数量过大,严重影响信息获取的速度,而实际运用中,大多信息是无用信息。因此,根据信息的重要程度,将用户分为普通用户和重点用户。在获取用户信息时,先从重点用户出发,尽可能多的获取用户列表;更新用户列表时,以最近一次的用户列表作为本次爬取的初始化用户。为保证用户获取时分布均匀,在得到用户列表后,根据已获取的URL结构,使用随机函数产生用户ID, 构造出微博的访问URL。
在获取微博内容模块中,采用多线程爬取策略,每个线程负责一个用户的URL爬取,直至队列中的所有URL都被爬取过或者遇到终止条件结束。当爬虫进入到用户微博后,首先判断该用户是否已经被爬取过,如果己经爬取过,则转到该用户的微博页面爬取最新发布的微博;如果尚未被爬取,则从微博主页开始爬取,依次获取所有文章信息,并对用户状态进行更新。
2.2 支持Ajax的爬虫实现
目前广泛使用的Ajax技术使用局部刷新和异步读取的方法,使得服务器不需要存储大量静态网页数据,节约了存储空间,提升了用户的使用体验[7]。但是,这种技术也导致了普通爬虫无法得到完整的网页信息,如异步请求动态信息、网页中的触发事件等等。
使用了Ajax技术的网页,通常是从数据库中提取相应的数据填充到指定的模板,并将其显示在网页上,如新浪微博的评论信息页面,评论的内容是动态加载的,当评论内容被分成多页显示时,不同的评论内容页共用同一个URL。由于这些评论网页的结构十分相似,且在每一个动态页面中都包含多个触发元素,若要爬取到完整的评论信息,就需要用户对这些元素进行操作。
基于Ajax技术的微博网页,其首页的用户信息、用户微博的各个链接、微博内容都能在HTML源文件中查看到。针对这一特点,本研究采用协议驱动的方法,采集用户信息;采用事件驱动的方法,采集微博评论信息。
2.2.1 数据预处理
预处理阶段的任务是通过对样本网页进行分析,提出采集规则,提高对评论信息的采集效率。在运行时,使用Ajax状态表示一个动态网页的信息,采用全探测算法[6]查找页面中的有效触发元素,算法如下:
初始状态
构建关于状态的DOM Tree
储存状态标识至标识库,状态编号及内容至内容库
If 第一次处理then
遍历DOM Tree
获取触发事件列表
Else
查询触发事件列表
Endif
If 有未处理事件 then
获取事件状态
添加新状态至相应库
Else
结束
endif
上述算法中,在判断Ajax状态是否有效时,采用树匹配算法[10],即递归比较两棵树的第一层子树,求最大的匹配节点对。若两棵树的根节点不同,则这两棵树的最大匹配为零,不再比较子树,否则顺序比较每个子节点,最后得到两棵树的最大匹配节点数。
对于DOM Tree为T的HTML文档,假设其每个结点标记对应一个HTML 标签,则任意两棵树的相似度可按如下公式计算:
相似度= 最大匹配节点数/ 平均节点数
两棵树的最大匹配节点树越大,则两棵树越相似。在判断时,若两棵树的DOM结构相似度大于90%,则需要重新遍历并比较两棵树中各个节点的文本信息,若发生变化的节点数小于节点总数的15%,则认为新得到的Ajax状态是重