基于校园BBS 的舆情系统爬虫应用研究
2016-08-17于淑云
于淑云
(福建船政交通职业技术学院信息工程系,福州350002)
基于校园BBS 的舆情系统爬虫应用研究
于淑云
(福建船政交通职业技术学院信息工程系,福州350002)
在校园BBS的基础上研究了网络爬虫程序的4个关键模块:页面抓取、页面解析、任务调度和去重模块。探讨了HTMLParser和正则表达式在解析页面时的运用方法。在处理爬取数据时,改进了任务调度算法,提高了爬取速度,并针对校园论坛BBS经关键词搜索的页面进行了爬取。
爬虫;关键词;调度算法;舆情
0 引言
随着因特网应用的日益广泛,网络安全问题日益突出。公众通过网络表达出来的情绪、态度、意见和要求的集合形成了网络舆情[1]。对于高校而言,网络舆情因其主体知识层次高、参与意识强、好奇心重,个性化鲜明等特点,与其他网络舆情相比,有较强的特殊性,这就给高校网络舆情管理带来一定的困难。高校需要及时掌握校园网络舆情的发展情况。BBS论坛,作为学生最活跃的讯息交流平台,自然而然地成为校园网络舆情信息监控的重点。可以在校园BBS论坛上增设爬虫程序,建立起一个定向于校园的舆情数据收集与提取系统,通过在论坛讨论页面爬取和设置相应热点关键词来获取数据,从而实现对校园舆情的监控。目前爬虫技术已经非常成熟,研究也非常深入,基于论坛帖刷新频率高,爬取效率低的情况,本文改进了调度算法,提高了爬取效率。
本文使用爬虫称为聚焦爬虫[2],又称主题爬虫(或专业爬虫),是“面向特定主题”的一种网络爬虫程序,即在爬取页面的时候要进行主题筛选,它尽量保证只抓取与主题相关的网页信息,主要有两个思路:一是分析已经抓取的页面的主题相关程度,相关程度较高的入库,相关程度不高的则不管;二是分析要抓取的URL的相关度,分析当前网页中的URL,若相关度满足要求则抓取该URL对应的页面。由于校园论坛不同的页面有相似的URL路径,这就为信息的抓取提供了便利。
1 使用技术
本文使用的Java的开发包HttpClient和HTMLParser[3]。HttpClient是Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。实现了所有HTTP的方法(GET,POST,PUT,HEAD等),支持自动转向,支持HTTPS协议,支持代理服务器等。HTMLParser是一个纯的Java写的HTML解析的库,它不依赖于其他的Java库文件,主要用于改造或提取HTML。HTMLParser可以根据标签和标签属性的值过滤HTML文档,也可以根据DOM的组织结构获取某个元素的父节点或者子节点。
另外,在页面解析过程中也用到了正则表达式,正则表达式根据正则表达式的值摘取指定内容中需要的内容。与HTMLParser两者结合起来可以很好地解析出课程论坛数据。
2 校园舆情系统爬虫架构设计
2.1 爬取流程
本文阐述爬取过程4个部分的内容:页面抓取模块、页面解析模块、去重模块、任务调度模块[4],其中重点阐述了去重模块和任务调度模块,爬取流程图如图1所示。页面抓取指根据搜索任务构造URL从服务器端抓取需要的页面;页面解析指使用工具分离出抓取的页面中的有用信息;去重模块利用去重算法避免抓取和解析重复内容从而提高爬虫的效率;任务调度模块负责读取待处理的任务,并根据调度算法开启多个线程调用页面抓取模块抓取需要的网页。
图1 爬取流程图
2.2 页面爬取
爬虫的基本原理是爬取一个给定的URL指向的页面。一般的爬虫程序是从爬取的页面中解析出页面中的URL,再爬取这些URL指向的内容,然后再解析出页面中的URL加入到任务列表中递归的爬取[5]。网络爬虫采用的主流爬取策略有深度优先爬取策略和广度优先爬取策略[6],基于校园页面集中的特点,本文采用的是深度优先爬取策略。搜索爬虫的URL形式固定,只需要改变URL中传递的参数的值即可获得任务列表。本文爬取的URL路径的形式为http://jxzy.fjcpc.edu.cn/meol/jpk/course/layout/newpage/index.jsp?courseId=00000。其中courseId是某门课程页面代码,默认是实时搜索,即搜索结果按时间排序。
使用HttpClient开发包中的Get方法就可以爬取构造的URL指向的内容,其中URL参数就是程序构造好的URL,程序运行之后返回的页面的内容可以把它写入到文件中保存下来留待以后解析,也可以直接交给页面解析模块解析之后直接把数据入库。
2.3 页面解析
页面解析使用的工具主要是HTMLParser开发包和正则表达式。HTMLParser可以根据标签和标签属性的值过滤HTML文档,也可以根据DOM的组织结构获取某个元素的父节点或者子节点。正则表达式则根据正则表达的值摘取指定内容中需要的内容。由于动态网页都是服务器动态生成然后返回至客户端的,因此返回的内容必然有一定的固定格式,只要找到了这一规律就可以利用程序批量的解析,校园论坛讨论就是典型的动态网站。
如图2所示,经过分析,发现所有的讨论回复内容都包含在<div id="body"><p>…</p></div>标签中,而且这个标签中的文本就是用户话题的内容,这样可以使用HTMLParser提取这组标签里面的文本,这个文本即是需要的话题内容信息。对于剩下的几条信息可以选择通过正则表达式来提取。
图2 校园论坛前端代码片段
2.4 去重模块
去重模块是对程序的优化,虽然爬到重复的用户数据在入库的时候,数据库会因为主键的约束拒绝添加冲突的内容,但是这样会大大降低程序的效率。由于用户发表言论都是按时间排序,因此我们可以选用爬过的讨论发布时间中的最大值作为标准来作为判断该页是否已经爬过的依据。为了提高效率,可以单独建立一个表存储爬过的最早时间。本文用时间作为判断是否已爬的参数,并单独建立了一个表存储这些参数。
程序在每接到一个任务时,先搜索第一页,然后解析第一页的讨论内容,解析出该讨论的发布时间后搜索去重数据库,如果没有该条记录,则记录时间为0,如果有则记录这个时间值,更新该条记录的值为解析出来的时间[7]。如果数据库中的值大于等于该页某讨论的时间,则表示该讨论之后的内容以及该页以后的内容已经爬过了,该关键词后面的搜索页面就不用爬取了,如果数据库中的值小于第一条讨论的时间,则把该页的所有讨论都入库,并爬取下一页,然后循环执行。
这一算法理想的情况可以避免爬取已经爬过的内容,但是现实情况中,论坛讨论的搜索结果在实时更新,平均几秒钟就会更新,然而程序不可能在几秒的时间内爬完没爬过的数据,这样就存在以下的情况:先爬第n页,过几秒爬第n+1页时,由于讨论内容的更新,第n+1页中包含了之前爬的第n页的讨论内容,导致重复爬取。为了尽可能解决上面提到的问题,本程序选择多线程的方法提高爬虫的速度,争取针对一个关键词开多个线程同时把多个页面爬取下来,这样就可以避免上一段提到的论坛讨论更新,导致重复爬取的问题。关键程序如下,其中dbdate是读取的数据库中的时间值,time是搜索到的发表讨论的时间,page是爬取的页数,i是每页中用户顺序号。
2.5 任务调度模块
2.5.1 并行爬取策略
任务调度模块读取管理中心配置的待处理任务文件,按照调度算法调用页面爬取模块爬取相关的页面,任务调度模块决定了爬虫程序面临多个任务时的爬取方式,对爬虫程序的效率有很重要的影响。
使用多线程爬取页面是必要的。首先,如果待处理的任务中的关键词很多,那么就必须使用多线程的方式提高爬虫程序的速度,否则就不能爬取关键词对应的所有课程内容。其次,在去重模块中也提到,如果爬虫速度太慢那么就会出现即使爬取的是不同的页面,也有可能出现重复爬取的问题,重复爬取不仅耗费了程序运行时间,更重要的是在这段时间内论坛帖在逐渐从搜索页面中清除,如果不能及时爬取下来就再也搜索不到了。
本程序的调度算法的核心思想是根据账号数目确定开启的线程的个数,保证线程开启后就可以分配到确定的本线程独有的账号,无需和其他线程竞争,与其他线程是独立的,运行完之后直接结束线程。
假如任务中有n个关键字,那么爬虫程序需要爬取n*30个页面才能爬完资源平台中需要的所有页面,目前有m个用户账号,那么从第一个关键字的第一个页面开始至第n个关键字的第30页为止,把这n*30个页面分成若干份,每份m个页面。首先是第一份,启动m个子线程,每个线程分得一个账号并且爬取一个页面,之后调度线程再同爬取第一份一样爬取下一份页面,直到爬完为止。
2.5.2 调度优化算法
以上的任务调度模块实现了基本的多关键词的调度方法,但是经过现实运行测试发现,对于一个新添加的关键词而言,第一次爬取该关键词的30个页面,这30个页面的内容都为有效内容,这说明每次爬取都是有效的。爬完一轮之后,循环爬取第二轮发现抓取的30页中往往只有前1~3页左右是新更新的,有时第二轮只能爬取3条新的信息,还不足一页,其他的都是已经爬过的,因而后面的页面尽管都爬了下来但是并没有为数据库增添多少信息,爬取这些页面是毫无意义的,为此需要设计一个算法,利用上一次爬取的页面情况决定本次爬取多少页,这可以大大调高程序的效率[7]。
以一个关键词为例说明改进的任务调度算法,初始状态设定爬取30页,首先程序开启30个线程分别爬取这30页,爬取的过程中每个线程均可将解析出的数据与去重数据库中的数据比较,判断该页是不是已经爬取过了。所有的页都爬完之后,我们选取已经爬取过的页的最小值,比如10~30页经过判断都已经爬取过了,那么取值为10,取的这个数字10就是下一轮爬取时该关键字应该爬取的页数。新的一轮爬取开始,这个关键词就只需爬取前10页。这时会出现两种情况:第一,如果发现这10页中都没有已经爬取的页,那么说明10页之后还有新的内容而我们漏掉了,说明爬取的页数少了,下次爬取时就需要适当的增加爬取的页数的个数,本算法设定如果出现这种情况,下次爬取的搜索页的个数在这次的基础上加5,如果增加之后超过30则爬取30页;第二,如果这10页中还有已经爬取的页,比如说是第9页,那么下一轮爬取时该关键词只爬取前9页的内容。
要实现以上算法,需要设计相应的数据结构,而且由于本爬虫程序采取多线程并行爬取,可能出现多个线程同时操作一个字段的情况,所以还需要考虑各线程之间同步的问题。首先,每个关键词对应一个结构体,该结构体中包含4条数据,分别是关键词、上一轮爬取时已经爬取过的页面的最小值、本轮应该爬取的页面的个数、上轮爬取的关键词对应的最新课程讨论的时间。
关键词只是在爬取之前初始化的时候设置或者任务有变动的时候添加或删除,在爬取过程中无需改动。已经爬取过的页面的最小值是通过与关键词各个页面搜索结果进行比较,然后取最小值得到的,在线程爬取的过程中需要修改。每个线程爬取一页之后,解析判断该页面是否已经被爬取过了,如果是则比较该页面号和结构体中第二个字段的值,如果页面号小于该值,则修改结构体中字段值为页面号的值,这样经过每个线程的修改,该关键字的所有页面的爬取线程结束之后,结构体第二个字段的值即为已经爬取过的页面的最小值。修改这个变量的方法需要做同步,每次只能有一个线程使用该方法修改这一数值,如果一个线程需要调用该方法而该方法被另一线程占用时,就需要等待,直到方法无线程占用再去执行,这可以通过Java中提供的synchronized关键字使用Java的同步机制来实现这一功能。应该爬取的页面的个数是在开始新的一轮爬取的时候需要修改的,修改之后的数值就是在本轮爬取时该关键词应该爬取的页面个数,这个字段的值取决于上次爬取过程中对第二个字段的修改结果,第二个字段的值如果为30(爬取之前初始化值为30)说明没有修改过,也就是说上次爬取的所有页面没有已爬的课程内容,后续的页面可能还有未爬取的,出现这一现象的原因就是该关键字相关的课程内容更新的频率增高,因此,下次爬取时需要在上次爬取的页面的个数的基础上加一个值,经过试验加5较为合适,也就是说在这种情况下,程序把第三个字段的值在之前的基础上加5,如果加5之后超过30,则取30;第二个字段的值如果为小于30的值说明该值在上次爬取过程中修改过了,说明在上次爬取的过程中该页面之后的所有页面都已经爬取过了,原因就是该关键词相关的课程内容更新的频率降低,我们程序的下次就可以少爬一些页面,所以程序把结构体的第三个字段设置为第二个字段的值。每次爬完之后都要设置该字段的值以指导下一次爬取。
3 运行效果分析
3.1 测试环境(表1)
表1 测试环境配置表
3.2 信息抓取
在具体爬取时,设置数据结构的4个字段为keyword,lastresult,pagenum,date,这4个字段的意义和操作在上面已经做了详细的说明,设置爬取的关键字为:“3.15”,如图3所示。
图3 抓取结果
4 结语
本文完成了爬虫的基本功能之后,为了提高爬虫的工作效率,又研究了任务调度优化算法。通过本次测试,程序在实际环境中运行稳定正常,爬虫程序的理论效率和实际运行效率基本相符,调度优化算法提高了程序效率。
[1]闫育周.我国高校网络舆情管理机制研究[J].西安电子科技大学学报:社会科学版,2013(4):113-117.
[2]周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005,9(25):1965-1969.
[3]汪涛,樊孝忠.链接分析对主题爬虫的改进计算机应用[J].计算机应用,2004(12):174-176.
[4]张亮.基于HTMLParser和HttpClient的网络爬虫原理与实现[J].电脑编程技巧与维护,2011(20):94.
[5]杜长燕,李祥龙.基于WEB的网络爬虫的设计[J].无线互联科技,2015,3:49-50.
[6]成功,李小正,赵全军.一种网络爬虫系统中URL去重方法的研究[J].中国新技术新产品,2014(12):23.
[7]林海霞,司海峰,张微微.基于Java技术的主题网络爬虫的研究与实现[J].技术交流,2009(2):56-58.
The Applied Study on Purpose Web Crawler in Public Opinion System Based on Campus BBS
YU Shu-yun
(Department of Informational Engineering,Fujian Chuanzheng Communication College,Fuzhou350002,China)
This paper researches the four key web crawler program modules on the basis of the campus BBS.They are climbing up the pages,parsing the pages,tasking schedulings and eliminating duplicate datas.It discusses the use of regular expressions and HTMLParser method when parsing the pages.In dealing with crawl data,the task scheduling algorithm has been improved and the speed of crawl has been raised.As well the campus BBS pages through keywords has been crawled.
purpose web crawler;key word;scheduling algorithm;public opinion
TP391
A
1009-8984(2016)02-0095-04
10.3969/j.issn.1009-8984.2016.02.024
2016-03-21
福建省教育厅A类项目(JA15661)
于淑云(1981-),女(汉),山东,讲师主要研究网络应用系统开发。