“蚁”小见大,数据告诉你《蚁人2》是否值得一看

简介:

2172396fb4e14ac3c00d2f35776fde041670e93c
并没有成功爬到所有的短评,一波三折,最终只爬到了500条,当然这也是豆瓣目前可见的最大数量,本文将细致分析爬虫的整个过程,并对爬到的数据加以分析,蚁小见大。

整篇文章共包含爬和文本分析两部分,因为爬到的数据包含信息较少,所以分析过程相对简单,包含描述统计分析、情感分析和分词词云,主要代码在各部分给出,需要完整代码和爬到的数据请在后台回复"蚁人2爬虫",可以直接运行。

1. 爬虫部分

首先说明一下目标和工具

软件:python3.6

packages:selenium jieba snownlp wordcloud

后三个是之后文本分析用的。

目标网址:

https://movie.douban.com/subject/26636712/comments?status=P

3914a64a364e66a28bea945632b402efbe54bc95

豆瓣上的影评分两种,一种是长篇大论的影评,还有一种是短评,类似上图中,这次爬虫的目标就是上图中红色框线中的短评,信息包括用户名,星级评价,日期,有用数,评论正文,虽说主页显示45576条,但其实可见的只有500条,每页是20条短评,多一条都不给,手动去点,点到25页之后就没有任何信息了。

第一遍直接用selenium去爬只爬到了200条,200条之后就自动停止了,后来检查了半天发现必须登录豆瓣上去才能看到更多的评论,然后又加了登陆的代码,后来尝试过程中登陆的太多又有了验证码,又加了一个手动输入验证码的部分,最终成功爬到了500条,因为之前没有处理过登陆相关的,所以折腾了很长时间,整体过程如下。

登陆

登陆页面是豆瓣主页https://www.douban.com/,并不是我们爬取的网站,所以首先通过selenium模拟登陆之后,再获取蚁人2短评页面进行爬虫。

通过chrome开发者工具获得账户名,密码,验证码的位置,账户名和密码直接输入,验证码获取图片后先存到本地,打开后手动输入,输入之后关掉验证码图片,代码继续执行,就登录成功了,刚开始登的时候不需要验证码。

账户名位置

40434d0376846254ecfbbd3f830d7ea59ae1ddce

代码如下:


1def gethtml(url):
2 loginurl='https://www.douban.com/' # 登录页面
3
4 browser = webdriver.PhantomJS()
5 browser.get(loginurl) # 请求登录页面
6 browser.find_element_by_name('form_email').clear() # 获取用户名输入框,并先清空
7 browser.find_element_by_name('form_email').send_keys(u'你的用户名') # 输入用户名
8 browser.find_element_by_name('form_password').clear() # 获取密码框,并清空
9 browser.find_element_by_name('form_password').send_keys(u'你的密码') # 输入密码
10
11 # 验证码手动处理,输入后,需要将图片关闭才能继续执行下一步
12 captcha_link = browser.find_element_by_id('captcha_image').get_attribute('src')
13 urllib.request.urlretrieve(captcha_link,'captcha.jpg')
14 Image.open('captcha.jpg').show()
15 captcha_code = input('Pls input captcha code:')
16 browser.find_element_by_id('captcha_field').send_keys(captcha_code)
17
18 browser.find_element_by_css_selector('input[class="bn-submit"]').click()
19 browser.get(url)
20 browser.implicitly_wait(10)
21 return(browser)

爬短评

登录之后,转到我们要爬的蚁人2短评页面,爬完一页之后,找到后页的位置click跳转到下一页继续爬,循环一直到最后一页,从开发者工具可以看到,第一页的后页xpath是"//*[@id='paginator']/a",之后每一页的后页的xpath都是"//*[@id='paginator']/a[3]",但最后一页的xpath不为这两个,因此可以通过循环的方式,第一页之后,只要"//*[@id='paginator']/a[3]"找得到,就跳转到下一页继续爬,直到找不到为止。

752f9b5b840838916dff868cf3d09c77882479db

具体爬的时候,用一个dataframe来存所有的信息,一行为一个用户的所有数据,数据位置仍然通过开发者工具获得,细节不再赘述。

代码如下:


1def getComment(url):
2 i = 1
3 AllArticle = pd.DataFrame()
4 browser = gethtml(url)
5 while True:
6 s = browser.find_elements_by_class_name('comment-item')
7 articles = pd.DataFrame(s,columns = ['web'])
8 articles['uesr'] = articles.web.apply(lambda x:x.find_element_by_tag_name('a').get_attribute('title'))
9 articles['comment'] = articles.web.apply(lambda x:x.find_element_by_class_name('short').text)
10 articles['star'] = articles.web.apply(lambda x:x.find_element_by_xpath("//*[@id='comments']/div[1]/div[2]/h3/span[2]/span[2]").get_attribute('title'))
11 articles['date'] = articles.web.apply(lambda x:x.find_element_by_class_name('comment-time').get_attribute('title'))
12 articles['vote'] = articles.web.apply(lambda x:np.int(x.find_element_by_class_name('votes').text))
13 del articles['web']
14 AllArticle = pd.concat([AllArticle,articles],axis = 0)
15 print ('第' + str(i) + '页完成!')
16
17 try:
18 if i==1:
19 browser.find_element_by_xpath("//*[@id='paginator']/a").click()
20 else:
21 browser.find_element_by_xpath("//*[@id='paginator']/a[3]").click()
22 browser.implicitly_wait(10)
23 time.sleep(3) # 暂停3秒
24 i = i + 1
25 except:
26 AllArticle = AllArticle.reset_index(drop = True)
27 return AllArticle
28 AllArticle = AllArticle.reset_index(drop = True)
29 return AllArticle

调用以上两个函数爬取数据,其实对于豆瓣上别的电影影评,估计稍微改一改也可以爬了。


1url = 'https://movie.douban.com/subject/26636712/comments?status=P'
2result = getComment(url)

最终爬下来的数据大概是这样子。

9fc78768fad84388e195cc975e098f8217256ee5

2. 文本分析

描述统计分析

首先看一看拿到的样本中各星级评价的分布情况,None表示没有星级评价。

2774adf92d96d4e1aa8ff014d022dd9865617303

整体来看,三星四星评价巨多,说明大家对于蚁人2整体评价还不错。

再来看看哪些短评大家最认可,投票数最多。

e975248a118b529c96eb419a6e42609eb5e05865

嗯,怎么说呢...

503ac3c41896c2429049cc370e00cf1861be602e

初代黄蜂女的扮演者米歇尔·菲佛也成功引起了广大影迷的注意力。

情感分析

情感分析做的比较简单,主要借助于snownlp包,对于评论的情感倾向进行评分,0-1之间,越正面的情感倾向对应的分值越高,不过根据官方说明,这里用到的模型是用购物评价数据训练出来的,用到这里可能误差会有些大, 姑且一试吧,感觉效果还可以。


1# 情感分析
2def sentiment(content):
3 s = SnowNLP(str(content))
4 return s.sentiments
5
6
7result['sentiment'] = result.comment.apply(sentiment)
8
9# 负面评价
10result.sort(['sentiment'],ascending = True)[:10][['comment','sentiment']]
11
12# 正面评价
13result.sort(['sentiment'],ascending = False)[:10][['comment','sentiment']]

先来看看正面评价,sentiment表示情感得分。

464c5b4ee576e6541d586ece2a1639774510d12e

恩,看上去正面评价基本都是高星级评分的观众给出的,有理有据,令人信服。再来看看负面评价。

d553b35b33fe3f81795937b5d36a528336121556

分词词云

通过jieba进行分词,根基TF-IDF算法提取关键词,代码及部分关键词如下。


1texts = ';'.join(result.comment.tolist())
2cut_text = " ".join(jieba.cut(texts))
3keywords = jieba.analyse.extract_tags(cut_text, topK=500, withWeight=True, allowPOS=('a','e','n','nr','ns'))
4
5
6ss = pd.DataFrame(keywords,columns = ['词语','重要性'])
7
8fig = plt.axes()
9plt.barh(range(len(ss.重要性[:20][::-1])),ss.重要性[:20][::-1],color = 'darkred')
10fig.set_yticks(np.arange(len(ss.重要性[:20][::-1])))
11fig.set_yticklabels(ss.词语[:20][::-1],fontproperties=font)
12fig.set_xlabel('Importance')
13
14alice_mask = np.array(Image.open( "yiren.jpg"))
15text_cloud = dict(keywords)
16cloud = WordCloud(
17 width = 600,height =400,
18 font_path="STSONG.TTF",
19 # 设置背景色
20 background_color='white',
21
22 mask=alice_mask,
23 #允许最大词汇
24 max_words=500,
25 #最大号字体
26 max_font_size=150,
27 #random_state=777,
28 # colormap = 'Accent_r'
29 )
30
31
32
33plt.figure(figsize=(12,12))
34word_cloud = cloud.generate_from_frequencies(text_cloud)
35plt.imshow(word_cloud)
36plt.axis('off')
37plt.show()

关键词

df222e20c85a007ae94cdc394105caa1ab3ed333

分词结果来看,"彩蛋"毫无疑问是是蚁人2中大家最关心的点。最后,以蚁人分词词云作为文章结尾!


原文发布时间为:2018-09-12

本文作者:量化小白H

本文来自云栖社区合作伙伴“CDA数据分析师”,了解相关信息可以关注“CDA数据分析师”。

相关文章
|
1月前
|
存储 安全 Java
小说阅读平台设计与实现
小说阅读平台设计与实现
|
3月前
|
存储 人工智能 安全
面向企业的 ChatGPT 究极手册:第七章到第八章
面向企业的 ChatGPT 究极手册:第七章到第八章
93 0
面向企业的 ChatGPT 究极手册:第七章到第八章
|
6月前
|
NoSQL 前端开发 数据库
架构内容 节选自《闻缺陷则喜》(此书可免费下载)
架构内容 节选自《闻缺陷则喜》(此书可免费下载)
|
7月前
|
传感器 JSON C语言
最近收集的开源项目专栏(持续更新,收好车轮,方便造车)
最近收集的开源项目专栏(持续更新,收好车轮,方便造车)
119 0
最近收集的开源项目专栏(持续更新,收好车轮,方便造车)
|
10月前
|
自然语言处理 前端开发 Java
网上投票系统的设计与实现(论文+源码)_kaic
随着全球Internet的迅猛发展和计算机应用的普及,特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长,使得人们能够随时随地的访问网络,以获取最新信息、参与网络活动、和他人在线互动。为了能及时地了解民情民意,把握人们近期关注的内容,政府机构以及各大门户网站等单位会将一些热点话题以投票的形式发布到他们的网站上面,供人们在线投票。因此,网络在线投票系统应运而生。 本文在此情况下设计了一款网上线投票系统。首先,结合实际的应用开发情况,对该系统做了详细的需求分析。然后给出该系统的结构和各功能模块的分析,通过详细的结构和数据库表的设计,最终构建出一个基于Web的、以Struts2框架和MySQ
|
11月前
|
人工智能 JSON 前端开发
Star量近8万,大火AutoGPT星标超PyTorch,网友:看清它的局限性
Star量近8万,大火AutoGPT星标超PyTorch,网友:看清它的局限性
|
uml 开发者 Windows
推荐5款冷门小工具,看一看有没有你喜欢的?
每个人的电脑中都会安装很多软件,可能还保留着很多不为人知的冷门软件。不过虽然冷门,但绝不意味着低能,相反很多冷门软件的功能十分出色。闲话少说,接下来我就给大家推荐5款冷门小工具,看一看有没有你喜欢的。
144 0
推荐5款冷门小工具,看一看有没有你喜欢的?
|
SQL 搜索推荐 测试技术
日拱一卒的意义:开源搜索引擎Typesense作者自述:每天写一点代码,写出Typesense
日拱一卒的意义:开源搜索引擎Typesense作者自述:每天写一点代码,写出Typesense
222 0
|
算法 架构师 Java
肝了三天三夜整理出这份36万字全网最牛的开源高并发编程PDF!!
在 冰河技术 微信公众号中的【高并发】专题,更新了不少文章,有些读者反馈说,在公众号中刷历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了,但就是不知道具体该看哪一篇了。相信很多小伙伴都会有这样的问题。那怎么办呢?最好的解决方案就是我把这些文章整理成PDF电子书,免费分享给大家,这样,小伙伴们看起来就方便多了。今天,我就将 冰河技术 微信公众号【高并发】专题中的文章,整理成《深入理解高并发编程(第1版)》 分享给大家,希望这本电子书能够给大家带来实质性的帮助。后续,我也会持续在 冰河技术 微信公众号中更新【高并发】专题,如果这本电子书能够给你带来帮助,请关注 冰
543 0
肝了三天三夜整理出这份36万字全网最牛的开源高并发编程PDF!!
|
存储 设计模式 Java
十一长假我肝了这本超硬核PDF,现决定开源!!
在 【冰河技术】 微信公众号中的【互联网工程】专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了,但就是不知道具体该看哪一篇了。相信很多小伙伴都会有这样的问题。那怎么办呢?最好的解决方案就是我把这些文章整理成PDF电子书,免费分享给大家,这样,小伙伴们看起来就方便多了。希望这本电子书能够给大家带来实质性的帮助。
104 0
十一长假我肝了这本超硬核PDF,现决定开源!!