最近看了一部电影《绣春刀》,里面的剧情感觉还不错,本文爬取的是绣春刀电影的豆瓣影评,1000个用户的短评,共5W多字。用jieba分词,对词语的出现频率进行统计,再通过wordcloud生成词云图。
今天和小伙伴们一起梳理下具体实现的流程,具体源代码已经上传到NLP小白 公众号中,发送“词云图”,即可获取源代码。
先上图为敬,看看豆瓣的网友评论侧重哪个方面。PS:词语出现的频率越多,字体越大
具体流程如下
一、自动化爬取 豆瓣影评
第一步 安装selenium 这是一个自动化测试工具,需要浏览器来配合使用
pip install selenium
第二步 下载 ChromeDriver 这是谷歌浏览器的驱动与 selenium 一起配合使用
找到你chrome 谷歌浏览器的对应的版本驱动 下载即可,本人用的是最新版,即红框位置
解压后 把 chromedriver.exe放到 Python的Scripts目录中即可,本人用的是Anaconda ,所以直接放入Scripts 文件。
安装环境准备好了之后,就可以进行 代码 测试 了。
import time
from selenium import webdriver
movie_url="https://movie.douban.com/subject/24745500/comments"
#绣春刀的评论界面
brower = webdriver.Chrome()
brower.get(movie_url)#启动chrome 浏览器 并跳转到 movie_url 网址
运行即启动chrome浏览器
由于豆瓣用户不登陆只能爬取短评会有限制,所以我们进行用户登录
右击chrome 选择审查元素,查看网页代码的结构
具体代码:
brower.find_element_by_class_name("nav-login").click()
#找到登录按钮 进行自动登录
time.sleep(1) #延时1秒
点击后跳转到登录界面
brower.find_element_by_class_name("account-tab-account").click()
#默认是手机号登录,切换成账号密码登录
time.sleep(1)
找到 用户名和密码的框 对应的ID ,进行自动输入
user_name = 'admin' #这里替换成你的豆瓣用户名
password = 'admin123' #这里替换成你的密码
brower.find_element_by_id("username").clear()
#输入前清空下 用户名
brower.find_element_by_id("username").send_keys(user_name)
#输入用户名
brower.find_element_by_id("password").clear()
brower.find_element_by_id("password").send_keys(password)
当按钮的class 和id 都不好定位的时候 可以选择 copy selector
代码:
brower.find_element_by_css_selector("#account > div.login-wrap > div.login-right > div > div.account-tabcon-start >div.account-form > " "div.account-form-field-submit > a"
"div.account-form-field-submit > a").click()
登录后 出现 滑块验证 人为验证下 就行了,下一节 再细讲如何 自动进行滑块验证
进入短评界面后 找网页布局的规律,评论都在class=”comment” 里面的class=“short”中
然后开始爬取50页的短评,存入short[] 中
代码如下:
#后面开始 读取评论信息
n = 1 #页数
count = 0 #评论数目
i = 50 #设置要爬取的页面总数
short=[]
while True:
try:
results = brower.find_elements_by_class_name('comment')
for result in results:
comment = result.find_element_by_tag_name('p').text #评论内容
short.append(comment + u'\n')
count += 1
print(u"查找到第%d个评论" % count)
brower.find_element_by_class_name('next').click() #点击下一页
print(u'第%d页查找完毕!' % n)
n += 1
time.sleep(5)
i -= 1
print(i)
if (i < 1):
break
except Exception as e:
print(e)
最后短评都存储到short中了,接下来进行写入 xiuchundao.txt中
with open("xiuchundao.txt","w+",encoding='utf-8') as f:
# 把评论 写入xiuchundao.txt
for q in short:
f.write(q) #自带文件关闭功能,不需要再写f.close()
至此,短评内容都已经存在txt中了
二、生成 词云图
首先 安装下 需要用的jieba 分词库和WordCloud
相信小伙伴们经常遇到 pip安装失败,大部分原因都是因为,直接pip 下载的软件源是国外的,下载速度很慢,经常会下载断掉。为了解决这个问题,我们可以用国内的镜像地址。
阿里云 http://mirrors.aliyun.com/pypi/simple
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
豆瓣(douban) http://pypi.douban.com/simple
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
1、临时使用国外镜像源,添加“-i”参数
安装 jieba 分词库
pip install -i http://pypi.douban.com/simple/ jieba
安装 WordCloud
pip install -i http://pypi.douban.com/simple/ WordCloud
2.具体生成词云图代码
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerato
import matplotlib.pyplot as plt
import numpy as np
import jieba
def GetWordCloud():
path_txt = 'xiuchundao.txt' #刚才的评论文件
path_img = "am3.png" #背景图片
f = open(path_txt, 'r', encoding='UTF-8').read()
background_image = np.array(Image.open(path_img))
#结巴分词,生成字符串,如果不通过分词,无法直接生成正确的中文词云
#Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
cut_text = " ".join(jieba.cut(f))
wc = WordCloud(
#设置字体,不然会出现口字乱码,文字的路径是电脑的字体一般路径,可以换成别的
font_path="C:/Windows/Fonts/STXINGKA.TTF",#生成云图的字体
width=1000,
height=1200,#生成图片的大小
min_font_size=3,
background_color="black",
# mask参数=图片背景,必须要写上,另外有mask参数再设定宽高是无效的
mask=background_image,
).generate(cut_text)
#生成颜色值
image_colors = ImageColorGenerator(background_image)
#下面代码表示显示图片
plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
plt.show()
wc.to_file("shuchu.jpg") #生成图片保存在shuchu.jpg
if __name__ == '__main__':
GetWordCloud()
运行效果如图
小伙伴们 这整个流程走下来 是不是很简单呢。详细源代码和背景图片,公众号,回复 “词云图”,即可获取。赶快来试试吧,下一期,推送,如何爬取bi站的弹幕,生成词云图。期待你们的关注,有啥问题都可以在文章后面,给我留言。