欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

找出bilibili隐藏在后方的视频并突破访问限制实现爬取

程序员文章站 2022-03-12 12:35:18
冲浪无意看到网上的bilibili爬虫,请求可能有变了,部分并不是十分方便,于是就趁着周末,去尝试做了bilibili的这么一个视频爬虫,过程就不一一介绍了,主要是思路,本文也并不是写的小白向爬虫教程。在开始的时候我们可以发现:如果是单个分享链接的话如下https://b23.tv/ID 也就是https://m.bilibili.com/video/ID例:https://m.bilibili.com/video/abcde 这个链接我们用作最开始的请求url前部分, abcde为后面的bvid,这...

冲浪无意看到网上的bilibili爬虫,请求可能有变了,部分并不是十分方便,于是就趁着周末,去尝试做了bilibili的这么一个视频爬虫,过程就不一一介绍了,主要是思路,本文也并不是写的小白向爬虫教程。

在开始的时候我们可以发现:如果是单个分享链接的话如下https://b23.tv/ID 也就是https://m.bilibili.com/video/ID
例:https://m.bilibili.com/video/abcde 这个链接我们用作最开始的请求url前部分, abcde为后面的bvid,这个bvid具体获取是在请求过程中使用浏览器的控制台抓包,

找出bilibili隐藏在后方的视频并突破访问限制实现爬取

这个包是我在寻找视频地址过程中搜索的,详细可去自己实践。包内请求数据bvid也就是链接最后的数据,(以前记得找到的地址是aid和cid),
我们抓到其中一组链接如图:
找出bilibili隐藏在后方的视频并突破访问限制实现爬取

以*问参数通过bvid,获取视频部分信息,其中包含了cid,那么我们就可以讲cid清洗出来

def video_cid(id):
    url = "https://api.bilibili.com/x/player/pagelist?bvid=" + id + "&jsonp=jsonp"
    video_logo = requests.get(url, headers=header)
    video_name = video_logo.text
    name = json.loads(video_name)
    cid = name['data'][0]['cid']
    return cid

至于视频名称:

def video_name(id):
    url = "https://api.bilibili.com/x/player/pagelist?bvid=" + id + "&jsonp=jsonp"
    video_logo = requests.get(url, headers=header)
    video_name = video_logo.text
    name = json.loads(video_name)
    names = name['data'][0]['part']
    return names

请求视频时发包必带cid与bvid,主要就是根据bvid先获取cid,然后两组数据加入到请求中。

c=str(video_cid(id))
u='https://api.bilibili.com/x/player/playurl?cid='+c+'&bvid='+id+'&qn=64&type=&otype=json'

那我们可以这样去构造请求url。
请求到该视频的地址,由于正常请求视频的权限不够,需要再模拟来自bilibili主站的请求后将视频下(白)载(嫖)到本地,

head = {
    "host": "",
    "Referer": "https://www.bilibili.com",
    "User-Agent": "Mozilla/5.0(Windows NT 10.0;WOW64) AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36"
}
c=str(video_cid(id))
u='https://api.bilibili.com/x/player/playurl?cid='+c+'&bvid='+id+'&qn=64&type=&otype=json'
aid_json=requests.get(u,headers=header)
s=aid_json.text
contents=json.loads(s)
data=contents['data']['durl'][0]['url']
data1=contents['data']['durl'][0]['size']
h=re.findall("http://(.+)com",data)
flv_host=h[0]+"com"
head['host']=flv_host
res = requests.get(data,headers=head,stream=True, verify=False)
name=video_name(id)
chunk_size=1024
with open("{name}.flv".format(name=name), "wb") as f:
    for i in res.iter_content(chunk_size):
        f.write(i)

找出bilibili隐藏在后方的视频并突破访问限制实现爬取

大概思路,完整代码放在gayhub上了:

https://github.com/bysinks/bilibili

需要注意的是在通过接收参数下载时可能会有列表索引超出的小问题,不过可以多试几次,或者直接使用input函数即可。最后成果图:

找链接过程实在枯燥无味,更懒得写文章,坑已排完。

本文地址:https://blog.csdn.net/weixin_44398914/article/details/107461351