从网页抓取视频(Python爬虫快速入门(上)(上)获取弹幕数据)

优采云 发布时间: 2022-02-24 09:24

  从网页抓取视频(Python爬虫快速入门(上)(上)获取弹幕数据)

  网络视频弹幕采集

  访问博客时,经常看到关于视频弹幕的数据分析文章,我们可以看到从一些热门视频的弹幕和评论数据中可以得出一些有趣的结论。那么我们来研究一下获取网站视频弹幕数据的一般方法。可以参考之前的爬虫基础总结:

  Python爬虫快速入门(上) Python爬虫快速入门(下)一、在浏览器调试模式下获取API

  以哔哩哔哩为例,先打开一个视频。在这里,您可以在主页上找到更受欢迎的视频:

  《小白评测》5000元旗舰手机大恒评测2020年中盘Part 1

  打开视频页面,输入F12打开调试工具,然后切换到移动端,刷新网页。此时,您可以看到 URL 从 . 等待页面加载完毕后,可以在调试工具的Network选项中看到具体的请求。下一步是锁定获取弹幕数据的请求。

  由于请求的数量非常多,因此需要缩小范围。这里在视频前后请求盲猜弹幕数据,下图中蓝色的长部分应该是视频数据流。可以选中它查看它的具体信息,在新标签页中打开请求链接,发现确实是视频的直接链接。然后在框选的范围内一一查看请求的内容。弹幕没有请求链接,只有一个相关视频信息,名字是related?from=h5&aid= .... 然后尝试在视频流结束前后搜索,最后确认请求命名为list .so?oid=210551301 返回弹幕数据。

  理论上可以请求查看,最后找到弹幕的API。您还可以利用您的想象力以各种方式缩小搜索范围。

  

  二、使用脚本请求数据

  其实打开链接后直接Ctrl S数据就可以了,但是可能需要获取多个相关视频的弹幕数据,或者Up主的一系列视频。这里需要使用脚本请求。从 API 链接可以看出,它的 oid 参数和视频链接的序列号不同。所以先从视频链接中获取对应的oid。直接 GET 请求视频链接,返回的信息收录 oid 参数。

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

  import re

import requests as rq

headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'}

def get_param(link):

'''由视频链接获取 id 参数'''

res = rq.get(link, headers=headers)

reg = "var options = {.*?aid: (.*?),.*?bvid: '(.*?)',.*?cid: (.*?),.*?}"

ids = re.compile(reg, re.S).findall(res.text)[0]

params = dict(zip(['aid', 'bvid', 'cid'], ids))

if params['bvid'] == link.split('?')[0].split('/')[-1]:

return params

else:

print('Extraction Error!')

return 0

  接下来构造一个链接,通过视频对应的id请求弹幕数据:

  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

  from bs4 import BeautifulSoup

def get_dm(id, write=False):

'''id 对应 get_param 函数返回的 cid 字段'''

url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={id}'

res = rq.get(url, headers=headers)

res.encoding = 'utf-8'

soup = BeautifulSoup(res.text, 'xml')

dms = [d.text for d in soup.find_all('d')]

if write:

with open(f'{id}.txt', 'w', encoding='utf-8') as f:

f.write('\n'.join(dms))

print(f'\n已写出文件 {id}.txt\n')

else:

return dms

  最后,获取另一个视频的弹幕来测试一下:

  1

2

  url = 'https://www.bilibili.com/video/BV1mK4y1479e'

get_dm(get_param(url)['cid'], True)

  三、其他视频网站

  B站只是一个“小破站”,挑战不大,我们来试试“大站”看看有什么不同。

  两千年后……

  广告很长,都是VIP视频。. .

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线