爬取豆瓣《小丑》短评做词云图

一、抓取小丑的豆瓣短评

网址:https://movie.douban.com/subject/27119724/reviews?start=20
首先构造url,短评页面每页可以抓取20个评论,假如我们需要抓取第20-40个评论,我们便可以构造url:https://movie.douban.com/subject/27119724/reviews?start=40,
以此类推我们可以抓取前3060个评论:

在这里插入图片描述
分别抓取了评论用户的名称、短评的内容,点赞数目以及用户链接
抓取内容保存为文本格式,
代码如下:

import csv
import requests
from lxml import etree

class douban(object):
    def __init__(self,headers):
        self.url='https://movie.douban.com/subject/27119724/reviews?start={page}'
        self.headers=headers
        pass
    
    def get_html(self,url):
        response=requests.get(url,headers=headers)
        html=etree.HTML(response.text)
        return html
    
    def get_comments(self,html):
        short_comments=html.xpath('//h2/a/text()')#短评
        return short_comments
    
    def get_names(self,html):
        names=html.xpath('//header/a[@class="name"]/text()')#用户姓名
        return names
    
    def get_thumbs(self,html):
        thumb_ups=html.xpath('//div[@class="action"]/a[@title="有用"]/span/text()')#点赞情况
        return thumb_ups
    
    def get_userifo(self,html):
        name_urls=html.xpath('//header/a[@class="name"]/@href')#用户链接
        return name_urls
    
    def save_csv(self,d):
        with open('D:/douban.csv','a',encoding='utf-8',newline='') as f:
            writer=csv.writer(f)
            writer.writerow([d['名字'],d['评论'],d['点赞数目'],d['用户链接']])
            
    def save_txt(self,d):
        with open('D:/douban.txt','a',encoding='utf-8') as f:
            f.write(d['名字']+';'+d['评论']+';'+d['点赞数目']+';'+d['用户链接']+'\n')
    
    def main(self):
        for page in range(0,3041,20):
            url=self.url.format(page=page)
            print('开始爬取'+url)
            html=self.get_html(url)
            short_comments=self.get_comments(html)
            names=self.get_names(html)
            thumb_ups=self.get_thumbs(html)
            name_urls=self.get_userifo(html)
            d={'评论':short_comments,'名字':names,'点赞数目':thumb_ups,'用户链接':name_urls}
            for i in range(len(names)):
                d={}
                d={'评论':short_comments[i],'名字':names[i],'点赞数目':thumb_ups[i].strip('\n').strip(),'用户链接':name_urls[i]}
                self.save_txt(d)

if __name__=='__main__':
    douban=douban(headers)
    douban.main()

用pandas进行读取后如下所示:

import pandas as pd
table=pd.read_table('D:/douban.txt',sep=';')
table.columns=['用户名','短评内容','点赞数目','用户链接']
table

在这里插入图片描述

二、对短评内容做词云图

1.制作停止词库:

因为我们在评论时会有很多的语气词、副词·等,对于我们展现词频热度是无意义的干扰词。

停止词库是从网上下载下来的,有近2000多个,我还向里面添加了小丑,观后感等词语:

def make_stopdict():
    stopdict = set()
    f = open("D:/stopwords.txt","r") #网上下载来的停止词文本,近2000个,可以自己往里面添加
    lines = f.readlines()
    for l in lines:
        stopdict.add(l.strip())
    f.close()
    return stopdict
stopdict = make_stopdict()

2.分词:

将一句完整的短评语句分解成一个个词语,我使用的jieba进行分词

import jieba
import re

zhongwen_pat = re.compile(r'^[\u4e00-\u9fa5a-zA-Z]+$')#匹配中文、英文等
all_content = []
f = open("D:/douban_terms3.txt","w")
comments=table['短评内容']
for comment in comments: #tweets是从数据库中取出来的待制作词云图的文本源
    cut_list = [terms for terms in jieba.cut(comment) if zhongwen_pat.search(terms)]
    cut_set = set(cut_list)
    res_set = cut_set - stopdict
    res_list = list(res_set)
    all_content.extend(res_list)
    f.writelines(res_list)
f.close

分词之后的短评内容保存在了douban_terms3.txt文件中,格式如下所示:
在这里插入图片描述

3.提取关键词

使用的是 jieba.analyse.extract_tags来提取的关键词,关于提取 jieba.analyse.extract_tags的用法可以参照:https://blog.csdn.net/qq_40082282/article/details/103433612

import jieba.analyse

def get_top_keywords(file):
    top_word=[]
    with open(file,'r') as f:
        texts=f.read()#读取文件为整个字符串
        result=jieba.analyse.extract_tags(texts,topK=400,withWeight=True)#保留400个关键字
        for r in result:
            top_word.append(r[0])
    return top_word
top_word=get_top_keywords('D:/douban_terms3.txt')       

400个关键词如下所示:
在这里插入图片描述

4.绘制词云图

from scipy.misc import imread
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
import matplotlib.pyplot as plt
from os import path

def draw_wordcloud(txt):
    #读入一个txt文件,基于此文本知错词云图
    color_mask = imread("D:/th.jpg") #读取背景图片,
    cloud = WordCloud(
        #设置字体,不指定就会出现乱码,文件名不支持中文
        font_path="D:/FZMiaoWuJW.TTF", 
        #font_path=path.join(d,'simsun.ttc'),
        #设置背景色,默认为黑,可根据需要自定义为颜色
        background_color='white', 
        #词云形状,
        mask=color_mask,
        #允许最大词汇
        max_words=400,
        #最大号字体,如果不指定则为图像高度
        max_font_size=50,
        #画布宽度和高度,如果设置了msak则不会生效
        width=800,
        height = 600,
        margin = 2,
        #词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1
        prefer_horizontal = 0.8
    )
    wc = cloud.generate(','.join(top_word)) #产生词云,直接从字符串文本中产生词云图
    #wc = cloud.fit_words(txt) 跟以上是同一意思
    wc.to_file("D:/xiaochou_cloud.jpg") #保存图片
    #显示词云图片
    plt.imshow(wc)
    #不显示坐标轴
    plt.axis('off')
    #绘制词云
    #plt.figure(dpi = 600)
    image_colors = ImageColorGenerator(color_mask)
    #plt.imshow(wc.recolor(color_func=image_colors)) #重新上色,
    plt.show()
draw_wordcloud(top_word)

最后产生的词云图如下所示:
在这里插入图片描述
总结:做词云图共分四步:制作停止词库、分词、提取关键词、绘制词云图;基本用wordcloud和jieba就可以搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值