0

【爬虫+数据清洗+可视化】用Python分析“淄博烧烤“的评论数据 - 马哥python说

 1 year ago
source link: https://www.cnblogs.com/mashukui/p/17442975.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、背景介绍

您好,我是@马哥python说 ,一枚10年程序猿。

自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。

我用Python爬取并分析了B站众多网友的评论,并得出一系列分析结论。

二、爬虫代码

2.1 展示爬取结果

首先,看下部分爬取数据:

爬取结果

爬取字段含:视频链接、评论页码、评论作者、评论时间、IP属地、点赞数、评论内容

2.2 爬虫代码讲解

导入需要用到的库:

import requests  # 发送请求
import pandas as pd  # 保存csv文件
import os  # 判断文件是否存在
import time
from time import sleep  # 设置等待,防止反爬
import random  # 生成随机数

定义一个请求头:

# 请求头
headers = {
    'authority': 'api.bilibili.com',
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    # 需定期更换cookie,否则location爬不到
    'cookie': "需换成自己的cookie值",
    'origin': 'https://www.bilibili.com',
    'referer': 'https://www.bilibili.com/video/BV1FG4y1Z7po/?spm_id_from=333.337.search-card.all.click&vd_source=69a50ad969074af9e79ad13b34b1a548',
    'sec-ch-ua': '"Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}

请求头中的cookie是个很关键的参数,如果不设置cookie,会导致数据残缺或无法爬取到数据。

那么cookie如何获取呢?打开开发者模式,见下图:

获取cookie方式

由于评论时间是个十位数:

ctime

所以开发一个函数用于转换时间格式:

def trans_date(v_timestamp):
    """10位时间戳转换为时间字符串"""
    timeArray = time.localtime(v_timestamp)
    otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    return otherStyleTime

向B站发送请求:

response = requests.get(url, headers=headers, )  # 发送请求

接收到返回数据了,怎么解析数据呢?看一下json数据结构:

json返回数据

0-19个评论,都存放在replies下面,replies又在data下面,所以,这样解析数据:

data_list = response.json()['data']['replies']  # 解析评论数据

这样,data_list里面就是存储的每条评论数据了。

接下来吗,就是解析出每条评论里的各个字段了。

我们以评论内容这个字段为例:

comment_list = []  # 评论内容空列表
# 循环爬取每一条评论数据
for a in data_list:
    # 评论内容
    comment = a['content']['message']
    comment_list.append(comment)

其他字段同理,不再赘述。

最后,把这些列表数据保存到DataFrame里面,再to_csv保存到csv文件,持久化存储完成:

# 把列表拼装为DataFrame数据
df = pd.DataFrame({
    '视频链接': 'https://www.bilibili.com/video/' + v_bid,
    '评论页码': (i + 1),
    '评论作者': user_list,
    '评论时间': time_list,
    'IP属地': location_list,
    '点赞数': like_list,
    '评论内容': comment_list,
})
# 把评论数据保存到csv文件
df.to_csv(outfile, mode='a+', encoding='utf_8_sig', index=False, header=header)

注意,加上encoding='utf_8_sig',否则可能会产生乱码问题!
下面,是主函数循环爬取部分代码:(支持多个视频的循环爬取)

# 随便找了几个"淄博烧烤"相关的视频ID
bid_list = ['BV1dT411p7Kd', 'BV1Ak4y1n7Zb', 'BV1BX4y1m7jP']
# 评论最大爬取页(每页20条评论)
max_page = 30
# 循环爬取这几个视频的评论
for bid in bid_list:
    # 输出文件名
    outfile = 'b站评论_{}.csv'.format(now)
    # 转换aid
    aid = bv2av(bid=bid)
    # 爬取评论
    get_comment(v_aid=aid, v_bid=bid)

三、可视化代码

为了方便看效果,以下代码采用jupyter notebook进行演示。

3.1 读取数据

用read_csv读取刚才爬取的B站评论数据:

读取数据

查看前3行及数据形状:

查看数据

3.2 数据清洗

处理空值及重复值:

数据清洗

3.3 可视化

3.3.1 IP属地分析-柱形图

柱形图

结论:从柱形图来看,山东位居首位,说明淄博烧烤也受到本地人大力支持,其次是四川、广东等地讨论热度最高。

3.3.2 评论时间分析-折线图

折线图

结论:从折线图来看,4月26日左右达到讨论热度顶峰,其次是5月1号即五一劳动节假期第一天,大量网友的"进淄赶烤"也制造了新的讨论热度。

3.3.3 点赞数分布-箱线图

由于点赞数大部分为0或个位数情况,个别点赞数到达成千上万,箱线图展示效果不佳,因此,仅提取点赞数<10的数据绘制箱线图。

箱线图

结论:从箱线图来看,去除超过10个点赞数评论数据之后,大部分评论集中在0-3个点赞之间,也就是只有少量评论引起网友的点赞共鸣和认可。

3.3.4 评论内容-情感分布饼图

针对中文评论数据,采用snownlp开发情感判定函数:

情感判定

情感分布饼图,如下:

饼图

结论:从饼图来看,积极和消极分别占比不到一半,说明广大网友在认可淄博烧烤现象的同时,也有大量负面讨论存在,比如讨论烧烤的价格略高、住宿条件欠佳、环境污染等负面话题。

3.3.5 评论内容-词云图

由于评论内容中存在很多"啊"、"的"、"了"等无意义的干扰词,影响高频词的提取,因此,采用哈工大停用词表作为停用词词典,对干扰词进行屏蔽:
停用词

然后,绘制词云图:

词云图

结论:从词云图来看,"淄博"、"烧烤"、"山东"、"好吃"、"城市"、"好"、"物价"等正面词汇字体较大,体现出众多网友对以「淄博烧烤」为代表的后疫情时代人间烟火的美好向往。

四、技术总结

淄博烧烤」案例完整开发流程:

  1. requests爬虫
  2. json解析
  3. pandas保存csv
  4. pandas数据清洗
  5. snownlp情感分析
  6. matplotlib可视化,含:

1)IP属地分析-柱形图Bar
2)评论时间分析-折线图Line
3)点赞数分布-箱线图Boxplot
4)评论内容-情感分布饼图Pie
5)评论内容-词云图WordCloud

五、演示视频

代码演示视频:https://www.bilibili.com/video/BV18s4y1B71z

六、完整源码

完整源码:【爬虫+数据清洗+可视化分析】舆情分析"淄博烧烤"的B站评论


我是 @马哥python说 ,持续分享python源码干货中!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK