python爬取《囧妈》豆瓣影评并画出词云图
2020-02-08 本文已影响0人
70fa0b237415
最近在学习python爬虫的内容,就拿豆瓣影评来做一个练习。
囧妈影评爬虫目的:爬取《囧妈》这部电影点赞前20的影评,生成每篇影评的词云图
影评链接:https://movie.douban.com/subject/30306570/reviews
主要python库:requests, BeautifulSoup, jieba, wordcloud
一、爬取影评
1.导入需要的python库
import requests, csv, jieba
from bs4 import BeautifulSoup
from wordcloud import WordCloud, STOPWORDS
from imageio import imread
from sklearn.feature_extraction.text import CountVectorizer
2.分析页面的html代码
谷歌浏览器打开开发者模式查看网页代码(右键-检查可以进入开发者模式),如下图所示,我们发现每篇影评是没有完全展开的,所以我们需要获得每篇影评的链接地址,然后根据链接地址得到影评的全部内容。
开发者模式3.获得每篇影评标题、链接、点赞数并保存
如下代码中我们定义了四个函数,第一个函数根据网址返回网页内容,第二个函数获得每篇影评的点赞数,用列表来存储,第三个函数获得每篇影评的标题和链接,用字典来存储,第四个函数我们将影评内容存储到txt文件中,至此,我们就完成了爬取影评内容的函数。
# 下载后的影评保存路径
SAVE_PATH = ".\movies\{}.txt"
# 返回网页内容
def get_soup(url):
headers={
'user-agent':'Mozilla/5.0'
}
r = requests.get(url,headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
return soup
# 获得影评的支持数
def get_useful_numbers(soup):
useful_numbers = soup.find_all(title="有用")
useful_numbers_list = []
for s in useful_numbers:
useful_numbers_list.append(s.span.text.replace("\n","").replace(" ",""))
return useful_numbers_list
# 获得影评的标题和链接
def get_url_dict(soup):
reviews = soup.find_all(class_="main-bd")
url_dict = {}
for review in reviews:
title = review.find("a").text
url = review.find("a",href=True)['href']
url_dict[title] = url
return url_dict
# 将影评输出到文本文件保存
def write_to_file(title, url):
soup = get_soup(url)
pp = soup.find(id="link-report")
contents = pp.find_all("p")
with open(SAVE_PATH.format(title),'w',encoding="utf-8") as f:
for content in contents:
f.write("{}\n".format(content.text))
二、生成每篇影评的词云图
现在我们有了每篇影评的txt文件,接下来我们定义一个函数将文件中的内容生成词云图。
# 传入文件名生成词云图
def generate_wordcloud(filename):
# 获取文章内容
with open(".\movies\{}.txt".format(filename),encoding="utf-8") as f:
contents = f.read()
# 使用jieba分词,获取词的列表
contents_cut = jieba.cut(contents)
contents_list = " ".join(contents_cut)
# 制作词云图,collocations避免词云图中词的重复,mask定义词云图的形状,图片要有背景色
wc = WordCloud(stopwords=("电影","徐峥", "一个"), collocations=False,
background_color="white",
font_path=r"C:\Windows\Fonts\simhei.ttf",
width=400, height=300, random_state=42)
wc.generate(contents_list)
wc.to_file(".\movies\images\{}.png".format(filename))
# 使用CountVectorizer统计词频
cv = CountVectorizer()
contents_count = cv.fit_transform([contents_list])
# 词有哪些
list1 = cv.get_feature_names()
# 词的频率
list2 = contents_count.toarray().tolist()[0]
# 将词与频率一一对应
contents_dict = dict(zip(list1, list2))
# 输出csv文件,newline="",解决输出的csv隔行问题
with open(".\movies\csvfiles\{}.csv".format(filename), 'w', newline="") as f:
writer = csv.writer(f)
for key, value in contents_dict.items():
writer.writerow([key, value])
三、主程序与结果
我们已经定义了需要的所有函数,现在编写主程序来生成需要的词云图。
url = r"https://movie.douban.com/subject/30306570/reviews"
soup = get_soup(url)
url_dict = get_url_dict(soup)
useful_numbers_list = get_useful_numbers(soup)
i = 0
for key,value in url_dict.items():
write_to_file(useful_numbers_list[i]+"_"+key,value)
filename = useful_numbers_list[i]+"_"+key
generate_wordcloud(filename)
i+=1
运行结果如下:
囧妈影评词云图