python wordcloud 对电影《我不是潘金莲》制作词云

简介: 上个星期五(16/11/18)去看了冯小刚的最新电影《我不是潘金莲》,电影很长,有点黑色幽默。看完之后我就去知乎,豆瓣电影等看看大家对于这部电影的评价。果然这是一部很有争议的电影,无论是在知乎还是豆瓣,大家对这部电影褒贬不一,有的说拍的好,寓意深刻,具有很强的现实讽刺意味,也有的说故作矫情,是一部烂片。

上个星期五(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 进行制作词云

 话不多说,下面直接贴代码:

 

  1 # -*- coding:utf-8 -*-
  2 '''
  3 抓取豆瓣电影某部电影的评论
  4 这里以《我不是潘金莲为例》
  5 网址链接:https://movie.douban.com/subject/26630781/comments
  6 为了抓取全部评论需要先进行登录
  7 '''
  8 from selenium import webdriver
  9 import time
 10 import codecs
 11 import jieba
 12 import jieba.analyse as analyse
 13 from wordcloud import WordCloud
 14 from scipy.misc import imread
 15 from os import path
 16 
 17 def get_douban_comments(url):
 18     comments_list = [] # 评论列表
 19     login_url = 'https://accounts.douban.com/login?source=movie'
 20     user_name = '1111111'  # 这里替换成你的豆瓣用户名
 21     password = '11111111'  # 这里替换成你的密码
 22     driver = webdriver.Firefox() # 启动Firefox()
 23     driver.get(login_url)
 24     driver.find_element_by_id('email').clear() # 清除输入框
 25     driver.find_element_by_id('email').send_keys(user_name) # 输入用户名
 26     driver.find_element_by_id('password').clear()
 27     driver.find_element_by_id('password').send_keys(password) # 输入密码
 28     captcha_field = raw_input('请打开浏览器输入验证码:') # 手动填入验证码
 29     driver.find_element_by_id('captcha_field').send_keys(captcha_field)
 30     driver.find_element_by_class_name('btn-submit').click() # 点击登录按钮
 31     time.sleep(5) # 等待跳转到登录之后的页面
 32     driver.get(url) # 定位到目标页面
 33     driver.implicitly_wait(3) # 智能等待3秒
 34     n = 501 # 页数
 35     count = 10000 # 评论数目
 36     while True:
 37         try:
 38             results = driver.find_elements_by_class_name('comment')
 39             for result in results:
 40                 # author = result.find_elements_by_tag_name('a')[1].text # 作者
 41                 # vote = result.find_element_by_class_name('comment-vote').find_element_by_tag_name('span').text # 赞同数目
 42                 # time0 = result.find_element_by_class_name('comment-info').find_elements_by_tag_name('span')[1].text # 时间
 43                 comment = result.find_element_by_tag_name('p').text # 评论内容
 44                 comments_list.append(comment+u'\n')
 45                 print u"查找到第%d个评论" % count
 46                 count += 1
 47             driver.find_element_by_class_name('next').click() # 点击下一页
 48             print u'第%d页查找完毕!' % n
 49             n += 1
 50             time.sleep(4)
 51         except Exception,e:
 52             print e
 53             break
 54     with codecs.open('pjl_comment.txt','a',encoding='utf-8') as f:
 55         f.writelines(comments_list)
 56     print u"查找到第%d页,第%d个评论!" %(n,count)
 57 
 58 # 得到所有关键词
 59 def get_all_keywords(file_name):
 60     word_lists = [] # 关键词列表
 61     with codecs.open(file_name,'r',encoding='utf-8') as f:
 62         Lists = f.readlines() # 文本列表
 63         for List in Lists:
 64             cut_list = list(jieba.cut(List))
 65             for word in cut_list:
 66                 word_lists.append(word)
 67     word_lists_set = set(word_lists) # 去除重复元素
 68     sort_count = []
 69     word_lists_set = list(word_lists_set)
 70     length = len(word_lists_set)
 71     print u"共有%d个关键词" % length
 72     k = 1
 73     for w in word_lists_set:
 74         sort_count.append(w+u':'+unicode(word_lists.count(w))+u"次\n")
 75         print u"%d---" % k + w+u":"+unicode(word_lists.count(w))+ u""
 76         k += 1
 77     with codecs.open('count_word.txt','w',encoding='utf-8') as f:
 78         f.writelines(sort_count)
 79 
 80 def get_top_keywords(file_name):
 81     top_word_lists = [] # 关键词列表
 82     with codecs.open(file_name,'r',encoding='utf-8') as f:
 83         texts = f.read() # 读取整个文件作为一个字符串
 84         Result = analyse.textrank(texts,topK=20,withWeight=True,withFlag=True)
 85         n = 1
 86         for result in Result:
 87             print u"%d:" % n ,
 88             for C in result[0]: # result[0] 包含关键词和词性
 89                 print C,u"  ",
 90             print u"权重:"+ unicode(result[1]) # 关键词权重
 91             n += 1
 92 
 93 # 绘制词云
 94 def draw_wordcloud():
 95    with codecs.open('pjl_comment.txt',encoding='utf-8') as f:
 96        comment_text = f.read()
 97    cut_text = " ".join(jieba.cut(comment_text)) # 将jieba分词得到的关键词用空格连接成为字符串
 98    d = path.dirname(__file__) # 当前文件文件夹所在目录
 99    color_mask = imread("F:/python2.7work/wordcloud/alice_color.png") # 读取背景图片
100    cloud = WordCloud(font_path=path.join(d,'simsun.ttc'),background_color='white',mask=color_mask,max_words=2000,max_font_size=40)
101    word_cloud = cloud.generate(cut_text) # 产生词云
102    word_cloud.to_file("pjl_cloud.jpg")
103 
104 
105 
106 if __name__ == '__main__':
107     '''
108     url = 'https://movie.douban.com/subject/26630781/comments?start=10581&limit=20&sort=new_score'
109     get_douban_comments(url)
110     file_name = 'pjl_comment.txt'
111     get_top_keywords(file_name)
112     '''
113     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),有兴趣的朋友可以自己下载。最后得到的词云图如下:

 

 

热爱编程,热爱机器学习! github:http://www.github.com/Lyrichu github blog:http://Lyrichu.github.io 个人博客站点:http://www.movieb2b.com(不再维护)
目录
相关文章
|
2月前
|
数据采集 数据可视化 IDE
用Python获得电影数据并可视化分析
用Python获得电影数据并可视化分析
42 0
|
2月前
|
数据采集 JSON JavaScript
Python爬虫案例:抓取猫眼电影排行榜
python爬取猫眼电影排行榜数据分析,实战。(正则表达式,xpath,beautifulsoup)【2月更文挑战第11天】
70 2
Python爬虫案例:抓取猫眼电影排行榜
|
4月前
|
文字识别 API 语音技术
用Python解决女朋友看电影没字幕的需求
用Python解决女朋友看电影没字幕的需求
46 0
|
4月前
|
自然语言处理 数据可视化 Java
用Python手把手教你WordCloud可视化
用Python手把手教你WordCloud可视化
|
21天前
|
人工智能 机器人 数据挖掘
【python】电影评分数据集的分析(python实现)(源码+报告)【独一无二】
【python】电影评分数据集的分析(python实现)(源码+报告)【独一无二】
|
23天前
|
机器学习/深度学习 数据采集 算法
基于Apriori关联规则的电影推荐系统(附python代码)
这是一个基于Apriori算法的电影推荐系统概览。系统通过挖掘用户评分数据来发现关联规则,例如用户观看某部电影后可能感兴趣的其他电影。算法核心是逐层生成频繁项集并设定最小支持度阈值,之后计算规则的置信度。案例中展示了数据预处理、频繁项集生成以及规则提取的过程,具体包括用户评分电影的统计分析,如1-5部电影的评分组合。最后,通过Python代码展示了Apriori算法的实现,生成推荐规则,并给出了一个简单的推荐示例。整个过程旨在提高推荐的精准度,基于用户已评分的电影推测他们可能尚未评分但可能喜欢的电影。
基于Apriori关联规则的电影推荐系统(附python代码)
|
1月前
|
数据采集 存储 数据处理
使用Python爬取豆瓣电影影评:从数据收集到情感分析
本文演示如何使用Python爬虫获取豆瓣电影《肖申克的救赎》的影评数据并进行情感分析。首先,安装requests、BeautifulSoup、pandas和TextBlob库。接着,编写爬虫抓取评论的用户名、评分和内容,存储为DataFrame。然后,利用TextBlob进行情感分析,得到情感分数。此方法有助于分析用户对电影的反馈。
78 1
|
3月前
|
数据采集 Web App开发 数据可视化
Python爬取猫眼电影专业评分数据中的应用案例
Python爬取猫眼电影专业评分数据中的应用案例
|
3月前
|
算法 搜索推荐 Python
python协同过滤算法实现电影推荐
【1月更文挑战第3天】协同过滤是一种常用的推荐算法,它基于用户的历史行为和其他用户的行为进行推荐。在电影推荐中,协同过滤算法可以根据用户对电影的评分来推荐相似的电影给用户。
61 3
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)
【Python自然语言处理】使用逻辑回归(logistic)对电影评论情感分析实战(超详细 附源码)
98 0