2020年12月10日第4卷第23期
现代信息科技
Modern Information Technology
Dec.2020 Vol.4 No.23
042020.12
收稿日期:2020-11-02
基于豆瓣网某系列电影数据采集与可视化分析
黄蓉,毛红霞
(四川大学锦城学院 计算机与软件学院,四川 成都  611731)
摘  要:文章基于Python 程序设计实现了对豆瓣网站上《小时代》系列电影影评、剧照、歌曲的爬取,并针对爬取的影评做出相应的数据清洗以及数据可视化的展示。通过爬取豆瓣网站电影影评及相关剧照,分析大众对电影的态度以及电影本身的特,并对影评数据进行清洗,进而通过数据可视化的具体
形式直观的展现观众的评价,从而解释某种关于影视作品的现象。
关键词:网络爬虫;数据采集;影评;可视化中图分类号:TP393.09
文献标识码:A
文章编号:2096-4706(2020)23-0004-04
Data Collection and Visual Analysis of a Series of Films Based on Douban.com
HUANG Rong ,MAO Hongxia
(School of Computer and Software ,Jincheng College of Sichuan University ,Chengdu  611731,China )
Abstract :Based on Python program design ,this paper realized crawling of film reviews ,stills and songs of Tiny Times  series
on Douban ,and made corresponding data cleaning and data visual display for crawling of film
reviews. Through crawling the film reviews and relevant stills on Douban ,analyze the public ’s attitude towards the film and the characteristics of the film itself ,and clean the film review data ,and then intuitively show the audience ’s comments through the specific form of data visualization ,so as to explain a certain phenomenon about film and television works.
Keywords :web crawler ;data collection ;film review ;visualization
0  引  言
目前国内影视行业存在一种“烂片高票房”的现象,而《小时代》这个系列电影就是“烂片高票房”的一个典型例子,从《小时代》上映后就遭到很多著名的影评人的批评,大家一致认为这部影片质量不高,但仍有大部分人选择花钱、花时间去观看。为更好的解释这一现象,笔者基于学校专业课程学习的Python 内容与网络爬虫内容,选择利用爬虫技术对电影影评、剧照以及歌曲进行爬取,对电影本身及观众感受逐一分析,并通过可视化将数据展示出来。
1  数据采集
1.1  网络爬虫技术
网络爬虫又通常被人们称为网页蜘蛛,它是用特定规则去爬取静态或者动态网页中所需要的数据或内
容的一种方法[1],换而言之网络爬虫的本质就是自动抓取网页信息的一段代码。爬取数据的基本过程可以分为四步,分别是:发送一个requests 字样请求,通过HTTP 库向目标服务器站点发送请求,等待对方服务器的响应;获取响应内容,如果服务器能做出正常响应,那么就会得到一个response 回应,里面所包含的内容便是希望得到的网页页面内容;解析网页内容,由于得到的内容可能是HTML 代码,一般需要用到正则表达式或者XPath 等等进行网页解析;保存需要的数据,
可以将内容存为文本、表格,也可以保存在数据库里。本文所用方法是基于Python 语言进行的网页数据爬取,利用Python 本身提供的众多数据库,高效、精准的进行网页抓取、网页解析、数据存储等操作[2]。
1.2  应对反爬策略
爬虫的速度是远远高于人类的速度的,所以在使用爬虫的时候会占用相当一大部分服务器的带宽,这就增大了服务器的负载,甚至在大量用户访问的情况下会造成网络拥堵,并且如果网络爬虫被滥用,会出现网络上数据内容雷同甚至一模一样的情况,使得原创作品得不到保护,于是,很多网页会设置反爬虫机制,来打破这样的局面。那么当用户真正需要爬取数据的时候,就必须对爬虫进行伪装。以下便是本项目应对反爬的策略:
(1)伪装用户代理,将请求头部User-Agent 字段改为浏览器的User-Agent 后再发送请求User-Agent
[3]。
(2)设定休眠时间,人为浏览网页总是会停顿几秒,为了使爬虫与人类相似,一般在爬取的时候会将爬虫设置特定的休眠时间从而模拟人为登录状态[4],由此会使用time 库中的sleep 函数,在Selenium 登入时模拟用户的点击延时行为。
(3)使用代理IP 访问网站,豆瓣网页在爬虫频繁登陆后会封禁该IP 一段时间,而利用代理IP ,使得同一IP 访问豆瓣服务器的频率相对减小,服务器难以检测[5],避免IP 被封。
(4)伪装Cookie ,一般情况下,网站会通过检验请求
DOI:10.19850/jki.2096-4706.2020.23.002
第23期
05
2020.12
信息中是否存在Cookie ,以及利用Cookie 的值来判断该请求到底是真实用户还是爬虫[6],所以需要
在用户某次登录时获取Cookie ,将其加入到请求头中,达到模仿用户登录获取数据的效果。1.3  模拟登录豆瓣网
模拟登录网页通常有两种方式,一种是requests 请求,一种是Selenium 模拟浏览器自动登录,本项目选择第二种方式登录豆瓣网。第一步,到登录界面的网址,利用driver= webdriver.Chrome()启动浏览器,将到的网址放入()方法中;第二步,利用driver.find_element_by_xpath()方法定位到密码登录的位置:用f 12打开开发工具,利用鼠标点击可以到其位置,代码表示为://*[@id="account"]/div[2]/div[2]/ div/div[1]/ul[1]/li[2];第三步,依次定位账号密码框,利用send_keys()输入内容,第四步,获取登录按钮的位置,click()点击登录即完成模拟登录。
主要代码为:#点击密码登陆,豆瓣登陆框默认手机号登陆
password_login=driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]')
password_login.click()#到账号框
username=driver.find_element_by_css_selector('#username')username.click()username.clear()
username.send_keys('***')time.sleep(2)#到密码框
password=driver.find_element_by_css_selector('#password')password.click()password.clear()
password.send_keys('***')time.sleep(2)#到登录框
submit=driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a')
print('准备登陆...')submit.click()time.sleep(5)
1.4  影评爬取
在影评爬取之前,需要到电影的链接,因为《小时代》系列电影有四部,所以考虑利用Selenium 定位获取四部电影的名字以及链接,在利用Selenium 自动搜索电影名称的时候,发现当跳出新窗口时,driver 定位的还是上一个窗口展现的页面,导致不能正确的输入想要的字段使得结果报错或者元素定位错误,所以利用driver.window_handles[1]切换页面句柄,让driver 自动定位到新的窗口上,最后将名字和链接存放在字典里一一对应。每部电影需要爬取前500条数据,每页有20条数据,则需要爬取25页,这里涉及到翻页处理问题,通过网页链接的规律可知,在这25页中,只有start 的值在发生变化,则可以用循环语句来代替人工翻页,
代码为:link=v+'comments?start={}&limit=20&status=P&sort =new_score'.format(page*20),这里的page 表示0到24,v 代表前面电影的链接,然后用xpath 提取所需要的内容,具体代码为:
l = s.get(url=link, headers=headers,proxies=proxies)html = l.content.decode('utf-8')
html = etree.HTML(html, parser=etree.HTMLParser (encoding='utf-8'))
#名字
host = html.xpath('//span[@class="comment-info"]/a/text()')# 评分
gra = html.xpath('//span[@class="comment-info"]/span[2]/@title')
#内容
for c in range(1, 21):
con=html.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(c))
1.5  剧照爬取
在爬取剧照时,同样涉及到翻页问题,网页链接的规律与影评一致,都是只有start 参数改变,可将翻页处理写成:url_photo=v+’photos?type=S&start={}&sortby=like&size=a&subtype=a'.format(page * 30),主要代码为:
# 解析网页
print("开始爬取{}页".format(page + 1))
response = (url_photo , headers=headers ,proxies=proxies)
if response.status_code == 200:
soup = , "lxml")
imgTags = soup.find_all("div", attrs={"class": "cover"})
# 获取图片链接以及名字        for imgTag in imgTags:
src = ("src")
name = ("data-id") + movie_name[i]
# print(src)
resp = (src , headers=headers ,proxies=proxies)
1.6  音乐爬取
音乐与影评、剧照所不同的是,四部电影音乐总和较少,一共15条,所以不涉及翻页处理,直接在音乐界面获取即可,代码为:
def get_message(response):
t.decode('utf-8')
html=etree.HTML(html,parser=etree.HTMLParser (encoding='utf-8')) res_url=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/div[2]
//a/@href')#网址 res_song=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/div[2]//a/text()')#歌名
res_text=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/
黄蓉,等:基于豆瓣网某系列电影数据采集与可视化分析
第23期现代信息科技
06
2020.12
div[2]//p/text()')#歌曲简介
return res_song,res_text,res_url
2  数据清洗
在数据收集时或者收集之后需要对其进行清洗,为后续数据可视化做准备,对此,本项目采用的数据清洗步骤为:
(1)在爬取影评时,因为数据较多,循环过程中,利用xpath 定位的节点位置有时会不一致:评分为空时节点位置是没有显示的,会导致抓取的元素为日期。为评分出错,导致后面无法分析,在抓取时直接利用循环遍历,将错误元素赋值为null ,具体代码为:
grade = []  for i in gra:      if len(i) > 4:          i = "null"
grade.append(i)
(2)影评主要由作者,评分和内容三部分组成,如果内容存在缺失,不仅会导致错位,而且会导致最终一一对应时报错,则需要对每一页内容循环遍历,如若为空列表,则赋值为null ,具体代码为:
content = []for c in range(1, 21):
con=html.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(c))
if con == []:      con = ['null']
有个叫什么代码的电影content.append(con[0])
(3)对于爬取下来的评分等级,需要进行计数处理,方便之后的可视化展示,则需要用到pandas 的value_counts()方法对等级进行计数统计,其方法可以自动忽略空值,并且也避免了if …else 的冗余。
3  数据可视化
3.1  数据可视化的作用
数据可视化的作用可以体现在多方面,而本项目则主要有以下三个作用,分别为:
(1)更加直观的参观数据,比如利用饼图来分析评分等级,繁冗的文字数据就被图形替代,能直观看到大众对电影的评价分布。
(2)统计效率更快,比如利用jieba 库分词来统计词频,与人工统计相比,速度提升了不少。
(3)更加美观的展现数据,在(2)的基础上,如果想要统计出来的词频以特定形态呈现出来,那么
就需要用到imageio 库,否则它的形状就是一个普通的矩形。
3.2  设计需求
在如今的大信息时代,数据量急剧增加,数据本身的信息价值被不断冲刷,导致有价值的信息被无价值的信息淹没,所以我们需要一种更形象、具体的方式来处理这些数据,使得有价值的信息被展现出来,而数据可视化就完全符合要求。从某种意义上来说,数据可视化就是寻数据本身
中隐藏的某种规律及现象,通过图表的方式来总结复杂数据,要比书面信息更利于人脑的吸收[7]。所以本项目对数据做了以下处理:
对爬取下来的每部电影前500条,四部共2 000条短评内容存入csv 文件,然后读取评分等级那一列数据,利用pandas 的value_counts()方法对五个不同的评分等级“很差、较差、还行、推荐、力荐”进行数据统计,由得到的统计数据绘制饼图来体现大家对《小时代》系列的评星看法。
运用jieba 库对爬取到的短评内容进行词频统计,将统计结果存入txt 文件,再利用wordcloud 库绘制词云图,然后用Matplotlib 库出现频率排行前十的词语做一个直方图的绘制。
3.3  相关技术
数据可视化部分利用codecs.open(filepath ,method ,encoding)打开文件;jieba 库进行分词便于后续利用wordcloud 做词云图,利用Imageio 控制词云图形状。最后利用matplotlib 库做数据的条形图draw_barh()、饼图draw_pie()。
3.4  具体实现3.
4.1  词频条形图
利用jieba 中文词库自动进行分词处理,并利用Counter()方法统计其出现的次数,将非中文字符的分词删除,将处理好的词频存放在文件里面并绘制频率为前十的条形图,条形图的X 轴设置为出现次数,呈现方式如图1所示。
0                200              400              600              800
很差 电影 较差 时代 还是 郭敬明没有 一个 推荐 就是
出现次数(次)
词汇
图1  高频词汇统计条形图
3.4.2  词云图
为了将之前分割的词以特定的形式呈现出来,需要使用一张背景图片来加工,利用pac_mask = imageio.imread (r'xiaoshidai.png')增加一个背景图片,并在WordCloud()中加入参数mask ,以此可自定义绘制词云图,呈现形式如图2所示。
3.4.3  饼图
由数据清洗得到大众对电影的5个等级,用这5个等级绘制出饼图,突出显示百分比最高的一个等级,呈现形式如图3所示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。