豆瓣《隐秘的角落》评论爬取

引言

       我一直是不追电视剧的,一方面觉得剧集太多了没有那么多的时间去消耗,另一方面就是好的电视剧是真的没有几部(贼讨厌古装)。期末考试那段时间,看到微博、朋友圈刷爆了《隐秘的角落》,觉得那些出圈的梗 “我们一起去爬山”,“我还有机会吗”也不过如此。前几天有点无聊,然后打开视频软件,直接热度第一的就是《隐秘的角落》,本来只打算看个开头。哎呀,真香!我竟然一晚上就看了8集。直至现在,我不仅看完了电视剧,就连B站上面的细节解析、幕后花絮都刷了很多。不得不承认,是真的好看!好看的程度体现在了秦昊成为了我现阶段的男神。那么是什么原因导致这部剧能够大火呢,数据不会说谎!

爬取数据

利用 requests + xpath爬取豆瓣评价。

  1. 获取页面内容
1
2
3
4
5
6
# 爬取页面 url
douban_url = douban_url = 'https://movie.douban.com/subject/33404425/comments?status=P'
# requests 发送请求
get_response = requests.get(douban_url)
# 将的到的数据转换成文本
get_data = get_response.text
  1. 分析页面,利用Xpath Helper插件获取用户、评论的内容和评论用户的总数
1
2
3
4
5
6
# 解析页面
tree = etree.HTML(get_data)
# 用户
commentator = tree.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')
# 评论内容
comment_content = tree.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/span/text()')
  1. 获得多页评论

    观察url地址 page_url = 'https://movie.douban.com/subject/33404425/comments?start=20&limit=20&sort=new_score&status=P'可以发现,下一页的地址start值是上一页值增加20的结果,其余都不发生变化。

1
2
# 页面url
page_url = 'https://movie.douban.com/subject/33404425/comments?start={0}&limit=20&sort=new_score&status=P'.format(i*20)
  1. 将得到的数据表格化处理并保存

    DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。DataFrame的单元格可以存放数值、字符串等,这和excel表很像,同时DataFrame可以设置列名columns与行名index

1
2
name = ['用户', '评论内容']
file = pd.DataFrame(columns=name, data=content)

点击获取 代码

生成词云

  1. 解析数据

    打开上面保存的文件,将评论内容保存在content里面

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with codecs.open(r'./comment_content.cvs', 'r', 'utf-8') as csvfile:
    content = ''
    reader = csv.reader(csvfile)
    i = 0
    for file in reader:
    if(i == 0 or i == 1):
    pass
    else:
    content = content + file[1]
    i += 1
    # 去除所有评论里面多余的字符
    content = re.sub('[… “ ” ):《 》?!( 、,,。. \r\n]', '', content)
  2. 分析数据

    利用jieba库切词,去掉停用的词并统计词频,降序排列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 切词,用jieba库
    segment = jieba.lcut(content)
    # 去停用词(文本去噪)
    words_df = pd.DataFrame({'segment': segment})
    stopwords = pd.read_csv(r"./豆瓣影评/stopwords.txt", index_col=False,
    quoting=3, sep="\t", names=['stopword'], encoding='utf-8')
    words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
    # 统计词频、降序排列
    words_stat = words_df.groupby('segment').agg(计数=pd.NamedAgg(
    column='segment', aggfunc='size')).reset_index().sort_values(by='计数', ascending=False)

    stopwords.txt 文件下载:http://www.datasoldier.net/archives/636

  3. 数据可视化

    生成词云,取词频最高的前1000个词

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 做词云
    bimg = imread(r'./豆瓣影评/hhh.jpg')
    matplotlib.rcParams['figure.figsize'] = (10.0, 6.0)
    # 设置中文字体 背景颜色等
    wordcloud = WordCloud(font_path='C:/Windows/Fonts/simfang.ttf',
    mask=bimg, background_color='white', max_font_size=80)
    # 字典推导式
    word_frequence = {x[0]: x[1] for x in words_stat.head(
    1000).values} # 取词频最高的前1000个词 (词,词频)->{词:词频}
    wordcloud = wordcloud.fit_words(word_frequence)
    bimgColors = ImageColorGenerator(bimg)
    result = wordcloud.recolor(color_func=bimgColors)
    plt.axis("off")
    plt.imshow(result)
    plt.show()
    result.to_file(r'./豆瓣影评/词云.jpg')
  4. 词云展示

    背景图片是张朝阳哦!

参考链接:https://www.cnblogs.com/ctsch/p/8590551.html

点击获取 代码

总结

       通过生成的词云不难看出剧中演员的塑造能力,剧情的逻辑性和节奏性,故事的细节处理和镜头的质感都是这部国产悬疑改编网剧能够吸引人眼球的原因。当然也期待未来能有更多的好剧出现在大众视野。再次表白我男神秦昊,演技顶呱呱!


完整内容github获取:https://github.com/lemon-l/spider/tree/master/Douban%20comments

-------------本文结束感谢您的阅读-------------