爬虫实战:爬取B站视频弹幕 (python)

文章目录

  • 一、需求
  • 二、网页分析
    • 2.1 找到弹幕数据所在
  • 三、爬虫代码
  • 四、词云


一、需求

示例视频

https://www.bilibili.com/video/BV1v44y1j73d?spm_id_from=333.851.b_7265636f6d6d656e64.2

需求:爬取该视频2022年1月 所有 弹幕

二、网页分析

2.1 找到弹幕数据所在

因为有些数据不是直接显示在html上的,属于动态数据,需要异步加载得到。
步骤1:打开network,或者直接使用F12选到network。

步骤2:打开F12,然后点击右侧 “查看历史弹幕里”,任何一个日期。,然后点击切换月份。

2022-01-06日的弹幕信息

同理可得该月的弹幕月份信息,即这个月有哪些日期有弹幕

日期信息为json格式(2021-11月为空哈,该视频为2022-1月的,修改参数切换到2022-01即可)

三、爬虫代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2022/1/24
#@email:1344732766@qq.com
import requests
import re
import time
import numpy as np
import pandas as pd
#得到一页的响应

def get_oneresponse(url):
    #请求头为1日弹幕数据侠 的请求信息
    headers = {

        'cookie': "你的cookie",
        'origin': 'origin: https://www.bilibili.com',
        'referer': 'https://www.bilibili.com/video/BV1v44y1j73d?spm_id_from=333.851.b_7265636f6d6d656e64.2',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36',
    }
    response = requests.get(url=url, headers=headers)
    return response

#得到一个月的弹幕日期
def get_time(url):
    response = get_oneresponse(url)
    json_data = response.json() #日期为json格式
    date = json_data['data']
    print(date)
    return date


#主函数
def main(url):


    data = get_time(url)
    #for dateindex in range(len(data)):
    print(len(data))#21日
    for dateindex in range(18,20,1):#取2日
        date = data[dateindex]
        print(date)
        url = f'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=477232539&date={date}' #1日弹幕网址
        html_data = get_oneresponse(url).text
        # 正则匹配  "."表示匹配除换行符外的所有字符,“*”匹配0个或多个,“?”匹配一个或者0个。
        # [\u4E00-\u9FA5]匹配任何中文 “+”匹配一个或多个 。[] 表示可以匹配括号里的任何。
        # 。。“.*?”贪婪匹配,能少匹配就少匹配,能不匹配就不匹配
        result = re.findall(".*?([\u4E00-\u9FA5]+).*?", html_data)
        result = pd.Series(result)
        result.to_csv('弹幕.txt',mode='a', index=False) # mode=a  追加写入文件  (也可以用open 写入)
        time.sleep(2) #休息2秒。如果网页请求太频繁,网站会设别到这是爬虫程序




if __name__ == '__main__':
    one_url = 'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=477232539&month=2022-01' #该视频一个月的网址
    main(one_url)

四、词云

import jieba
import wordcloud
# 读取文件内容
f = open('弹幕.txt', encoding='utf-8')
txt = f.read()
# jiabe 分词 分割词汇
#txt = jieba.lcut(txt) #分割行
#string = ' '.join(txt) #分词
# 词云图设置
wc = wordcloud.WordCloud(background_color='white',
                          font_path='simhei.ttf', #字体
                          max_words=400, max_font_size=40, # max_words=400 词的个数
                          random_state=42
                          )

# 给词云输入文字
wc.generate(txt) #不分词,如果分词传入的是string
# 词云图保存图片地址
wc.to_file('out.png')

在这里插入图片描述

作者:电气-余登武

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总裁余(余登武)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值