大家平時(shí)空閑的時(shí)候都會(huì)有刷小視頻的習(xí)慣吧菠赚,我也會(huì)在B站上看一些視頻,今天就和大家分享一個(gè)用Python寫的一個(gè)自動(dòng)爬取Bilibili小視頻的腳本,下面是項(xiàng)目實(shí)現(xiàn)的全部過程。
1.確定爬取目標(biāo)
這次項(xiàng)目入偷,我們爬取的是B站的每日小視頻排行榜前100的視頻資源,爬取的網(wǎng)址為:「http://vc.bilibili.com/p/eden/rank#/?tab=全部」械哟。
2.尋找API接口疏之,生成爬蟲入口
在谷歌瀏覽器中,通過F12打開開發(fā)者模式戒良,然后在NetWorking——Name字段下找到這個(gè)鏈接: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
在這個(gè)頁面中体捏,再看一下Heagers屬性,找到Request URL這個(gè)屬性值糯崎,當(dāng)我們向下滑動(dòng)加載視頻的過程中,發(fā)現(xiàn)只有這個(gè)(http://api.vc.bilibili.com/board/v1/ranking/top?)URL是不變的河泳。
next_offest屬性值會(huì)一直變化沃呢,它是獲取下一個(gè)視頻的序號(hào),現(xiàn)在我們需要把這部分參數(shù)取出來拆挥,把next_offest寫成變量值薄霜,用JSON格式返回到目標(biāo)網(wǎng)頁即可。
3.?編寫代碼
根據(jù)上面分析過程編寫代碼纸兔,寫代碼的時(shí)候要注意B站在一定程度上做了反爬操作惰瓜,所以我們需要通過添加請(qǐng)求頭來偽裝瀏覽器,否則下載的視頻是空的汉矿;然后定義參數(shù)來儲(chǔ)存JSON數(shù)據(jù)崎坊,再通過requests.get去獲取其參數(shù)值信息。代碼如下:
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
為了能清楚的看到下載情況洲拇,在定義一個(gè)下載器奈揍,實(shí)現(xiàn)代碼如下:
def download(url,path):
start= time.time() # 開始時(shí)間
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# 每次下載的數(shù)據(jù)大小
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) # 已下載的文件大小
效果如下:
這個(gè)小項(xiàng)目適合爬蟲入門的同學(xué)作為練手項(xiàng)目曲尸,如果有感興趣的同學(xué),后臺(tái)可以回復(fù)「b站」獲取完整源代碼男翰。