利用Python开发一个爬虫爬取豆瓣上的电影评论并分析并不复杂,此前也已经开发了一些类似案例,参考此前写的一些Python爬虫和数据分析的文章。
昨天晚上带着儿子去万达影城看了《复仇者联盟3》,果然不愧是漫威的第19部电影,十年集大成之作,特效惊人,在电影院看IMAX效果amazing!散场的时候已经11点多了。今天早上问儿子看完电影之后有什么观后感,他说了一句“I am Groot”简直乐死人了!跟我我一样,看完电影之后印象最深刻的不是一身BOSS气的灭霸,不是很爷们的雷神,不是创造力惊人的钢铁侠,也不是一身正气的美队,更不是看起来很像福尔摩斯的奇异博士,反而是树人格鲁特。
由此,想知道其他人对这个电影的观感,写了一个Python爬虫来爬取豆瓣上对于这部电影的影评,然后做一下分析制作一个文字云看看。
程序简单,分为两段,一段爬影评,一段分析影评并制作文字云。
#author:hanshiqiang365
import random
import time
import requests
import jieba
import codecs
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
from scipy.misc import imread
from bs4 import BeautifulSoup
def getHtml(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
return r.text
except:
return ''
def getComment(html):
soup = BeautifulSoup(html, 'html.parser')
comments_list = []
comment_nodes = soup.select('.comment > p')
for node in comment_nodes:
comments_list.append(node.get_text().strip().replace("\n", "") + u'\n')
return comments_list
def saveCommentText(fpath):
pre_url ="https://movie.douban.com/subject/24773958/comments?"
depth = 8
with open(fpath, 'a', encoding='utf-8') as f:
for i in range(depth):
url = pre_url+'start=' + str(20 * i) + '&limit=20&sort=new_score&' +'status=P'
html = getHtml(url)
f.writelines(getComment(html))
time.sleep(1 + float(random.randint(1, 20)) / 20)
def cutWords(fpath):
text = ''
with open(fpath,'r', encoding='utf-8') as fin:
for line in fin.readlines():
line = line.strip('\n')
text += ' '.join(jieba.cut(line))
text += ' '
with codecs.open('text.txt', 'a', encoding='utf-8') as f:
f.write(text)
def drawWordcloud():
with codecs.open('text.txt',encoding='utf-8') as f:
comment_text = f.read()
color_mask = imread("pic.png")
Stopwords = [u'就是', u'电影', u'你们', u'这么', u'不过', u'但是',
u'除了', u'时候', u'已经', u'可以', u'只是', u'还是', u'只有', u'不要', u'觉得',u','u'。']
cloud = WordCloud(font_path="simhei.ttf",
background_color='white',
max_words=200,
max_font_size=200,
min_font_size=4,
mask=color_mask,
stopwords=Stopwords)
word_cloud = cloud.generate(comment_text)
image_colors = ImageColorGenerator(color_mask)
plt.imshow(cloud)
plt.axis("off")
plt.figure()
plt.imshow(cloud.recolor(color_func=image_colors))
plt.axis("off")
plt.figure()
plt.axis("off")
plt.show()
word_cloud.to_file("comment_cloud.jpg")
def main():
fpath = 'comment.txt'
saveCommentText(fpath)
cutWords(fpath)
drawWordcloud()
main()
执行程序,成功得爬取到了影评,并生成了一个文字云图,用树人格鲁特来做背景:
从文字云图上很容易看出,这部电影就是灭霸一个人的电影,抢劫6颗宝石,实现他平衡大宇宙的理念,且不说这个理念是否三观正确,他的执行力果然非同一般,在这部电影的结局他成功了,集齐了6颗宝石,一个响指毁灭了半个宇宙的生命!顺带干掉了一大堆漫威英雄。果然是超级大反派!
漫威电影想象力和创造力惊人,出人意料,期待《复仇者联盟4》!
领取专属 10元无门槛券
私享最新 技术干货