女友刷B站流量告急,技术男友轻松搞定!
文 |?某某白米飯
來源:Python 技術「ID: pythonall」
B 站大家都熟悉,尤其是它的舞蹈區。有 100W+ 的舞蹈視頻。在沒有 wifi 的情況下,就欣賞不了這些視頻了。作為一個 python 程序員,小編就寫一個 Python 腳本在晚上下載舞蹈區的所有視頻。
抓取列表
首先點開舞蹈區先選擇宅舞列表。
然后打開 F12 的控制面板,可以找到一條 https://api.bilibili.com/x/web-interface/newlist?rid=20&type=0&pn=1&ps=20&jsonp=jsonp&callback=jsonCallback_bili_57905715749828263 的 url,其中 rid 是 B 站的小分類,pn 是頁數。
小編試著在瀏覽器將地址打開居然報了 404,可是在控制面板中這個地址的返回值明明就是視頻列表。試著去掉 callback 的參數,意外的得到了想要的結果。
眾所周知 bid 是一個 B 站視頻的唯一 ID,想要獲取 bid 可以從上面 url 的返回值中提取 aid,然后將 aid 轉換為 bid。
# aid 轉 bid 代碼取自:https://zhuanlan.zhihu.com/p/117358823Str?=?'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'??#?準備的一串指定字符串 Dict?=?{}#?將字符串的每一個字符放入字典一一對應?,?如 f對應0 Z對應1 一次類推。 for?i?in?range(58):Dict[Str[i]]?=?is?=?[11,?10,?3,?8,?4,?6,?2,?9,?5,?7]??#?必要的解密列表 xor?=?177451812? add?=?100618342136696320??#?這串數字最后要被減去或加上def?algorithm_enc(av):ret?=?avav?=?int(av)av?=?(av?^?xor)?+?add#?將BV號的格式(BV?+?10個字符)?轉化成列表方便后面的操作r?=?list('BV??????????')for?i?in?range(10):r[s[i]]?=?Str[av?//?58?**?i?%?58]return?''.join(r)def?find_bid(p):bids?=?[]r?=?requests.get('https://api.bilibili.com/x/web-interface/newlist?&rid=20&type=0&pn={}&ps=50&jsonp=jsonp'.format(p))data?=?json.loads(r.text)archives?=?data['data']['archives']for?item?in?archives:aid?=?item['aid']bid?=?algorithm_enc(aid)bids.append(bid)return?bids獲取視頻的 CID
想要下載 1080 的視頻,光有 bid 是不夠的,還需要 登錄后 Cookie 中的 SESSDATA 值和 cid 。
首先登錄 B 站將 Cookie 中的 SESSDATA 復制到對象頭中。用地址為 https://api.bilibili.com/x/player/pagelist?bvid= url 返回 cid。
def?get_cid(bid):url?=?'https://api.bilibili.com/x/player/pagelist?bvid='?+?bidheaders?=?{'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/90.0.4430.212?Safari/537.36','Cookie':?'SESSDATA=182cd036%2C1636985829%2C3b393%2A51','Host':?'api.bilibili.com'}html?=?requests.get(url,?headers=headers).json()infos?=?[]data?=?html['data']cid_list?=?datafor?item?in?cid_list:cid?=?item['cid']title?=?item['part']infos.append({'bid':?bid,?'cid':?cid,?'title':?title})return?infos下載視頻
下載視頻的 https://api.bilibili.com/x/player/playurl 來自于每次視頻播放完之后的推薦列表。
最后使用 urllib.request.urlretrieve 函數下載視頻。
def?get_video_list(aid,?cid,?quality):url_api?=?'https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn={}'.format(cid,?aid,?quality)headers?=?{'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/90.0.4430.212?Safari/537.36','Cookie':?'SESSDATA=182cd036%2C1636985829%2C3b393%2A51','Host':?'api.bilibili.com'}html?=?requests.get(url_api,?headers=headers).json()video_list?=?[]for?i?in?html['data']['durl']:video_list.append(i['url'])return?video_listdef?schedule_cmd(blocknum,?blocksize,?totalsize):percent?=?100.0?*?blocknum?*?blocksize/?totalsizes?=?('#'?*?round(percent)).ljust(100,?'-')sys.stdout.write('%.2f%%'?%?percent?+?'['?+?s?+?']'?+?'\r')sys.stdout.flush()def?download(video_list,?title,?bid):for?i?in?video_list:opener?=?urllib.request.build_opener()opener.addheaders?=?[('User-Agent',?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/90.0.4430.212?Safari/537.36'),('Accept',?'*/*'),('Accept-Language',?'en-US,en;q=0.5'),('Accept-Encoding',?'gzip,?deflate,?br'),?('Range',?'bytes=0-'),??('Referer',?'https://www.bilibili.com/video/'+bid),('Origin',?'https://www.bilibili.com'),('Connection',?'keep-alive'),]filename=os.path.join('D:\\video',?r'{}_{}.mp4'.format(bid,title))?try:urllib.request.install_opener(opener)urllib.request.urlretrieve(url=i,?filename=filename,?reporthook=schedule_cmd)?except:print(bid?+?"下載異常,文件:"?+?filename)總結
本篇介紹了通過爬蟲的方式下載 B 站視頻,代碼量不多就 130 行左右。大家也可以擴展一下,自動下載關注 up 主的視頻。
參考
[1] AID 轉 BID??https://zhuanlan.zhihu.com/p/117358823
推薦閱讀
Pandas處理數據太慢,來試試Polars吧!
懶人必備!只需一行代碼,就能導入所有的Python庫
絕!關于pip的15個使用小技巧
介紹10個常用的Python內置函數,99.99%的人都在用!
可能是全網最完整的 Python 操作 Excel庫總結!
總結
以上是生活随笔為你收集整理的女友刷B站流量告急,技术男友轻松搞定!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python实现的导弹跟踪算法,燃!
- 下一篇: Python八种数据导入方法,你掌握了吗