美文网首页
python爬取《囧妈》豆瓣影评并画出词云图

python爬取《囧妈》豆瓣影评并画出词云图

作者: 70fa0b237415 | 来源:发表于2020-02-08 00:23 被阅读0次

    最近在学习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
    

    运行结果如下:

    囧妈影评词云图

    相关文章

      网友评论

          本文标题:python爬取《囧妈》豆瓣影评并画出词云图

          本文链接:https://www.haomeiwen.com/subject/dzdbxhtx.html