Python爬虫爬取Bilibili弹幕过程解析

作者:一个刚刚大四的弱渣 时间:2021-11-26 02:58:49 

先来思考一个问题,B站一个视频的弹幕最多会有多少?

比较多的会有2000条吧,这么多数据,B站肯定是不会直接把弹幕和这个视频绑在一起的。

也就是说,有一个视频地址为https://www.bilibili.com/video/av67946325,你如果直接去requests.get这个地址,里面是不会有弹幕的,回想第一篇说到的携程异步加载数据的方式,B站的弹幕也一定是先加载当前视频的界面,然后再异步填充弹幕的。

接下来我们就可以打开火狐浏览器(平常可以火狐谷歌控制台都使用,因为谷歌里面因为插件被拦截下来的包在火狐可以抓到,同理谷歌也是)的控制台来观察网络请求了。

经过仔细排查之后,我找到了一个请求xml的,它后面跟了一个oid,查看它的响应内容之后可以发现它就是弹幕文件。

Python爬虫爬取Bilibili弹幕过程解析

它的响应时间98毫秒,远超其它几个响应,所以说如果把弹幕直接放在视频页面,用户体验一定会很差。

Python爬虫爬取Bilibili弹幕过程解析

找到弹幕了,爬取它很容易,但是我们想要是爬取固定av号视频的弹幕,而不是说随意去找一个oid来爬取弹幕,这样我们都不知道爬下来的弹幕是哪个视频的。

接下来我们就可以复制oid的117784982值,去视频页面搜索看看了,通过视频来获得它的oid再来爬xml弹幕就很方便了。

这次用了谷歌浏览器,在里面通过搜索oid果然搜索到相关的数据了。

Python爬虫爬取Bilibili弹幕过程解析

其中cid是弹幕对应的id,aid对应视频av号。

先把这个页面爬取下来。


# encoding: utf-8

import requests

headers = {
 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
 'Accept': 'text/html',
 'Cookie': "_uuid=1DBA4F96-2E63-8488-DC25-B8623EFF40E773841infoc; buvid3=FE0D3174-E871-4A3E-877C-A4ED86E20523155831infoc; LIVE_BUVID=AUTO8515670521735348; sid=l765gx48; DedeUserID=33717177; DedeUserID__ckMd5=be4de02fd64f0e56; SESSDATA=cf65a5e0%2C1569644183%2Cc4de7381; bili_jct=1e8cdbb5755b4ecd0346761a121650f5; CURRENT_FNVAL=16; stardustvideo=1; rpdid=|(umY))|ukl~0J'ulY~uJm)kJ; UM_distinctid=16ce0e51cf0abc-02da63c2df0b4b-5373e62-1fa400-16ce0e51cf18d8; stardustpgcv=0606; im_notify_type_33717177=0; finger=b3372c5f; CURRENT_QUALITY=112; bp_t_offset_33717177=300203628285382610"

}
resp = requests.get('https://www.bilibili.com/video/av67946325',headers=headers)
print(resp.text)

拿到了内容我们就要从中解析弹幕id了,对于这种规则紊乱的网页,我们就不能用上一篇中Bs4解析了,而是使用正则表达式。

正则表达式最简单的使用方式其实就是直接match。


re.search(匹配规则,文本).group()

Python爬虫爬取Bilibili弹幕过程解析

观察这里的内容,我们大致的匹配规则就有了。

cid={目标}&aid=av号

117784982就是我们的目标。


av_id = '67946325'
resp = requests.get('https://www.bilibili.com/video/av'+av_id,headers=headers)
match_rule = r'cid=(.*?)&aid'
oid = re.search(match_rule,resp.text).group().replace('cid=','').replace('&aid','')
print('oid='+oid)

先根据av号拿到视频页面,然后解析视频页面拿到oid,最后用oid去请求xml弹幕文件。


xml_url = 'https://api.bilibili.com/x/v1/dm/list.so?oid='+oid
resp = requests.get(xml_url,headers=headers)
print(resp)

这样我们就完成B站弹幕爬虫了。

来源:https://www.cnblogs.com/LexMoon/p/pyspider03.html

标签:python,爬虫,爬取,b站,弹幕
0
投稿

猜你喜欢

  • Sql Server 数据库索引整理语句,自动整理数据库索引

    2024-01-14 02:37:25
  • 一文轻松掌握python语言命名规范规则

    2023-03-23 02:11:43
  • python deque模块简单使用代码实例

    2022-10-16 04:08:12
  • XML HttpRequst对象学习

    2007-10-12 19:04:00
  • 解决python将xml格式文件转换成txt文件的问题(xml.etree方法)

    2021-10-21 02:51:13
  • Python使用openpyxl复制整张sheet

    2023-11-21 23:09:18
  • 有关wxpython pyqt内存占用问题分析

    2022-11-02 11:37:14
  • 基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    2023-06-16 12:11:26
  • 详解CentOS 6.5中安装mysql 5.7.16 linux glibc2.5 x86 64(推荐)

    2024-01-15 19:01:11
  • github pull最新代码实现方法

    2023-11-22 10:08:07
  • JavaScript eval() 函数介绍及应用示例

    2024-04-19 10:00:01
  • python调用matlab的方法详解

    2023-10-18 06:39:02
  • pandas数据清洗实现删除的项目实践

    2021-09-02 16:44:17
  • 关于浏览器的一些观点

    2008-08-06 12:48:00
  • 让Python脚本暂停执行的几种方法(小结)

    2021-08-16 21:34:49
  • win10系统中安装scrapy-1.1

    2021-07-28 07:41:28
  • 解决Python中由于logging模块误用导致的内存泄露

    2021-08-24 08:04:46
  • 基于javascript的Form表单验证

    2024-04-10 16:20:03
  • python 性能优化方法小结

    2022-08-04 21:13:43
  • Oracle PL/SQL入门慨述

    2010-07-18 12:57:00
  • asp之家 网络编程 m.aspxhome.com