大家平時空閒的時候都會有刷小視頻的習慣吧,我也會在B站上看一些視頻,今天就和大家分享一個用Python寫的一個自動爬取Bilibili小視頻的腳本,下面是項目實現的全部過程。
1.確定爬取目標
這次項目,我們爬取的是B站的每日小視頻排行榜前100的視頻資源,爬取的網址爲:「http://vc.bilibili.com/p/eden/rank#/?tab=全部」。
2.尋找API接口,生成爬蟲入口
在谷歌瀏覽器中,通過F12打開開發者模式,然後在NetWorking——Name字段下找到這個鏈接:http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset=&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc
在這個頁面中,再看一下Heagers屬性,找到Request URL這個屬性值,當我們向下滑動加載視頻的過程中,發現只有這個(http://api.vc.bilibili.com/board/v1/ranking/top?)URL是不變的。
next_offest屬性值會一直變化,它是獲取下一個視頻的序號,現在我們需要把這部分參數取出來,把next_offest寫成變量值,用JSON格式返回到目標網頁即可。
3. 編寫代碼
根據上面分析過程編寫代碼,寫代碼的時候要注意B站在一定程度上做了反爬操作,所以我們需要通過添加請求頭來僞裝瀏覽器,否則下載的視頻是空的;然後定義參數來儲存JSON數據,再通過requests.get去獲取其參數值信息。代碼如下:
defget_json(url):
headers = {
'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
params = {
'page_size':10,
'next_offset': str(num),
'tag':'今日熱門',
'platform':'pc'
}
try:
html = requests.get(url,params=params,headers=headers)
returnhtml.json()
exceptBaseException:
print('request error')
pass
爲了能清楚的看到下載情況,在定義一個下載器,實現代碼如下:
def download(url,path):
start= time.time() # 開始時間
size=0
headers = {
'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = requests.get(url,headers=headers,stream=True) # stream屬性必須帶上
chunk_size =1024# 每次下載的數據大小
content_size =int(response.headers['content-length']) # 總大小
ifresponse.status_code ==200:
print('[文件大小]:%0.2f MB'%(content_size / chunk_size /1024)) # 換算單位
withopen(path,'wb')asfile:
fordatainresponse.iter_content(chunk_size=chunk_size):
file.write(data)
size+=len(data) # 已下載的文件大小
效果如下:
這個小項目適合爬蟲入門的同學作爲練手項目,如果有感興趣的同學,後臺可以回覆「b站」獲取完整源代碼。