
大叔比较喜欢看动漫,一直觉得动漫版的斗罗大陆的剧情和效果都非常不错,所以一直在看。这不,春节期间,真人版斗罗大陆上映了,我第一集没有看完就放弃了,并不是说真人版的斗罗大陆拍得不好,而是和我看的动漫版有些差距,有些无法适应,如果我没有看动漫版的斗罗大陆的话,这部剧应该会一直看下去。这部剧上映也有十多天了,大家的评价还是非常高的,今天我们就来玩一下抓取豆瓣评论。
这里,我主要是使用Python
来抓取豆瓣的影评,用免费工具生成词云,下面我们就开始吧。
这里我使用的环境是Python 3.9.0
,IDE是用的
Version: 1.53.2 (user setup)
Commit: 622cb03f7e070a9670c94bae1a45d78d7181fbd4
Date: 2021-02-11T11:48:04.245Z
Electron: 11.2.1
Chrome: 87.0.4280.141
Node.js: 12.18.3
V8: 8.7.220.31-electron.0
OS: Windows_NT x64 10.0.18363
接下来,我们就分析一下豆瓣影评的网页结构
我们可以通过谷歌浏览器访问https://movie.douban.com/subject/30313969/comments
,同时可以获取到上图的网页结构,我们可以看到,评论全在id="comments
的节点下面,所以,我们需要先这个节点下面所有的comment-item
,接下来我们就编码了
开始之前,我们需要安装类库:
- requests-html
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests-html
现在,我们开始编码吧
from requests_html import HTMLSession
# 请求头
ua='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4270.0 Safari/537.36'
session = HTMLSession()
url='https://movie.douban.com/subject/30313969/comments'
res = session.get(url, headers={'User-Agent': ua})
# 查找#comments > .comment-item下的内容,查找出来是一个数组
contents= res.html.find('#comments > .comment-item')
for item in contents:
content=item.find('.comment-content')[0]
print(content.text)
我们可以看到这里已经获取到了当前页面的评论了,那么还有很多页面,我们怎么去获取下一页的评论呢?
我们在页面中可以看到后一页,如果有后一页,那么是会有这个超链接的,当我们点击后,就会跳转到https://movie.douban.com/subject/30313969/comments?start=20&limit=20&status=P&sort=new_score
去获取后一页的评论,所以,这里,我们就需要对之前的代码进行改造一下
from requests_html import HTMLSession
# 请求头
ua='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4270.0 Safari/537.36'
session = HTMLSession()
base_url='https://movie.douban.com/subject/30313969/comments'
def get_html(url):
res = session.get(url, headers={'User-Agent': ua})
html=res.html
# 查找#comments > .comment-item下的内容,查找出来是一个数组
contents= html.find('#comments > .comment-item')
for item in contents:
content=item.find('.comment-content')[0]
print(content.text)
# 查找下一页a标签
next_a=html.find('#paginator > a.next')
if len(next_a)>=1:
next_url=next_a[0].attrs['href']
full_url='{0}{1}'.format(base_url,next_url)
print(full_url)
get_html(full_url)
get_html(base_url)
现在我们运行起来会看到,一直在获取评论
获取评论基本差不多了,既然我们要分析,那么我们肯定需要把评论存下来呀,是吧?这里,我们就直接存文本吧,下面就是我的最终代码
from requests_html import HTMLSession
# 请求头
ua='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4270.0 Safari/537.36'
cookie='ll="108310"; bid=Krylp4Gu3OE; __yadk_uid=3bGWURk6qXwS8EQQlVYn85HtWRJXDK7z; __gads=ID=9038b4a23ebb4b71-222ba55a0ec60024:T=1613528741:RT=1613528741:S=ALNI_Mavp-PGrlAtx-s-B1uNFLpphPUMNw; _vwo_uuid_v2=D258751D8CEF388657C4E401FFA58ED16|27cb81b85f453cdef36b9b33268b790b; __utmz=30149280.1613544951.2.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=30149280; ap_v=0,6.0; __utmz=223695111.1613544962.2.2.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/search; __utmc=223695111; douban-fav-remind=1; ct=y; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1613551754%2C%22https%3A%2F%2Fwww.douban.com%2Fsearch%3Fq%3D%25E6%2596%2597%25E7%25BD%2597%25E5%25A4%25A7%25E9%2599%2586%22%5D; _pk_ses.100001.4cf6=*; __utma=30149280.850053847.1613528742.1613548261.1613551754.4; __utmt=1; dbcl2="233289905:eXYMRb2nULc"; ck=Ju6D; push_noty_num=0; push_doumail_num=0; __utmv=30149280.23328; __utmb=30149280.3.10.1613551754; __utma=223695111.184997682.1613528742.1613548261.1613551817.4; __utmb=223695111.0.10.1613551817; _pk_id.100001.4cf6=c5189830feab4874.1613528741.4.1613551817.1613548261.'
session = HTMLSession()
base_url='https://movie.douban.com/subject/30313969/comments'
def get_html(url):
res = session.get(url, headers={'User-Agent': ua,'Cookie':cookie})
html=res.html
# 查找#comments > .comment-item下的内容,查找出来是一个数组
contents= html.find('#comments > .comment-item')
content_lines=[]
for item in contents:
content=item.find('.comment-content')[0]
content_lines.append(content.text)
write_file(content_lines)
# 查找下一页a标签
next_a=html.find('#paginator > a.next')
if len(next_a)>=1:
next_url=next_a[0].attrs['href']
full_url='{0}{1}'.format(base_url,next_url)
print(full_url)
get_html(full_url)
def write_file(contents):
with open('content.txt','a+', encoding='utf-8') as f:
f.writelines(contents)
get_html('{0}{1}'.format(base_url,'?status=P'))
get_html('{0}{1}'.format(base_url,'?status=N'))
get_html('{0}{1}'.format(base_url,'?status=F'))
最后我就只下载了这点评论,最后,我用图悦分别按 热词权重
和 热词词频
生成了两张图
其实,我们可以借助jieba
和wordcloud
两个类库来实现分词和生成词云,但是这里为了省事,就先省略这步,后面我们就基于这两个库来自己生成词云