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

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

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

找出bilibili隐藏在后方的视频并突破访问限制实现爬取!_第1张图片

这个包是我在寻找视频地址过程中搜索的,详细可去自己实践。包内请求数据bvid也就是链接最后的数据,(以前记得找到的地址是aid和cid),我们抓到其中一组链接如图:

找出bilibili隐藏在后方的视频并突破访问限制实现爬取!_第2张图片

以上访问参数通过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隐藏在后方的视频并突破访问限制实现爬取!_第3张图片

到此就结束了。代码以及整理好了,想要获取加群:1136192749

 

你可能感兴趣的:(python,post,大数据)