Python爬取B站弹幕数据并获取弹幕数量最多数据

Python爬取B站弹幕数据并获取弹幕数量最多数据

    • 网站分析
    • 最终代码

我们以郑老师申论课为例子进行分析

网站分析

郑老师的申论课的网址为
https://www.bilibili.com/video/BV1W7411t7fy
我们爬取106节课程并存储弹幕到txt文件
经过分析知道这106节课网址不同点在于params的p参数,我们只需要使用循环修改p参数即可爬取106节课
在这里插入图片描述
B站的弹幕数据在https://api.bilibili.com/x/v1/dm/list.so这个URL中,现在已经在B站抓包已经抓不到了,所以直接写出来,这个URL要传入oid参数才可获取到数据,所以必须在原网址中获取到oid参数,然后传入这个URL,方可获取到弹幕
Python爬取B站弹幕数据并获取弹幕数量最多数据_第1张图片
在控制台这里搜索oid以找到oid是什么,然后把oid传入原网址搜索其位置
Python爬取B站弹幕数据并获取弹幕数量最多数据_第2张图片
即可在代码用正则定位到此处进行获取
获取到数据后即可存储到txt文档以及通过排序进行分析

re.findall(r'"base_url":".*?upgcxcode/\d+/\d+/(.*?)/.*?m4s.*?"',page_text,re.S)[0]

具体说明代码有备注
注:此代码也可用于其他的整套系列视频,如果想要获取单一视频弹幕数据,则直接分析其oid并请求
https://api.bilibili.com/x/v1/dm/list.so这个url即可(携带oid参数)

最终代码

import requests
import re
import os
import time
###弹幕存储路径
dirName="申论弹幕"
if not os.path.exists(dirName):
    os.mkdir(dirName)

headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
url = 'https://www.bilibili.com/video/BV1W7411t7fy'
##此变量用于改变文件名
count = 0
###爬取106节课的弹幕数据
for each in range(1,106):
    params = {
     
        'p': str(each)
    }
    ###爬取原网址以获得oid
    response = requests.get(url=url,headers=headers,params=params)
    response.encoding = 'utf-8'
    page_text = response.text
    ##获取oid
    oid = re.findall(r'"base_url":".*?upgcxcode/\d+/\d+/(.*?)/.*?m4s.*?"',page_text,re.S)[0]
    ##获取这节课的名称
    name = re.findall(r'"part":.*?"(.*?)",',page_text,re.S)[count]
    ###爬取弹幕数据
    content_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid='+str(oid)
    content = requests.get(url=content_url,headers= headers)
    content.encoding = 'utf-8'
    content_text = content.text
    ###弹幕数据清理
    real_content = re.findall(r'<.*?d.*?p.*?=.*?".*?".*?>(.*?)',content_text,re.S)
    ###存储弹幕数据
    content_path = dirName + '/' + name + '.txt'
    with open(content_path,'w',encoding = 'utf-8') as fp:
        for cont in real_content:
            fp.write(cont)
            ###使数据更美观
            fp.write('\n')
#####分析每一节课弹幕最多的数据
###把数据存储为字典格式
    content_dict = {
     }
    for every in real_content:
        if every not in content_dict:
            content_dict[every] = 1
        else:
            content_dict[every] += 1
    ###获取弹幕数最多的数据
    max = list(content_dict.items())[0][1]
    for i in list(content_dict.items()):
        if i[1] >= max:
            max = i[1]
            content_max = i[0]
    print(name+'这节课'+'弹幕最多的是:'+content_max+','+'一共有'+str(max)+'条')
    ###防止爬取速度过快
    time.sleep(0.5)
    count += 1

你可能感兴趣的:(爬虫,python,web,python,数据挖掘,爬虫)