第28卷第3期北京电子科技学院学报
2020年9月Vol.28No.3Journal of Beijing Electronic Science and Technology Institute Sept.2020
基于爬虫和文本处理的微博舆情分析系统
*
刘子谦
1**
王志强
1,2
1.北京电子科技学院,北京市1000702.国家信息中心,北京市
100045
摘要:近年来,随着社交网络的兴起,微博自媒体对舆情演变发挥着越来越重要的作用,也给公众舆
论管理带来了新的挑战。本文针对微博舆情监控的实际需求,结合自然语言处理技术,设计并实现了基于爬虫和文本处理的微博舆情分析系统,实现多线程爬虫、多维度数据分析,并进行可视化展示。该系统可定向搜索某一社会热点话题,帮助用户全面了解网民情感态度,把握舆情发展动态。关键词:网络爬虫;自然语言处理;舆情监控;数据可视化中图分类号:TP311.56
文献标识码:A
文章编号:1672-464X (2020)3-31-09
*
基金项目:信息网络安全公安部重点实验室开放课题项目资助(No.C19614);中国博士后科学基金面上项目(2019M650606)
**作者简介:刘子谦(2001—),男,北京电子科技学院本科学生;王志强(1985—),男,讲师,博士,研究方向为网络与系统安全。
(通讯作者:王志强)
1引言
随着互联网的发展,大量网民通过自媒体平
台发表个人声音,也给舆情监控带来了新的挑战。微博上大量碎片化信息蕴含着潜在价值,通过分析可以了解民众所关心的社会热点话题,有效监控舆情动态。政府、企业也能及时引导失实言论,防止舆情进一步恶化,维护其社会公信力。
然而,一方面,微博制定的反爬虫策略限制用户访问频率,数据获取难度大;另一方面,微博语言具有碎片化、多样性、凝练性等特点
[1]
,增
大了情感分析的难度。同时由于我国互联网发展较晚,网络舆情监控方面的研究也较晚,且成果参差不齐
[2]
舆情管理。以影响力较大的“微热点”网站
为例,
其关键词搜索功能有明显缺陷,不能自定义时间段搜索数据,并且无法导出博文,不支持智能情感分析,用户只能查看该关键词对应的热度,却无法得知网友的情感动态。文章解决了以
上两个问题并针对现有舆情监控平台的缺陷进行了改进,
从博文抓取、情感分析、数据处理、可视化展示四个方面出发,设计了一个基于网络爬虫和文本处理的微博舆情分析系统。
2架构设计
本文程序包括四部分:数据抓取模块,文本
处理模块,数据分析模块和数据可视化模块。程序架构如图1所示
图1程序架构
北京电子科技学院学报2020年
2.1
数据抓取模块
数据抓取采用了网络爬虫技术,
网络爬虫技术(Web crawler )是指自动化获取网页数据程序或脚本。它从给定的网页出发,分析目标网页结构,进而获取指向其他网页的URL ,再继续选择并搜索下一个站点
[3]
。由于Python 语法结构简
洁,并拥有requests 、
selenium 等出的第三方爬虫库,
因此本文选择Python 作为爬虫语言。根据微博网站的高级搜索功能,
程序提供了多种数据筛选模式,用户可以根据内容、时间、地点、博主类型等进行定向搜索,提升数据价值和获取效率。高级搜索设置界面和数据抓取整体程序框架如图2、图3所示
图2
数据抓取流程图
图3数据抓取流程图
然而微博设计了反爬机制,用户只有登录后才能浏览微博信息。微博服务器会向登录用户
·23·
第28卷基于爬虫和文本处理的微博舆情分析系统
发送一个Cookies,当他继续访问微博其他网页时,Cookies将被浏览器添加到请求头并发送到服务器,服务器可以通过Cookies识别用户身份。因此,获取有效Cookies成为突破微博反爬虫策略的关键。
由于微博Cookies的有效时间较短(通常为几天),直接复制浏览器请求头效率低并会影响用户使用体验。针对此问题,本系统设计了账号密码登录、二维码登录、读取本地Cookies三种模拟登录机制。
微博对账号密码登录和二维码登录接口都设计了较强的反爬,前者使用算法对数据进行加密传输;后者只有用户点击“二维码登录”按钮后,才会加载二维码。本文选择了Selenium爬虫框架。Selenium是一个开源的浏览器自动化测试框架,安装对应的驱动程序后,可以操控包括Chrome、Firefox在内的主流浏览器。其特点是能模拟用户真实操作,难以被服务器判识为爬虫。同时Selenium支持多种交互模式,比如模拟鼠标点击,填充网页输入框等;也支持多种元素定位方法,如XPath、CSS、Selector等,因此能实现模拟真实用户输入密码、点击登录按钮或点击二维码登录按钮。程序只需要时刻判断当前链接变化,
即可判断用户是否登录成功。若登录成功则抓取当前Cookies。并询问用户是否存储到本地,方便下一次直接调用。具体流程图如图4所示。
为了提高抓取效率,本文使用Python的thread库实现多线程数据抓取,并在确定URL 后,根据用户设置的线程数,将任务平均分配到每个线程。微博对每个IP设置了访问频率限制,多线程访问速度过快易触发微博反爬,因此每次抓取时程序会自动设置到89免费代理网(http://www.89ip.cn/)抓取代理IP列表,每个线程使用不同的代理IP,从而有效绕开反爬,提高程序稳定性和抓取效率。
Selenium模块会调用浏览器引擎,
因此访问
图4模拟登录流程图
网页时会和真实用户一样加载图片等无用数据,导致数据抓取速度过慢,因此程序采用了更加高效的requests库。Requests是Python出的爬虫库之一,基于urllib标准库编写,拥有比urllib 库更简洁的语法,极大提高编程效率。使用re-quests库访问事先确定的URL,并发送包含User-Agent和Cookies的请求头,即可绕开微博反爬并获取网页信息。
根据微博网页的类型,程序的网页解析模块使用了BeautifulSoup库和re库(正则表达式)。BeautifulSoup库拥有lxml、html5lib、html.parser 等多种解析器,可以解析HTML格式或XML格式的数据,使之结构化格式化,进而从中提取目标信息[4]。经BeautifulSoup库解析获取的网页数据往往夹杂乱码,而Re库可以对字符串进行多种自定义处理,进一步清洗数据。在获得包括微博内容、发布时间、点赞量、评论量等信息的同时,程序还会抓取每条博文对应的博主ID,进而构造出博主主页链接。为了进一步提高数据价
·
33
·
北京电子科技学院学报2020年
值,分析关注该微博热点的发布者情况,每抓取完一页博文后,
程序会自动遍历博主链接列表,抓取所有博主的个人信息。
同时,系统设计了数据存储模块,通过创建SQLAlchemy 库中的create_engine 对象根据用户
配置连接到MySQL 数据库,实现数据存储。为了提升用户使用体验,
程序会自动在本地保存上一次的数据库用户密码配置,并创建连接。用户设置界面如图5所示,未安装数据库的用户也可选择导出到Excel
图5数据抓取流程图
2.2文本处理模块
文本情感分析(又称为倾向性分析)是对有
情感彩的主观性文本进行分析、处理、归纳和推理预测的过程
[5]
。SnowNLP 是基于深度学习
的Python 第三方库,可以方便处理中文文本,支持中文分词、词性标注、情感分析、文本分类等。其情感分析模块利用贝叶斯模型统计文本中特征词词频,进行训练和预测。由于该库的默认模型训练集是某电商评论数据,其语言特征和微博博文有很大差距,会导致程序预测结果误差较大,因此需要使用微博数据重新训练模型再进行情感分析。
为了使模型更精确,本文使用系统的“高级搜索”功能,抓取了2020年4月到7月的十二万余条微博博文,覆盖国际、科技、娱乐、社会等热点话题,也包含了最近的网络流行语。之后,使用re 库(正则表达式)对博文中数据进行处理,
删除连续字符、表情、链接等。并根据博文的情感彩,人工剔除情感不鲜明的数据,并分成两组,每两条微博间用回车隔开,分别命名为neg.txt 和pos.txt ,每个文件约有60000条微博。
利用SnowNLP 库提供的训练接口,可方便地训练模型。只需要
from snownlp import sentiment sentiment.train ('neg.txt.','pos.txt')
调用save 方法即可保存模型后,修改SnowNLP 库__init __.py 文件中的data _path 的值,使之指向刚刚训练生成的文件,即可实现默认情感分析模型的更改。经过测试,新模型的预测效果明显优于原先默认的模型。
每爬取完一张网页后,程序会循环遍历博文列表,清洗博文,去除微博特有的停用词(如“回复”,“转发”等),再调用SnowNLP 的sentiment 方法,根据训练好的模型给出情感评分,评分越
·
43·
第28卷基于爬虫和文本处理的微博舆情分析系统
高说明该文本情感“越积极”。最后将该情感评分存储到列表。
2.3数据分析模块
除了丰富的爬虫库,Python还有众多出的数据处理库,Pandas就是其中之一。Pandas经常被用于科学计算和数据分析,同时可以快速读取数据库或Excel中的数据并转换为DataFrame 类型;DataFrame是Pandas中的一个表结构的数据结构,包括三部分信息,表头,表的内容(二维矩阵),索引,这与程
序中需要表示的数据结构非常契合,而且比起EXCEL和数据库中的表,Pandas提供了大量基于DataFrame的数据分析方法以及众多与外部数据进行交换的方式[6]。在处理时间方面也有独特的数据结构:“时间序列”,能智能识别多种时间格式,从而对微博发布时间进行重采样运算,实现对博文发布量的时间统计;使用分类汇总算法可以对某一省份微博发布量进行汇总,统计微博发布的全国分布;同时Pandas核心使用Cython编写,能将列表、字典等数据类型转换为对应的C语言数据类型,有效解决Python运算速度慢的问题。因此,使用Pandas可以快速统计千万条博文的博主性别比例、博文的时间发布量等,根据博主性别分类汇总情感评分,并分别计算出男女博主的情感平均值。
2.4数据可视化模块
使用词云图实现文本数据可视化。通过词云图展示微博博文能让关键词一目了然,用户可以快速了解该关键词对应社会热点的相关信息。生成词云图的关键是提取关键词,主要通过分词、去停用词和词频统计实现。分词技术是将文本中连续的字按预先设计的算法分隔为不连续的词的过程[8]。由于中文词之间没有天然的分隔符,词边界相对模糊,甚至同一文本有多种不同的分词方式,处理难度远大于英文[9]。在众多分词库中,jieba分词效果最好,功能最为强大。拥有精准模式(无冗余)、全模式(返回全部可能的分词情况)、搜索引擎模式(在精准模式基础上对长词进行二次切分)三种分词模式,可以满足多种场合分词需求。由于微博多采用网络语言,无意义的停用词较多,本文程序将读取事先整理的停用词词典:ChineseStopWord.txt对jieba返回的分词列表进行清洗,仅保留关键词。
Wordcloud是Python的一个词云图库,可以自动统计词频,开发者只需将关键词数据以字符串格式(关键词之间用空格隔开)传入Wordcloud函数,即可生成词云图。同时该库允许用户自定义词云图形状、文字调、文字大小等。
其他数据通过图表方式展示。Pandas自带了基于Matplotlib的可视化接口,支持多种图表格式,但风格单调。Echarts是一个免费的可视化库,基于Javascript开发,可以生成动态交互式图表,并支持个性化风格设计[7]。第三方库Py-echarts能直接使用Python语言生成Echarts图表并支持pip安装。
Pyecharts生成的可交互图表为HTML格式,同时pyqt5提供了谷歌内核的QwebEngine 控件,可以将本地HTML文件加载到UI界面,最终实现动态图表展示。
3实验及结果评估
本文以“许可馨事件”为关键词,抓取3月30日到8月17日一万余条微博数据,分析博文的情感和发布量的时间变化规律,并对博主信息进行了统计。数据抓取结果如图6所示。
3.1绘制时间变化曲线
对每条博文的发布时间使用resample方法按天进行重采样,得到微博-时间统计图,如图7所示。从图中可以直观看出“许可馨事件”的热度和公众情感走向,六月份以后热度明显降低,而博文情感始终维持
在较低水平。
对微博发布时间按小时重采样,可以得到微博发布的小时分布规律和情感变化规律。如图8
·
53
·