B站弹幕和评论爬虫

B站弹幕和评论爬虫

最近想爬下B站的弹幕和评论,发现网上找到的教程基本都失效了,毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方。对于爬虫这一方,爬取网站数据,一般目的都是比较明确的,废话不多说,开干!
在这里插入图片描述

https://comment.bilibili.com/xxxx.xml

在浏览器打开可以看到如下:
在这里插入图片描述

数据还是非常干净的,那么下一步就是看如何获取这个 xml 的 url 地址了,也就是如何获取 324768988 ID接下来我们搜索整个网页的源码,可以发现如下情况

在这里插入图片描述
也就是说,我们需要的 ID 是可以在 script 当中获取的,下面就来编写一个提取 script 内容的函数

def getHTML_content(self):
        # 获取该视频网页的内容
        response = requests.get(self.BVurl, headers = self.headers)
        html_str = response.content.decode()
        html=etree.HTML(html_str)
        result=etree.tostring(html)
        return result
 
def get_script_list(self,str):
    html = etree.HTML(str)
    script_list = html.xpath("//script/text()")
    return script_list

拿到所有的 script 内容之后,我们再来解析我们需要的数据

script_list = self.get_script_list(html_content)
# 解析script数据,获取cid信息
for script in script_list:
        if '[{"cid":' in script:
            find_script_text = script
final_text = find_script_text.split('[{"cid":')[1].split(',"page":')[0]

最后,我们再把整体代码封装成一个类,就完成了弹幕抓取的数据收集工作了

spider = BiliSpider("BV16p4y187hc")
spider.run()

结果如下:

在这里插入图片描述
对于评论数据,可能要复杂一些,需要分为主(main)评论和回复主评论的 reply 评论我们通过浏览器工具抓取网页上的所有请求,然后搜索 reply,可以得到如下结果
在这里插入图片描述
我们先来看看 main 请求,整理后通过浏览器访问如下
在这里插入图片描述
也可以直接通过 requests 请求
在这里插入图片描述
通过观察可以得知,响应消息里的 replies 就是主评论内容,同时我们还可以改变 url当中的 next 参数来翻页,进而请求不同的数据这里我们再关注下 rpid 参数,这个会用于 reply 评论中再来看看 reply 评论,同样可以使用 requests 直接访问,同时 url 当中的 root 参数就是我们上面提到的 rpid 参数
在这里插入图片描述
我们厘清了上面的关系之后,我们就可以编写代码了

def get_data(data):
    data_list = []
    comment_data_list = data["data"]["replies"]
    for i in comment_data_list:
        data_list.append([i['rpid'], i['like'], i['member']['uname'], i['member']['level_info']['current_level'], i['content']['message']])
    return data_list
 
 
def save_data(data_type, data):
    if not os.path.exists(data_type + r'_data.csv'):
        with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:
            f.write("rpid,点赞数量,用户,等级,评论内容\n")
            for i in data:
                rpid = i[0]
                like_count = i[1]
                user = i[2].replace(',', ',')
                level = i[3]
                content = i[4].replace(',', ',')
                row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)
                f.write(row)
                f.write('\n')
    else:
        with open(data_type + r"_data.csv", "a+", encoding='utf-8') as f:
            for i in data:
                rpid = i[0]
                like_count = i[1]
                user = i[2].replace(',', ',')
                level = i[3]
                content = i[4].replace(',', ',')
                row = '{},{},{},{},{}'.format(rpid,like_count,user,level,content)
                f.write(row)
                f.write('\n')
 
 
for i in range(1000):
    url = "https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid=972516426&mode=3&plat=1&_=1632192192097".format(str(i))
    print(url)
    d = requests.get(url)
    data = d.json()
    if not data['data']['replies']:
        break
    m_data = get_data(data)
    save_data("main", m_data)
    for j in m_data:
        reply_url = "https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn=1&type=1&oid=972516426&ps=10&root={}&_=1632192668665".format(str(j[0]))
        print(reply_url)
        r = requests.get(reply_url)
        r_data = r.json()
        if not r_data['data']['replies']:
            break
        reply_data = get_data(r_data)
        save_data("reply", reply_data)
        time.sleep(5)
    time.sleep(5)
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
Python爬虫获取B站弹幕和数据分析可以分为以下几个步骤: 1. 获取B站视频的cid,可以通过视频页面的URL来获取,例如视频页面的URL为:https://www.bilibili.com/video/BV1QK4y1d7dK,则cid为BV1QK4y1d7dK。 2. 使用B站提供的弹幕API获取弹幕数据,可以使用requests库发送请求,然后解析返回的XML数据,获取弹幕文本内容和发送时间等信息。 3. 将弹幕数据保存到本地文件或数据库中,可以使用csv、json、sqlite等格式进行存储。 4. 数据分析和可视化,可以使用pandas、matplotlib、seaborn等库进行数据分析和可视化,例如统计弹幕数量和分布、分析弹幕关键词等。 下面是一份获取B站视频弹幕并进行数据分析的示例代码: ```python import requests from bs4 import BeautifulSoup import xml.etree.ElementTree as ET import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 获取视频cid url = 'https://www.bilibili.com/video/BV1QK4y1d7dK' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') cid = soup.find('meta', {'itemprop': 'videoId'})['content'] # 获取弹幕数据 danmu_url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}' response = requests.get(danmu_url) xml_data = response.content.decode('utf-8-sig') xml_root = ET.fromstring(xml_data) danmu_list = [] for danmu in xml_root.iter('d'): danmu_attr = danmu.attrib['p'].split(',') danmu_list.append({ 'time': float(danmu_attr[0]), 'mode': int(danmu_attr[1]), 'color': int(danmu_attr[3]), 'text': danmu.text.strip() }) # 保存弹幕数据到csv文件中 df = pd.DataFrame(danmu_list) df.to_csv('danmu.csv', index=False, encoding='utf-8-sig') # 数据分析和可视化 df['datetime'] = pd.to_datetime(df['time'], unit='s') df['date'] = df['datetime'].dt.date df['hour'] = df['datetime'].dt.hour df['minute'] = df['datetime'].dt.minute df['second'] = df['datetime'].dt.second df['count'] = 1 # 统计弹幕数量和分布 danmu_count = df.groupby('date')['count'].sum() danmu_count.plot(kind='line', title='B站弹幕数量趋势', figsize=(8, 4)) plt.show() danmu_hour_count = df.groupby('hour')['count'].sum() danmu_hour_count.plot(kind='bar', title='B站弹幕小时分布', figsize=(8, 4)) plt.show() # 分析弹幕关键词 from jieba.analyse import extract_tags keywords = extract_tags(df['text'].str.cat(sep=' '), topK=20, withWeight=True) df_keywords = pd.DataFrame(keywords, columns=['keyword', 'weight']) sns.barplot(x='weight', y='keyword', data=df_keywords) plt.title('B站弹幕关键词分析') plt.show() ``` 以上代码可以获取B站视频的弹幕数据,并对弹幕数据进行数量和分布统计、关键词分析等操作,并使用pandas、matplotlib和seaborn等库进行数据分析和可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值