前面主要介绍了爬虫的核心技术,但是对于不同的媒体类型,其舆情信息的抓取方式也会有非常大的差别。从抓取技术来看大体可以分为两类:一类可以用传统的主题爬虫技术解决,比如新闻、论坛、问答社区、博客、电子报等传统媒体,但是在这些媒体类型中抓取策略上会有一些差别,因为媒体形式会有一些差异,比如新闻和论坛媒体结构就完全不一样,虽然结构性都比较强;另一类以微博为首的社交媒体每天都有海量数据产生,传统的爬虫技术已经不能满足抓取需求,需要用分布式爬虫技术。
从舆情信息最易爆发以及全网信息集中度来看,主要集中在论坛、新闻、微博三大媒体,下面我们重点介绍爬虫技术在这三大媒体中的应用。
下面将提出一种专用于新闻网页的正则表达式解析网页的算法。这种算法避开了网页去噪技术的缺陷,简便易行,效率很高,准确性也很高。
新闻网页具有时效性强、信息量大、结构稳定、更新快、需求广泛、实用价值高等特点。考虑到这些特点,对新闻网页的处理如果按照传统的网页解析方法,不仅效率低,效果也不会理想,我们采用了基于正则表达式解析网页的算法,这种算法避开了网页去噪技术,简便易行,效率很高,准确性也很高。
各大门户网站、大部分新闻网站或者搜索引擎,都提供用户检索新闻引擎,检索后,这类新闻页面包含符合检索条件的若干条新闻记录,这些新闻记录有标题、文摘、出处以及超链,可以用来指引用户查阅新闻全文。这类新闻网页其实就是各大网站给自己站内的所有新闻网页编的“索引”。因此,只要能处理好这类有关某一主题的新闻网页,实际上就等于处理了绝大部分的与这一主题相关的网页新闻。
由于这些网页在各大网站所起的作用相似,而且功能相近,所以这类网页的结构相当稳定,而且不会受到某一个具体网站的约束,适用于大批量地统一处理。
从网页代码来看,这类网页具有非常明显的结构特征。这类网页的结构很清晰,而我们所需要的也就是那些一个个新闻信息单元里面的内容,比如新浪网和搜狐网,百度网等新闻网页就基本一样。为此,我们完全不需要按照传统的解析网页的方法来一步步地细化网页,而只需要把这些信息单元直接匹配出来即可,而且这些信息单元同样也是结构化的。
对这些结构化的信息单元进行再匹配就能得到每条新闻的所有重要信息,可以构成一个完整的新闻元数据,所以整个解析思路的核心就是直接匹配。而正则表达式完全具备了解释上述新闻元数据的匹配功能。因此,可用正则表达式来实现相关解析工作。
不过这种方法仍然存在很多问题,比如被处理的网页结构比较稳定,而且事先也要人工对网页的结构进行分析,然后才能构造正则表达式,这样算法就显得不够灵活。因此,该方法也存在应用媒体不广,智能化不高的局限性,后期维护成本较高,但可以作为类似媒体的一种处理思路。
伴随着因特网技术的不断发展,网上信息呈几何级数的增长趋势,各种媒体形式层出不穷,但BBS作为最古老的媒体形式之一,一直拥有持久旺盛的生命力,虽然使用量在下降,但仍然是当前最重要的信息发布平台之一,也是舆情监控系统的主要信息提取渠道之一。
随着网络的发展,论坛不断增加,其格式也开始变得多样化,这给网络爬虫的抓取提出了难题。下面通过分析BBS中子版块的结构特点、BBS的列表结构及帖子的共性,为爬虫抓取的设计奠定基础。
通过对主流论坛的URL分析可以看出,大部分BBS的格式有很好的层次,有清晰的目录结构,这对于爬虫进入子版块以及信息提取提供了很大的便利。对于结构性BBS,在进入主页后,会有列表显示子版块的信息,爬虫只需抓取子版块的入口地址,过滤掉广告链接和其他公共链接,子版块的URL链接搜索策略可根据BBS的这一特定进行设计。
BBS主要是用来讨论或发表信息的地方,各大论坛包含的信息形式及内容大体相同。通常爬虫抓取的信息也即帖子的信息,本文只涉及网络爬虫的抓取策略,在此只分析帖子的主要信息格式。BBS站点中通常包含了这样一些元素。
· 论坛版块:通常是BBS的入口,包含各大子版块(特定话题的讨论区域)
的入口。
· 帖子列表:通常是子版块的入口,由帖子标题、发表时间、作者、点击数及回复数组成。
· 帖子:帖子是作者关于某一主题发表的内容,分为主帖和回帖;有些论坛主帖和回帖分别显示在不同的网页;大部分论坛的回帖直接跟在主帖之后,在抓取主题正文时,可以同时抓取回复的信息。
· 作者/读者:发表帖子的人;阅读帖子的人。
BBS的数据结构和其他普通网站的格式不同,对信息提取而言,BBS的结构性比较强,有类似目录式结构的清晰脉络,可以指导爬虫爬取,但是,各个BBS的层次划分样式繁多,没有统一的规范,这对于设计出通用模板的信息抽取系统和信息提取算法的效率提出了挑战:如果采用常规的基于结构的挖掘算法,那么算法的适用范围必然受限,甚至只能用于少数BBS;如果采用基于超链接的普通挖掘算法,则没有充分利用BBS的结构特征,造成挖掘的效率低下,所以我们采用了主题爬虫,并对主题爬虫面向BBS进行模块结构优化。
现有主题爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念三种。我们采用的面向BBS信息提取的网络爬虫属于第一种情况。基于目标网页特种的爬虫所抓取的对象一般为网站或网页,可以预先设定初始抓取种子样本。
主题爬虫还需要解决的三个主要问题如下。
(1)如何描述或定义抓取目标,用来决定网页分析算法与URL搜索策略如何制定。针对BBS的主题爬虫对抓取目标是基于目标网页特征的,不同论坛的入口地址作为抓取的一个目标种子文件。
(2)对网页或数据的分析与过滤,是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在;在将BBS首页Web网页下载完成后,需要过滤其链接,根据BBS子版块URL的特征,设置一个全部匹配的正则表达式,用于对网页或数据的分析与过滤。
(3)对URL的搜索策略。网页的搜索策略可以分为深度优先、广度优先和最佳优先三种。深度优先在很多情况下会导致爬虫的陷入问题,目前常见的是广度优先和最佳优先方法。在BBS应用中主要用到的是广度优先算法。
面向BBS的爬虫是抓取论坛中帖子正文的信息,首先需要进入二级页面的帖子列表,然后对帖子的相关性进行判断,即抓取帖子的标题进行分词,和预先设定好的关键词进行匹配,如果相关则将URL放入待抓取队列,方便后面的正文抓取。
不同主题爬虫的搜索策略不同,其具体模块实现方法也不同,但主题爬虫一般都具有这三个模块的功能:页面采集模块、页面分析模块、链接过滤模块。我们根据BBS的结构特征对爬虫的框架模块进行了优化,包括页面采集模块、链接过滤模块、主题匹配模块和信息抓取模块四部分,以及辅助模块。
(1)页面采集模块:任何一个网络爬虫都必不可少的基本模块,主要任务是通过HTTP协议请求并下载WEB页面。为了充分利用BBS目录式结构和提高论坛抓取的兼容能力,BBS爬虫采用了基于广度优先的主题爬虫。
(2)链接过滤模块:主要用于过滤广告链接及一些不需要的超链接。从BBS的入口列表中获得URL后通过页面采集模块抓取其web文档,通过在XML文档中设置的正则表达式匹配规则过滤链接。
(3)主题匹配模块:主要用于判断web文档中的链接是否和需要抓取的主题相关。是基于内容相似度评价的搜索策略,通过将BBS的帖子标题分词,与搜索主题相匹配并分析其相关度,得到需要抓取的URL并存入待抓取队列。
(4)信息抓取模块:将待抓取队列中的URL取出,通过页面采集模块下载其web页面,抓取正文部分内容并存储到数据库。
(5)BBS入口列表:用于存放各大论坛的入口地址。
(6)XML文档:XML文档又称种子文件,根据前面分析知道,每个论坛的URL结构不同,这就需要对不同的论坛设置不同的链接匹配规则,即每个论坛都需要有自己的种子文件,这些种子文件通过XML文档进行管理。XML文件经行存储,存储内容主要包括不同论坛的匹配规则、编码方式及抓取的频率。
我们知道,各种论坛网站结构虽然相似,它们所使用的程序,页面布局网页制作技术,甚至页面编码都有可能会不同。由于需要准确提取相关舆情信息,以一种统一的方式处理几乎是不可能的,而机器自动学习难度大,也很难保证结果完全正确,所以我们建议可以采用针对不同类型的论坛网站提供模板的方式。
当然这也会涉及后期的维护成本问题,但论坛的种类是有限的,可能分为几类:门户网站的论坛和垂直论坛一般都是自己开发的,需要单独研究,比如新浪、搜狐、天涯、猫扑;而地方论坛大部分都基于discus的模板进行修改,所以结构会比较相似;另外还可能有一些结构特殊的论坛需要做有选择性的研究。
微博是基于人物节点之间社交关系的媒体,包括三个基本数据结构:海量用户数据、用户关系数据以及内容数据,其具有快速传播、海量增量数据等特点,很多舆情信息都是从微博中产生并快速发酵的,同时微博每日产生博文1~2亿条,有许多值得发掘和研究的数据,如何快速、全面地获取微博数据也是对传统爬虫的挑战。
微博数据虽然是结构化数据,但其结构也在动态扩展,采用非分布式的结构化数据存储显然不适用微博数据的采集了,传统通过替换高性能机器以提高爬虫性能的方式变得越来越不合理,基于Hadoop的分布式爬虫成为主要的选择,但微博爬虫仍然需要参考传统的爬虫技术,比如传统爬虫中的增量采集技术、主题采取技术、去重策略等等。微博爬虫目标在于从海量微博信息流中采集需要的数据,为舆情监测或者研究分析提供数据基础。
基于微博平台的爬虫大致可以分为:
· 全网爬虫:获取整个微博媒体的人物基本数据及其关注数据的全网爬虫。
· 内容爬虫:获取微博媒体中博文数据的内容爬虫(增量爬虫)。
· 主题爬虫:获取微博媒体中特定主题下数据的主题爬虫。
三种爬虫之间分别具有自己特有的爬行策略和应用场景。
(1)全网爬虫:微博、社交网站等社会网络,一般拥有数以亿计的人群节点,通过他们之间的社交信息,连成了巨大的社会网络,探测人物节点ID生成规则,利用人物节点之间的社交关系链向外爬行,获取社会网络上每个人物节点的基本信息,关注信息,探测出整个社会空间,避免爬虫出现陷入现象。主要用于对社交媒体数据挖掘,比如用户画布刻画等等。
(2)内容爬虫:增量爬取用户的博文数据,利用社会网络的数据访问API接口,设计面向内容数据的增量爬虫,根据待爬取的人物频道列表定时获取每个人物频道的发布信息、交互信息(转发、评论组成的信息流),并为它们设置信息流缓冲区。这部分数据属于人物节点发布、转发的信息流数据。适用于持续性研究分析以及数据挖掘。
(3)主题爬虫:根据主题分析的任务可配置性要求,设置一组配置参数(时间参数、位置参数、主题参数、人物中心性参数、人物影响力参数)。在社会网络上,筛选一组特定的人群节点,组成待检测的人物频道列表,利用部分人群节点,感知社会网络上的话题,避免陷入整体社会网络的大数据分析问题中,因为全网爬虫很难满足话题分析的实时性要求。适用于微博舆情监测的需要。
通过分析微博平台的数据获取特点之后,获取数据方式主要有两种:微博平台提供的open API和网页爬虫技术。各微博平台都提供open API方式获取数据,但是为了防止过度调用API对微博平台服务造成影响,这些微博平台都对API调用次数做出限制。如图1-9所示。
图1-9 主流微博平台的每小时API的最大调用次数
由于平台对API调用次数做出的种种限制,对于需要长时间、大数据量的微博爬虫,一般open API方式只作为获取数据的补充方式之一。微博平台的数据是开放的,不同于大部分SNS(如人人网),博主信息只对好友可见,使得采用爬虫方式获取数据变得可行。
因为新浪微博网页采用cookies方式登录,所以可以先通过模拟动态登录,进入动态网页,再获取相应的URL的HTML文件,然后解析提取所需要的数据。
除了微博网页以外,为了满足移动用户较慢的网速,微博也提供一种更为简化的页面,我们也可以利用类似的方式登录后获取数据。灵活应用多种途径最快捷地获取微博数据是微博爬虫的一项重要功能。
图
舆情监测需要对微博中特定的品牌、话题、关键词进行监测,微博主题爬虫旨在获取针对特定主题的数据,包括特定主题下的内容数据以及微博数据。主题爬虫从某个侧面来看属于对普通微博爬虫的扩展。
微博主题爬虫的四个核心技术。
(1)初始节点探测:现在通过新浪的元搜索对初始节点进行选取,元搜索返回结果具有上限,有可能无法获取大量初始节点直接影响后期扩展。解决方法:获取全网数据检索背景信息与社交信息主题相关人群。
(2)噪音去除:如何通过节点的背景信息和社交信息和主题相关度,推断出节点是否主题相关。
(3)种子节点扩展:如何利用已知的一批主题相关节点推断出其他主题相关节点。
(4)如何评估所采用的主题定位技术的性能,性能分为召回率和准确率:即定位技术所得到的节点有多少和领域相关,所有节点数占据实际领域相关节点数的比例。难点在于:很难知道所有实际领域相关节点,判断节点是否与领域相关需要人为参与,对于超大规模的数据节点非常不合适。
图1-11 微博主题爬虫的流程图
基于微博的主题爬虫中包含一个特殊的模块:主题定位模块,这个模块根据制定的主题关键词获取主题相关人物和博文,该模块采用元搜索的方式检索制定关键词获取主题相关人物和博文。
我们在主题定位模块采用布尔模型描述人物节点是否与主题相关,在社交媒体中,不仅可以通过主题定位模块选择出主题相关的节点,也可以从初始节点更具社交关系以及其他社交媒体分析技术扩展主题相关人物节点。
通过微博全网爬虫获取的最终数据可以用于社交数据研究和分析,了解消费者的画像甚至需求,如何获取社会网络中的所有人物及其关系数据?主要包括两个爬虫系统:微博人物爬虫和微博内容爬虫。
主流微博平台(twitter、新浪微博、腾讯微博等),无论用户的UID、博文、评论的MID都有数字形式的唯一表示,并且可以通过这些数字类型的唯一标示拼凑出相应的URL,登录到个人主页或者博文页面。所以传统的网页爬取方式也可以应用于微博平台数据爬取。
但微博爬虫中,关于网页解析有两个重要的问题需要解决。
(1)如何让程序能够通过微博页面的用户登录认证。可以采用模拟登录的方式来解决,即编写程序模拟实际用户在微博登录页面上的操作,最后获取可以获取数据的cookie。
(2)正确解析页面及如何提高抓取的效率。采用多线程的爬取方式可以显著提高速度。
人物爬虫是全网微博爬虫的重要组成部分,爬取模块可以整合到全网爬虫中作为子模块使用,爬取到的个人数据对于用户圈子划分、用户兴趣分析有重要作用。微博平台的每位用户或多或少都会更新自己的个人信息,发布新的微博,用户的关注及粉丝群体也在不断变化……微博个人数据爬虫旨在获取单个用户的全部信息,包括昵称、个人描述、所在地、教育背景、工作背景、所发微博等。
微博人物爬虫包括多个爬虫策略:广度优先全网爬虫、深度优先全网爬虫、UID遍历全网爬虫、内容爬虫(增量爬虫)和主题爬虫。依照不同的爬行策略进行爬取,调用数据获取模块获取数据,并通过数据预处理及数据存储模块存储获取的数据。
(1)广度优先爬取策略,该策略实现简单,初始化时选取几个领域重要的节点,避免爬行陷入特定团体内部,从用户种子节点列表中取第一个开始爬取,爬取该用户的所有原始信息,包括:用户基本信息、微博信息列表、与该用户有关系的其他用户信息列表,同时将其关注、粉丝用户经过去重加入到用户爬取列表中,以此循环,直到到达终止条件。
(2)深度优先全网爬虫策略,从初始人物节点开始,根据人物节点的用户关系数据深度遍历整个社交网络,每次爬行从待爬取队列首部取出若干待爬取节点,爬取这些人物节点的用户背景数据和用户关系数据,通过用户关系数据得到未爬取且不在待爬取队列的人物节点,并将上一步得到的人物节点插入到待爬取队列首部,直到待爬取队列以及正在爬取集合为空。
(3)UID遍历爬虫策略,该策略采用遍历用户UID的方式:新浪微博提供给每个用户一个唯一对应且不变的UID号,无论API调用还是网页解析大部分都是用UID号作为参数输入。而微博媒体的UID号目前来看,初步可以估计出上限(随着时间的推移上限也在变化,最大的UID号大约不超过30亿)。用户UID的范围在1到30亿之间,可以采用遍历所有可能UID号的方式进行数据采集。
在微博平台中,用户只有通过转发和评论微博,才能形成信息的交流,因此可以看出微博平台的内容数据具有非常重要的研究意义。在获取内容数据时需要设计相应的爬行策略达到及时发现用户新发布的微博的效果,由于内容数据的发布情况与人物的活跃度密切相关,微博内容爬虫需以人物节点为爬行目标爬行。当以人物节点为爬行目标时,微博内容爬虫需要选择适当的爬取策略,以保证近乎实时地爬取到新的微博数据。
图1-12 微博内容爬虫的爬行策略示意图
微博爬虫中的内容爬虫模块是专门用于爬取指定用户内容数据的一个主要模块。制定一个合适的内容爬虫爬行策略,能够避免遍历式爬虫会爬取所有人物节点并造成多次爬取到没有新的内容数据的人物节点这一缺点。因此可以制定一种多队列爬取策略,这种策略可以控制每个人物节点队列的爬取速度,使得更活跃的微博用户能经常被内容爬虫爬取,而使用相对较少的爬虫去爬取不活跃用户的内容数据,并且每次爬取后系统将会重新计算用户的活跃度,再次将用户分级并插入到相应的爬取队列中,以等待下一次的爬取。
内容爬虫爬取指定人物节点的内容数据。在爬取初始化时,根据人物节点的用户背景数据和用户关系数据计算人物活跃度,依据计算得到的活跃度将人物节点存入三个不同的待爬取任务队列,爬取数据时按不同频率获取三个队列中人物节点的内容数据,每个人物节点的内容数据获取完之后重新计算该人物节点的活跃度并放回队列。