APP下载

基于爬虫和文本处理的微博舆情分析系统∗

2020-12-30刘子谦王志强

北京电子科技学院学报 2020年3期
关键词:爬虫博文博主

刘子谦 王志强

1. 北京电子科技学院,北京市 100070 2. 国家信息中心,北京市 100045

1 引言

随着互联网的发展,大量网民通过自媒体平台发表个人声音,也给舆情监控带来了新的挑战。 微博上大量碎片化信息蕴含着潜在价值,通过分析可以了解民众所关心的社会热点话题,有效监控舆情动态。 政府、企业也能及时引导失实言论,防止舆情进一步恶化,维护其社会公信力。

然而,一方面,微博制定的反爬虫策略限制用户访问频率,数据获取难度大;另一方面,微博语言具有碎片化、多样性、凝练性等特点[1],增大了情感分析的难度。 同时由于我国互联网发展较晚,网络舆情监控方面的研究也较晚,且成果参差不齐[2]。 以影响力较大的“微热点”网站为例,其关键词搜索功能有明显缺陷,不能自定义时间段搜索数据,并且无法导出博文,不支持智能情感分析,用户只能查看该关键词对应的热度,却无法得知网友的情感动态。 文章解决了以上两个问题并针对现有舆情监控平台的缺陷进行了改进,从博文抓取、情感分析、数据处理、可视化展示四个方面出发,设计了一个基于网络爬虫和文本处理的微博舆情分析系统。

2 架构设计

本文程序包括四部分:数据抓取模块,文本处理模块,数据分析模块和数据可视化模块。 程序架构如图1 所示。

2.1 数据抓取模块

数据抓取采用了网络爬虫技术,网络爬虫技术(Web crawler)是指自动化获取网页数据程序或脚本。 它从给定的网页出发,分析目标网页结构,进而获取指向其他网页的URL,再继续选择并搜索下一个站点[3]。 由于Python 语法结构简洁,并拥有requests、selenium 等出色的第三方爬虫库,因此本文选择Python 作为爬虫语言。 根据微博网站的高级搜索功能,程序提供了多种数据筛选模式,用户可以根据内容、时间、地点、博主类型等进行定向搜索,提升数据价值和获取效率。 高级搜索设置界面和数据抓取整体程序框架如图2、图3 所示。

然而微博设计了反爬机制,用户只有登录后才能浏览微博信息。 微博服务器会向登录用户发送一个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 模块会调用浏览器引擎,因此访问网页时会和真实用户一样加载图片等无用数据,导致数据抓取速度过慢,因此程序采用了更加高效的requests 库。 Requests 是Python 出色的爬虫库之一,基于urllib 标准库编写,拥有比urllib库更简洁的语法,极大提高编程效率。 使用requests 库访问事先确定的URL,并发送包含User-Agent 和Cookies 的请求头,即可绕开微博反爬并获取网页信息。

根据微博网页的类型,程序的网页解析模块使用了BeautifulSoup 库和re 库(正则表达式)。BeautifulSoup 库拥有lxml、html5lib、html.parser等多种解析器,可以解析HTML 格式或XML 格式的数据,使之结构化格式化,进而从中提取目标信息[4]。 经BeautifulSoup 库解析获取的网页数据往往夹杂乱码,而Re 库可以对字符串进行多种自定义处理,进一步清洗数据。 在获得包括微博内容、发布时间、点赞量、评论量等信息的同时,程序还会抓取每条博文对应的博主ID,进而构造出博主主页链接。 为了进一步提高数据价值,分析关注该微博热点的发布者情况,每抓取完一页博文后,程序会自动遍历博主链接列表,抓取所有博主的个人信息。

同时,系统设计了数据存储模块,通过创建SQLAlchemy 库中的create_engine 对象根据用户配置连接到MySQL 数据库,实现数据存储。 为了提升用户使用体验,程序会自动在本地保存上一次的数据库用户密码配置,并创建连接。 用户设置界面如图5 所示,未安装数据库的用户也可选择导出到Excel。

2.2 文本处理模块

文本情感分析(又称为倾向性分析)是对有情感色彩的主观性文本进行分析、处理、归纳和推理预测的过程[5]。 SnowNLP 是基于深度学习的Python 第三方库,可以方便处理中文文本,支持中文分词、词性标注、情感分析、文本分类等。其情感分析模块利用贝叶斯模型统计文本中特征词词频,进行训练和预测。 由于该库的默认模型训练集是某电商评论数据,其语言特征和微博博文有很大差距,会导致程序预测结果误差较大,因此需要使用微博数据重新训练模型再进行情感分析。

为了使模型更精确,本文使用系统的“高级搜索”功能,抓取了2020 年4 月到7 月的十二万余条微博博文,覆盖国际、科技、娱乐、社会等热点话题,也包含了最近的网络流行语。 之后,使用re 库(正则表达式)对博文中数据进行处理,删除连续字符、表情、链接等。 并根据博文的情感色彩,人工剔除情感不鲜明的数据,并分成两组,每两条微博间用回车隔开,分别命名为neg.txt 和pos.txt,每个文件约有60000 条微博。利用SnowNLP 库提供的训练接口,可方便地训练模型。只需要

调用save 方法即可保存模型后,修改SnowNLP 库__init__.py 文件中的data_path 的值,使之指向刚刚训练生成的文件,即可实现默认情感分析模型的更改。 经过测试,新模型的预测效果明显优于原先默认的模型。

每爬取完一张网页后,程序会循环遍历博文列表,清洗博文,去除微博特有的停用词(如“回复”,“转发”等),再调用SnowNLP 的sentiment方法,根据训练好的模型给出情感评分,评分越高说明该文本情感“越积极”。 最后将该情感评分存储到列表。

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]。 第三方库Pyecharts 能直接使用Python 语言生成Echarts 图表并支持pip 安装。

Pyecharts 生成的可交互图表为HTML 格式,同时pyqt5 提供了谷歌内核的QwebEngine控件,可以将本地HTML 文件加载到UI 界面,最终实现动态图表展示。

3 实验及结果评估

本文以“许可馨事件”为关键词,抓取3 月30 日到8 月17 日一万余条微博数据,分析博文的情感和发布量的时间变化规律,并对博主信息进行了统计。 数据抓取结果如图6 所示。

3.1 绘制时间变化曲线

对每条博文的发布时间使用resample 方法按天进行重采样,得到微博-时间统计图,如图7所示。 从图中可以直观看出“许可馨事件”的热度和公众情感走向,六月份以后热度明显降低,而博文情感始终维持在较低水平。

对微博发布时间按小时重采样,可以得到微博发布的小时分布规律和情感变化规律。 如图8所示。 对“许可馨事件”较为关注的人群大多在夜间(20:00—0:00)发布微博。 日间情感略好于夜间。

3.2 统计热点平均情感和博主性别比例

分别计算所有博主、男性博主、女性博主的情感评分均值和博主性别比例并绘制水球图和饼图,可以粗略反映不同网民对热点事件的情感态度。 生成的图表分别如图9、图10 所示。 从中可以明显看出,网友情感比较消极,并且男性情感明显低于女性,且发文博主中超过70%为男性,男性对“许可馨事件”的关注度更高。

3.3 绘制博主分布地图

根据所在地对博主进行分类汇总并计数,即可得到该热点话题的省份关注规律。 Pyecharts提供了多种地理空间图表接口,包括世界地图、中国地图以及中国全部省份和部分城市地图,可以轻松绘制博主分布热力图。 具体效果如图11所示。

3.4 绘制词云图

去除所有博文停用词后,绘制的词云图如图12 所示。 从中可以直观看出博文的关键词。

3.5 UI 设计

UI 设计(User Interface Design)指面向电子产品的界面设计[10],用户使用体验是UI 设计的起点和终点。 优秀的UI 设计能让用户使用习惯的交互方式进行操作[11],为用户带来可靠和愉悦的交互体验。 对此,本程序设计了简单易用、美观简洁的用户操作界面,合理布局按钮,添加多个容错机制和等待交互机制,同时提高程序稳定性,解决了多种因素导致的“闪退”问题。 同时,本文对图表进行了美化处理,并将他们放到同一个页面上,直观展示各个数据特征,最终实现效果如图13 所示。

4 总结

面对复杂多变的网络舆情形势,快速准确分析舆情动态变得尤为重要。 本文使用Python 爬虫和数据处理库,设计了一套多线程舆情监控方法:将selenium 框架和requests 库同时使用,既能突破微博反爬、也保证了数据抓取的高效;使用snowNLP 训练模型对博文进行情感分析;使用运算速度更快的pandas 进行数据处理;通过pyecharts 能为用户进行可视化展示。 与此同时,本程序情感分析模型准确率、程序稳定性、数据抓取速度等有待提高,未来将优化深度学习算法,完善容错机制,进一步提升用户体验和程序实用性。

猜你喜欢

爬虫博文博主
利用网络爬虫技术验证房地产灰犀牛之说
跟着零食博主买拼多多小吃
如果孩子想当美妆博主
第一次挣钱
时尚博主谢慕梓:分享身边的美
基于Python的网络爬虫和反爬虫技术研究
利用爬虫技术的Geo-Gnutel la VANET流量采集
谁和谁好
大数据环境下基于python的网络爬虫技术
Review on Tang Wenzhi’s The Gist of Chinese Writing Gamut