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

运行结果如下:

囧妈影评词云图
上一篇下一篇

猜你喜欢

热点阅读