python wordcloud 对电影《我不是潘金莲》制作词云
上个星期五(16/11/18)去看了冯小刚的最新电影《我不是潘金莲》,电影很长,有点黑色幽默。看完之后我就去知乎,豆瓣电影等看看大家对于这部电影的评价。果然这是一部很有争议的电影,无论是在知乎还是豆瓣,大家对这部电影褒贬不一,有的说拍的好,寓意深刻,具有很强的现实讽刺意味,也有的说故作矫情,是一部烂片。大家众说纷纭,那么这部电影到底怎么样呢?我想还是用事实说话比较好。我想到最近刚好我学习了一段时间的爬虫了,也知道词云可以形象地反映词语分布。所以我决定亲自动手对《我不是潘金莲》制作一个词云。
先说一下使用的工具:python2.7.12 wordcloud1.2.1 selenium2.53.6 jieba(一个中文分词工具) 分析的文本来源为豆瓣电影下《我不是潘金莲》的1.6W+评论。
selenium
是一个可以操纵浏览器的爬虫工具,对于抓取动态页面(js生成的页面)非常方便。这里之所以使用selenium的一个主要原因是,电影的评论只有在登录之后才可以全部抓取,如果使用urllib2等标准库模拟登录,因为还要处理验证码等,略显麻烦,而使用selenium则非常简便。
jieba 是一个优秀的中文分词工具,功能强大并且使用简便,这里因为涉及到中文,wordcloud对于中文的分词支持不是特别好,所以需要我们手动分词,我把这个任务交给了jieba。
制作词云的流程如下:
1.使用selenium 登录豆瓣,抓取《我不是潘金莲》下所有电影评论,并且保存到txt文件(一行是一条评论)
2. 使用jieba 对于评论进行分词,得到新的文本
3. 对于新的文本 使用wordcloud 进行制作词云
话不多说,下面直接贴代码:
# -*- coding:utf-8 -*-
'''
抓取豆瓣电影某部电影的评论
这里以《我不是潘金莲为例》
网址链接:https://movie.douban.com/subject/26630781/comments
为了抓取全部评论需要先进行登录
'''
from selenium import webdriver
import time
import codecs
import jieba
import jieba.analyse as analyse
from wordcloud import WordCloud
from scipy.misc import imread
from os import path def get_douban_comments(url):
comments_list = [] # 评论列表
login_url = 'https://accounts.douban.com/login?source=movie'
user_name = '' # 这里替换成你的豆瓣用户名
password = '' # 这里替换成你的密码
driver = webdriver.Firefox() # 启动Firefox()
driver.get(login_url)
driver.find_element_by_id('email').clear() # 清除输入框
driver.find_element_by_id('email').send_keys(user_name) # 输入用户名
driver.find_element_by_id('password').clear()
driver.find_element_by_id('password').send_keys(password) # 输入密码
captcha_field = raw_input('请打开浏览器输入验证码:') # 手动填入验证码
driver.find_element_by_id('captcha_field').send_keys(captcha_field)
driver.find_element_by_class_name('btn-submit').click() # 点击登录按钮
time.sleep(5) # 等待跳转到登录之后的页面
driver.get(url) # 定位到目标页面
driver.implicitly_wait(3) # 智能等待3秒
n = 501 # 页数
count = 10000 # 评论数目
while True:
try:
results = driver.find_elements_by_class_name('comment')
for result in results:
# author = result.find_elements_by_tag_name('a')[1].text # 作者
# vote = result.find_element_by_class_name('comment-vote').find_element_by_tag_name('span').text # 赞同数目
# time0 = result.find_element_by_class_name('comment-info').find_elements_by_tag_name('span')[1].text # 时间
comment = result.find_element_by_tag_name('p').text # 评论内容
comments_list.append(comment+u'\n')
print u"查找到第%d个评论" % count
count += 1
driver.find_element_by_class_name('next').click() # 点击下一页
print u'第%d页查找完毕!' % n
n += 1
time.sleep(4)
except Exception,e:
print e
break
with codecs.open('pjl_comment.txt','a',encoding='utf-8') as f:
f.writelines(comments_list)
print u"查找到第%d页,第%d个评论!" %(n,count) # 得到所有关键词
def get_all_keywords(file_name):
word_lists = [] # 关键词列表
with codecs.open(file_name,'r',encoding='utf-8') as f:
Lists = f.readlines() # 文本列表
for List in Lists:
cut_list = list(jieba.cut(List))
for word in cut_list:
word_lists.append(word)
word_lists_set = set(word_lists) # 去除重复元素
sort_count = []
word_lists_set = list(word_lists_set)
length = len(word_lists_set)
print u"共有%d个关键词" % length
k = 1
for w in word_lists_set:
sort_count.append(w+u':'+unicode(word_lists.count(w))+u"次\n")
print u"%d---" % k + w+u":"+unicode(word_lists.count(w))+ u"次"
k += 1
with codecs.open('count_word.txt','w',encoding='utf-8') as f:
f.writelines(sort_count) def get_top_keywords(file_name):
top_word_lists = [] # 关键词列表
with codecs.open(file_name,'r',encoding='utf-8') as f:
texts = f.read() # 读取整个文件作为一个字符串
Result = analyse.textrank(texts,topK=20,withWeight=True,withFlag=True)
n = 1
for result in Result:
print u"%d:" % n ,
for C in result[0]: # result[0] 包含关键词和词性
print C,u" ",
print u"权重:"+ unicode(result[1]) # 关键词权重
n += 1 # 绘制词云
def draw_wordcloud():
with codecs.open('pjl_comment.txt',encoding='utf-8') as f:
comment_text = f.read()
cut_text = " ".join(jieba.cut(comment_text)) # 将jieba分词得到的关键词用空格连接成为字符串
d = path.dirname(__file__) # 当前文件文件夹所在目录
color_mask = imread("F:/python2.7work/wordcloud/alice_color.png") # 读取背景图片
cloud = WordCloud(font_path=path.join(d,'simsun.ttc'),background_color='white',mask=color_mask,max_words=2000,max_font_size=40)
word_cloud = cloud.generate(cut_text) # 产生词云
word_cloud.to_file("pjl_cloud.jpg") if __name__ == '__main__':
'''
url = 'https://movie.douban.com/subject/26630781/comments?start=10581&limit=20&sort=new_score'
get_douban_comments(url)
file_name = 'pjl_comment.txt'
get_top_keywords(file_name)
'''
draw_wordcloud()
有几点需要说明:
1.使用selenium简化了登录抓取过程,但是也有一个缺点,因为需要启动浏览器,所以抓取效率就比较低,电影评论页数较多,有时会出现网页加载过慢等情况导致无法正常抓取数据。所以这里使用n,count作为标记,记录意外退出时上次抓取的位置,这样下次可以继续从上次中断的地方抓取。
2. wordcloud 默认的是英文字体,所以在WordCloud()方法中需要指定一个中文字体的位置(可以使用windows自带的中文字体,比如宋体,楷体都可以),使用font_path="字体路径"
3. selenium 如果驱动狐火浏览器的话,需要自行下载驱动(一个.exe文件),具体方法可以自行上网搜索,这里不赘述。
最后 下载的评论文本文件我已经放到我的github(https://github.com/Lyrichu/selenium/blob/master/pjl_comment.txt),有兴趣的朋友可以自己下载。最后得到的词云图如下:

python wordcloud 对电影《我不是潘金莲》制作词云的更多相关文章
- python爬取B站视频弹幕分析并制作词云
1.分析网页 视频地址: www.bilibili.com/video/BV19E… 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...
- 10分钟教你用Python玩转微信之抓取好友个性签名制作词云
01 前言+展示 各位小伙伴我又来啦.今天带大家玩点好玩的东西,用Python抓取我们的微信好友个性签名,然后制作词云.怎样,有趣吧~好了,下面开始干活.我知道你们还是想先看看效果的. 后台登录: 词 ...
- 如何用Python 制作词云-对1000首古诗做词云分析
公号:码农充电站pro 主页:https://codeshellme.github.io 今天来介绍一下如何使用 Python 制作词云. 词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视 ...
- 用python 抓取B站视频评论,制作词云
python 作为爬虫利器,与其有很多强大的第三方库是分不开的,今天说的爬取B站的视频评论,其实重点在分析得到的评论化作嵌套的字典,在其中取出想要的内容.层层嵌套,眼花缭乱,分析时应细致!步骤分为以下 ...
- Python之利用jieba库做词频统计且制作词云图
一.环境以及注意事项 1.windows10家庭版 python 3.7.1 2.需要使用到的库 wordcloud(词云),jieba(中文分词库),安装过程不展示 3.注意事项:由于wordclo ...
- python制作词云
需要模块wordcloud,pip install wordcloud安装即可.代码: , #边距background_color='black',#指定背景颜色font_path='simhei.t ...
- python wordcloud
python wordcloud 对电影<我不是潘金莲>制作词云 上个星期五(16/11/18)去看了冯小刚的最新电影<我不是潘金莲>,电影很长,有点黑色幽默.看完之后我就去知 ...
- 根据词频生成词云(Python wordcloud实现)
网上大多数词云的代码都是基于原始文本生成,这里写一个根据词频生成词云的小例子,都是基于现成的函数. 另外有个在线制作词云的网站也很不错,推荐使用:WordArt 安装词云与画图包 pip3 insta ...
- 词云wordcloud类介绍&python制作词云图&词云图乱码问题等小坑
词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信 ...
随机推荐
- 配置appium 1.6.3 for MAC
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } 安装 ...
- css3动画参数解释
@keyframes规定动画.animation 所有动画属性的简写属性,除了 animation-play-state 属性. ----------------------------------- ...
- 我需要在Web上完成一个图片上传的功能后续(+1)
微信入口施工完成.关键字识别中增加了本次活动的"关键字",在系统中增加了链接.不过,由于地址包含私密关键参数,这里隐藏,敬请原谅. 下一步,微信链接的地址页面是要对微信用户的信息进 ...
- 给libpcap增加一个新的捕包方法
libpcap是一个网络数据包捕获函数库,功能非常强大,提供了系统独立的用户级别网络数据包捕获接口,Libpcap可以在绝大多数类unix 平台下工作.大多数网络监控软件都以它为基础,著名的tcpdu ...
- perl基础:传递hash类型参数
1 如果是只有一个参数要传,且是hash,最直接想到的办法就是像传其他类型参数一样直接传, 如: subFuntion(%hash1); 2 如果有多于一个参数要传,这里假设只有一个参数的类型是h ...
- angularjs 嵌套控制器,子控制器访问父控制器
<pre> http://www.lovelucy.info/understanding-scopes-in-angularjs.html http://blog.csdn.net/jfk ...
- Java—网络技术
1 TCP Sockets基础 Sockets是一个编程抽象概念,它是网络上与另一个应用程序通信连接的句柄.Sockets编程将用户代码与TCP/IP协议堆栈的底层实现隔离开,允许用户灵活地实现自己 ...
- 利用windbg 分析IIS 的线程池w3wp程序多线程挂起问题
前几天有个朋友发个了在windows server 2008跑的IIS 跑的程序w3wp程序dmp,要我帮忙分析为何线程都挂起不运行 经过查阅资料用windbg可以调试可以输出线程的调用堆栈,但是准备 ...
- P3P设置第三方cookie解决方案
原文地址:http://blog.csdn.net/lovingprince/article/details/5984449 首先,什么是 P3P ( Platform for Privacy Pre ...
- css中的一些概念
1.伪类与伪元素 1.单冒号(:)用于 CSS3 伪类,双冒号(::)用于 CSS3 伪元素. 2.对于 CSS2 中已经有的伪元素,例如 :before,单冒号和双冒号的写法 ::before 作用 ...