python获取json中最⼤值_详细解析Python爬取bilibili的视频、
弹幕以及封⾯
本⽂使⽤ Zhihu On VSCode 创作并发布
环境
⽤到的 Python 库:
Python 3.7
requests
moviepy
json
re
os
浏览器:Firefox/ 83.0
访问测试
Image
可以看出有两种不同的⽂件,⼀种是 30280,另⼀种是 30080。
因为 B 站是把⾳频和视频分开传输的,所以很明显,⼀种是视频,另⼀种就是⾳频。按⼤⼩来分的话,30080 是视频,30280 是⾳频⽂
件。
⾸先⽤试着获取其中的⼀个⽂件,来测试⼀下。 先把请求视频 url 复制下来,再把请求头弄下来,接着发送个请求。
import requests
headers = {
'Accept': '*/*',
'Accept-Language': 'zh,en-US;q=0.7,en;q=0.3',python请求并解析json数据
'Accept-Encoding': 'gzip, deflate, br',
'TE': 'Trailers',
'Range': 'bytes=1431-391742',
'Origin': 'www.bilibili',
'Connection': 'keep-alive',
'DNT': '1',
'Referer': 'www.bilibili/video/BV1E4411e7ir',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
}
url = 'upos-sz-mirrorks3.bilivideo/upgcxcode/40/06/91280640/91280640-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN res = (url, headers=headers)
with open('test.flv', 'wb') as fp:
fp.t)
然⽽请求之后发现 flv ⽂件是空的,再看⼀下发回的请求⽂本,显⽰ 403 禁⽌错误:
<html>
<head>
<title>403 Forbidden</title>
</head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr />
<center>QCMAS/V2</center>
</body>
</html>
再仔细观察⼀下抓包情况,在发送请 get 请求之前,浏览器会发送两个 options 请求,应该是请求许可的意思。分别是请求⾳频许可和请
求视频许可,因为请求 url 与请求⾳视频的 url 相同。
Image
那么⽤ session 来发送请求,保存好信息,再去请求链接。修改⼀下代码:
import requests
# 请求⾳视频的请求头
headers_1 = {
'Accept': '*/*',
'Accept-Language': 'zh,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'TE': 'Trailers',
'Range': 'bytes=1431-391742',
'Origin': 'www.bilibili',
'Connection': 'keep-alive',
'DNT': '1',
'Referer': 'www.bilibili/video/BV1E4411e7ir',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
}
# 请求的OPTIONS的请求头
headers_2 = {
'Host': 'cn-gdgz4-cmcc-v-10.bilivideo',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Accept': '*/*',
mysql前三名查询语句'Accept-Language': 'zh,en-US;q=0.7,en;q=0.3',
'Accept-Encoding': 'gzip, deflate, br',
'Access-Control-Request-Method': 'GET',
'Access-Control-Request-Headers': 'range',
javajre怎么配置环境'Referer': 'www.bilibili/video/BV1E4411e7ir',
'Origin': 'www.bilibili',
'DNT': '1',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
}
url = 'upos-sz-mirrorcos.bilivideo/upgcxcode/40/06/91280640/91280640-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN session = requests.session()
<(url, headers=headers_2)
res = (url, headers=headers_1)
with open('test.flv', 'wb') as fp:
fp.t)
可以看到,test.flv 有⽂件⼤⼩了。
Image
但打开时显⽰解析错误:
Image
再看⼀下多个不同请求的请求头,只有 range 发⽣明显的改变,⽽且 range 的值⾥的 bytes 参数,说
明这很有可能是⼀个下载的⽂件⼤⼩范围。那么到最后⼀个发送视频请求的的包,把最⼤值复制下来,然后再设置请求头⾥的 range 值为 0-最⼤值,即'Range':'bytes=0-29271958',然后再次运⾏ py ⽂件。很明显这次请求回来的⽂件⽐之前的⼤了许多,再点击播放,解析成功,有画⾯,但是没有声⾳。
Image
到 url 地址
要到请求 url 肯定不能在在抓包⾥到,可以尝试看下⽹页的源代码。 复制⼀点 url 的信息,在⽹页中查,果然到了信息。
Image
这些信息存在 window.__playinfo__ ⾥,然后把这个 json 提取出来,放到⼀个 json ⽂件⾥,再⽤ Firefox 打开。
Image
Image
可以看到,视频的 url 信息就在 'video' 这个键⾥⾯,id 指的就是请求的质量,对应着上⾯的 accept_quality, 'id': 116指就是⾼清1080p60。 视频的在⾥⾯,那么⾳频的 url 也在 audio这个键⾥⾯。constantly和consistently
提取也很容易,先把 window._playinfo ⽤正则表达式获取到,再将其转为 python 的 json 对象,然后就可以取出来了。
请求的 range 参数怎么设置呢?可以把其删去,或者设为'range': 'bytes=0-',这样就会请求⼀个全⽂件了。
## 请求视频页⾯,注意此时的请求头不是同⼀个
res = (url, headers=headers)
text =
text = re.findall(r'<script>window.__playinfo__=(.*?)</script>', text)[0]
json_data = json.loads(text)
# ⼀般有多种格式可选,优先选1080p,没有就选720p。什么?没有720p!这样的视频还有下载的必要?
v_url = json_data['data']['dash']['video'][0]['baseUrl']
a_url = json_data['data']['dash']['audio'][0]['baseUrl']
# 获取准许iframe传参给servlet
session.options(v_url, headers=headers_2)
session.options(a_url, headers=headers_2)
# 获取数据
video_content = (v_url, headers=headers_1).content
audio_content = (a_url, headers=headers_1).content
# 保存
mybatis设置日志级别with open('test.mp3', 'wb') as fp:
fp.write(audio_content)
with open('test.flv, 'wb') as fp:
fp.write(video_content)
弹幕
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论