聲明不用說了,直接進入主題
還是接上次的爬蟲爬取B站視頻彈幕和評論
思路
以我的主頁為例,如下
然后找到存有我相關視頻數據的文件,如下
然后我們隨便點開一個視頻,進入api端口查看相關信息
我們發現視頻的cid號和oid號是一樣的,所以我們只需要獲取到視頻相應的cid,然后將彈幕文件中的oid號用這里的cid號代替就可以了(事實上cid和oid號是一樣的)。
讓我們回到我的主頁,F12尋找存有我視頻aid號的文件
這個文件很明顯顯示了我主頁這一頁的所有視頻(當然每頁數量是可以改的,頁數也是可以改的,這里只提供思路),然后使用代碼爬取到這些視頻的aid號
接着,我們隨便點開一個視頻,進入api端口,按F12尋找到存有視頻cid號的文件,如下
管你用什么方式,只要獲取到里面的cid號就大功告成了
將你獲取到的視頻cid號放進列表中,然后用循環取出來使用就能實現批量爬取數據的目的了
設計代碼如下(這里只給出爬取視頻aid號的代碼,cid號的爬取只需要在此基礎上寫一個循環就可以實現了)
import requests
import time
mid = str(input('請輸入你要爬取的up主mid號:'))
# 獲取視頻總數
url = 'https://api.bilibili.com/x/space/arc/search?mid={}&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(mid)
response = requests.get(url).json()
count = response['data']['page']['count']
# 獲取aid號
if count > 50:
url2list = []
aidurllist = []
i = 1
n = 0
while i < (count//50)+2:
url1 = 'https://api.bilibili.com/x/space/arc/search?mid=25503580&ps=50&tid=0&pn={}&keyword=&order=pubdate&jsonp=jsonp'.format(i)
response1 = requests.get(url1).json()
m = 0
while m < 50:
aid = response1['data']['list']['vlist'][m]['aid']
aidurl = str(n+1)+'.'+'https://api.bilibili.com/x/web-interface/view?aid=' + str(aid)
print(aidurl)
m += 1
n += 1
i += 1
else:
url1 = 'https://api.bilibili.com/x/space/arc/search?mid={0}&ps={1}&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(mid, count)
response1 = requests.get(url1).json()
i = 0
aidurllist = []
while i < count:
aid = response1['data']['list']['vlist'][i]['aid']
aidurl = str(i+1)+'.'+'https://api.bilibili.com/x/web-interface/view?aid=' + str(aid)
print(aidurl)
i += 1
解釋一下,為什么這里有一個判斷視頻數量的代碼塊,因為本人測試過,一頁最多只能有50個視頻,因此這里需要設置條件語句判斷視頻數量
讓我們看看運行效果
很明顯我們順利地爬到了存有視頻cid號的文件,接着寫一個循環就可以實現批量爬取咯。(其實是本人精力有限,這里只提供設計思路就ok了)
然后下面提供一份可以爬取一頁(最多50個)視頻的彈幕文件的代碼
import requests
import time
mid = str(input('請輸入你要爬取的up主mid號:'))
# 獲取視頻總數
url = 'https://api.bilibili.com/x/space/arc/search?mid={}&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(mid)
response = requests.get(url).json()
count = response['data']['page']['count']
# 獲取aid號
url1 = 'https://api.bilibili.com/x/space/arc/search?mid={0}&ps={1}&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp'.format(mid, count)
response1 = requests.get(url1).json()
i = 0
url2list =[]
aidurllist = []
while i < count:
bvid = response1['data']['list']['vlist'][i]['bvid']
aid = response1['data']['list']['vlist'][i]['aid']
url2 = 'https://www.ibilibili.com/video/' + bvid + '?spm_id_from=333.999.0.0'
aidurl = 'https://api.bilibili.com/x/web-interface/view?aid=' + str(aid)
url2list.append(url2)
aidurllist.append(aidurl)
i += 1
time.sleep(0.2)
# 獲取cid或oid號並打印彈幕文件url地址
n = 0
while n < count:
getdata = requests.get(aidurllist[n]).json()
oid = getdata['data']['pages'][0]['cid']
danmu = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + str(oid)
print(str(n+1) + '.' + danmu)
n += 1
time.sleep(0.2)
讓我們運行一下看看效果
很明顯,我順利地爬到了自己視頻的彈幕文件(彈幕挺少的呵呵呵)
然后再用我們之前的方法寫一個循環結構就可以對彈幕進行批量的加工處理了