基于python的豆瓣电影数据采集与分析可视化

2021-09-17 04:53张荑阳毛红霞
电子制作 2021年16期
关键词:词频爬虫云图

张荑阳,毛红霞

(四川大学锦城学院,四川成都,611731)

0 引言

网络爬虫,又被称为网页蜘蛛或者网络机器人,是指按照某种规则从网络上自动爬取用户所需内容的脚本程序。[1]本文借助爬虫技术探究目前国内影视业存在的一种“烂片高票房”的现象,以《小时代系列》电影为例,旨在了解这部电影有哪些元素吸引了观众,以及观众对这部电影的评论看法,进而分析大众对此类影片的态度。

实现电影短评数据采集后进行数据清洗和预处理,可视化部分运用WordCloud词云库结合matplotlib库绘制词云图、饼图和条形图。利用饼图来分析评分等级,繁冗的文字数据就被图形替代,能更直观看到大众对电影的评分等级分布[1]。使用词云图分析,能在频数统计的基础上,更加美观地展示数据,对于重点词语有更重点的突出展示。

1 爬虫算法设计

■1.1 相关技术

(1)Xpath库,本文解析网页的主要办法,通过request库获取网页数据后,利用Xpath解析四部电影的节点和剧名。它提供了十分简洁明了的路径选择表达式,基本所有定位的节点可用通过Xpath来选择。

(2)selenium库,Selenium WebDriver是开源API的集合,可以用于自动测试Web应用程序,并可以在大多数Web浏览器上运行,在爬虫中也有着很好的应用[2]。本文通过selenium自动化模拟登陆操作,与豆瓣网站建立联系。

(3)multiprocessing.dummy库,导入Pool模块,以相同API实现多线程爬取四部电影的热门短评,借助Pool.map()实现线程顺序执行,提高了算法的运行效率。

(4)wordcloud库,一款展示词云图的第三方库,以词语为基本单位,当某一个词语的词频越高时,展示在词云图中的该词语显示越大。

(5)jieba库,一款用来实现分词的第三方库,其语料基于人民日报,冗余度较低,返回中文文本分词后的列表变量,支持三种分词模式:精确模式,全模式,搜索引擎模式。本文主要使用lcut()精确分词模式并导入自定义文档来对短评内容做中文文本分析。

(6)matplotlib.pyplot库,pyplot 子模块提供 bar()函数和pie()函数分别绘制条形图和饼图,还提供show()函数显示正在处理的当前图形。

■1.2 应对反爬虫策略

(1)使用代理IP,豆瓣网站在爬虫程序频繁发起请求后会采取封号策略,除了更换WiFi网络,还可以使用代理IP,给request.get()方法内添加proxies参数。

(2)selenium模拟登陆,完成登陆操作后借助request.Session()记录登陆状态。

(3)使用time库中的sleep函数,进行强制休眠,在selenium登入时模拟用户的点击延时行为。经多次测试,该方法可以有效地应对豆瓣网站的反爬虫策略。

(4)伪装User-Agent,User agent是HTTP协议的中的一个字段,其作用是描述发出HTTP请求的终端的一些信息,通过编写请求头headers,写入浏览器UA,设置操作系统为“Windows NT 6.1;Win64;x64”,向豆瓣网站发送带headers参数的GET请求。

■1.3 selenium库模拟浏览器操作登陆

依托于聚焦网络爬虫技术,对网页的数据内容进行抓取与分析,可以快速过滤掉与主题无关的URL地址[3]。利用聚焦网络爬虫技术,通过获取初始URL,依据搜索策略来确定下一步爬取所需的URL,过滤与爬取目标无关的链接,需要将已爬取的URL地址存入到一个URL列表中,用以判定爬取的进程和避免重复爬取。具体实现通过按键f12打开Chrome开发者工具审查元素,找到需要定位的元素,右键复制xpath路径。登陆界面网址的获取则需要通过网络面板(Network)记录的操作信息进行提取。

在已安装Chromedriver.exe的前提下使用Selenium库完全模拟浏览器的操作,模拟用户登陆、点击、下拉、切换窗口等一系列操作,此处导入time包采用休眠的方式强制等待,首先获取登入界面的url“https://accounts.douban.com/passport/login”通过Xpath方式定位账号密码方式登陆选项,使用click()方法点击选择,再进行对账号框和密码框以及提交信息按钮的元素定位,使用send_keys()方法传入账号和密码,点击触发登陆成功事件。在未登录豆瓣账号的情况下,翻页行为上限为10次,每页20条评论,爬取结果限制在200条,而登陆状态下翻页则不受到限制。

■1.4 Xpath解析网页

通过分析电影短评界面的URL变化,掌握翻页规律,在进行翻页操作时,网页URL更改的部分是从“?”到“#”之间的参数部分,参数间以“&”作为分隔符,为爬取影评所需的搜索部分、查询部分。

短评第一页URL参数部分:start=20&limit=20&statu s=P&sort=new_score

短评第二页URL参数部分:start=40&limit=20&statu s=P&sort=new_score

每一次翻页操作后,start增加20,每页仅显示20条短评,在代码中以format格式化函数实现:'start={}&limi t=20&status=P&sort=new_score'.format(page*20)

使用xpath中的@href和text()表达式分别定位四部电影节点下的对应链接和电影剧名,存为字典类型,创建4个线程顺序爬取4步电影的短评内容。

■1.5 文本数据清洗和数据预处理

筛选电影短评中的“热门”标签,以分析URL变化规律的方式顺序采集数据,爬取到的目标短评数据一共2000行,4列,列名分别为code、host、grade、content。第一列“code”是对每一行数据进行编号,为int类型,第二列“host”是短评人的用户名,第三列“grade”是电影的评分等级,其评分等级只有六种数据:很差、较差、还行、推荐、力荐和NULL,第四列“content”是短评内容,为文本数据。

数据清洗,从概念上讲是基于目标数据,通过采用不同的数据检测、审查、处理、校验方法,实现数据纠错,清除原数据中“脏”的信息,如一些统计调查中的无效值、缺失值、重复数据、异常数据等。[4]其中评分等级和短评内容是本文可视化分析的基本数据,需要进行文本数据清洗,去除空值等无效评论。使用codecs模块指定以utf-8编码方式打开短评文件,使用codecs.open()方法读取文件内容时候,会自动转换为内部的unicode,一般情况下不会出现编码转换失败读取错误的问题[2]。

为了更精准地展示词云图和直方图,另创自定义文档,内容是电影特定名词例如“郭敬明、杨幂、陈学冬”等电影人物名字,使用jieba.load_userdict()加载自定义文档,利用jieba库lcut()来实现对句子的最高精度划分,从分词结果中剔除例如“我们”,“你们”,“因为”,“所以”,“这个”,“那个”等代词、冠词、连词这类语法型词汇,再借助collections模块Counter()方法实现词频及常用词频度统计,词频统计结果存为txt文档,便于可视化模块使用。

2 爬取结果可视化

■2.1 词云图绘制

使用wordcloud库和imageio融合图形图片绘制词频统计词云图,以剧中四位主角剪影做为背景图形绘制词云图,来展示观影者对四部电影的评价,首先导入词云背景图,设置词云图能显示的最大显示单词数为1000,指定显示字体,设置画布大小,关闭横纵坐标显示,保存为PNG格式的图片文件。词云图绘制结果如图1所示。

图1 电影短评词云图

■2.2 饼图绘制

饼图的绘制主要使用到了matplotlib中的基础绘图pie()方法,按照列表名索引方式提取短评数据中的评分等级列,使用列表生成式对评分等级列中非空值的出现次数进行计数统计:list=[grade.value_counts()[i] for i in range(5)]并存为列表变量。传入统计数据值和统计数据标签,pie()方法中传入参数autopct="%1.2f%%"自动计算百分比,设置shadow=True阴影显示和explode突出显示比重最大的评分等级来实现图像优化,添加标签值,保存饼图为PNG格式的图片文件。饼图绘制结果如图2所示。

图2 电影评分等级饼图

■2.3 条形图绘制

根据词频统计结果以绘制条形图的模式[3],得到更清晰、明了的词频统计结果。使用matplotlib的子模块pyplot中的bar()方法绘制条形图,首先设置图标跨行跨列,以split()方法以空格作为分隔符切割词语与频数,分别存入已定义的列表中。再以切片的方式提取词频统计结果前20项词语,显示透明度设置为0.8,设置标题和坐标轴名称字体大小,同样保存为PNG格式的图片文件。词频条形图绘制结果如图3所示。

图3 词频条形图

■2.4 可视化结果分析

系列电影《小时代》是由郭敬明执导,杨幂、柯震东、郭采洁、郭碧婷等领衔主演的青春时尚都市电影。同时该电影也是导演郭敬明同名小说的改编作品,小说读者基数大,有部分小说阅读者同时也是电影观影者。前20项高频词语中,郭敬明、顾里、杨幂和四娘这类人名词语出现次数较多。观影评分很差和较差比重最大,其次是推荐和力荐。

根据饼图展示结果,大部分观影者对于该系列电影的评价偏向负面,近半观影者给出最低评价“很差”,电影整体评分较低。由词云图结果和条形图结果显示,电影的明星效应和改编自知名小说这两个特性对大众有一定吸引力,观影者对于电影选角、演员演技和电影剧情有偏好和选择,系列电影《小时代》的剧情不能满足部分观影者的需求。

3 结语

本文基于豆瓣网站《小时代系列》电影短评,利用python中的selenium库实现了模拟登陆、Xpath模块解析网页、request库构造请求、jieba库分词等爬虫技术。介绍了算法的具体设计流程,详细描述了数据可视化部分,并展示结果。使用了多线程对爬取需要翻页的短评内容进行运行速度的提升。本次对豆瓣网站系列电影《小时代》的爬取实现,证明了网络规则越来越规范,便利了爬虫获取数据,爬虫可以简单快速地实现多种任务,它拥有更加广阔的应用前景[4]。若目标是更全面地分析大众对该类影片的看法,可根据本文使用的爬虫方法扩大爬取广度,采集同类标签影片的评论数据和评分数据,以及加深爬取深度,分析受众人群特征,实现更全面的分析。

猜你喜欢
词频爬虫云图
利用网络爬虫技术验证房地产灰犀牛之说
利用精密卫星星历绘制GNSS卫星云图
基于Python的网络爬虫和反爬虫技术研究
基于Scrapy框架的分布式网络爬虫的研究与实现
谁抢走了低价机票
CAD派客云图发布V2.2.0版本
词频,一部隐秘的历史
云图青石板
汉语音节累积词频对同音字听觉词汇表征的激活作用*
怎样识读卫星云图