冲浪无意看到网上的bilibili爬虫,请求可能有变了,部分并不是十分方便,于是就趁着周末,去尝试做了bilibili的这么一个视频爬虫,过程就不一一介绍了,主要是思路,本文也并不是写的小白向爬虫教程。
在开始的时候我们可以发现:如果是单个分享链接的话如下https://b23.tv/ID 也就是https://m.bilibili.com/video/ID例:https://m.bilibili.com/video/abcde 这个链接我们用作最开始的请求url前部分, abcde为后面的bvid,这个bvid具体获取是在请求过程中使用浏览器的控制台抓包,
这个包是我在寻找视频地址过程中搜索的,详细可去自己实践。包内请求数据bvid也就是链接最后的数据,(以前记得找到的地址是aid和cid),我们抓到其中一组链接如图:
以上访问参数通过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)
到此就结束了。代码以及整理好了,想要获取加群:1136192749