1. 程式人生 > >python爬取下載b站視訊

python爬取下載b站視訊

python爬蟲系列:
上一篇
python爬取圖蟲網相簿
今天突然來了興趣想要爬取下載b站視訊,話不多說,說幹就幹。

Usage

下載倉庫

[email protected]:inspurer/PythonSpider.git
或者直接下載:https://github.com/inspurer/PythonSpider/tree/master/bilibili

替換

隨便開啟一個b站的介面,比如
在這裡插入圖片描述將url複製到程式碼中去,執行程式碼,稍等一會兒,上述圖中的視訊就被下載下來了。

How to Code

分析網頁原始碼

按f12瀏覽器開發者工具 ,通過一番審查,我們定位到視訊的url在網頁原始碼的位置如下:

window.__playinfo__={
"from":"local",
"result":"suee",
"quality":32,
"format":"flv480",
"timelength":408884,
"accept_format":"flv720,flv480,flv360",
"accept_description":["高清 720P","清晰 480P","流暢 360P"],
"accept_quality":[64,32,15],
"video_codecid":7,
"video_project":true,
"seek_param":"start",
"seek_type":"offset",
"durl":[{"order":1,"length":408884,"size":42782550,"ahead":"EhA=","vhead":"AWQAHv/hAB5nZAAerNlA2D3n//AoACfxAAADAAEAAAMAMA8WLZYBAAVo6+zyPA==",
"url":"http://upos-hz-mirrorkodo.acgvideo.com/upgcxcode/48/61/45596148/45596148-1-32.flv?e=ig8euxZM2rNcNbRa7b4VhoMz7WhjhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNC8xNEVE9EKE9IMvXBvE2ENvNCImNEVEK9GVqJIwqa80WXIekXRE9IB5QK==&deadline=1543136253&dynamic=1&gen=playurl&oi=1862807981&os=kodo&platform=pc&rate=176800&trid=69ea1a81ac21448f9e2189ef479a2d6d&uipk=5&uipv=5&um_deadline=1543136253&um_sign=c479f3fd3075b359d0a04e5eb584ac55&upsig=1c05ca3838af92d2c1411cf3000e8345http://upos-hz-mirrorkodo.acgvideo.com/upgcxcode/48/61/45596148/45596148-1-32.flv?e=ig8euxZM2rNcNbRa7b4VhoMz7WhjhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNC8xNEVE9EKE9IMvXBvE2ENvNCImNEVEK9GVqJIwqa80WXIekXRE9IB5QK==&deadline=1543136253&dynamic=1&gen=playurl&oi=1862807981&os=kodo&platform=pc&rate=176800&trid=69ea1a81ac21448f9e2189ef479a2d6d&uipk=5&uipv=5&um_deadline=1543136253&um_sign=c479f3fd3075b359d0a04e5eb584ac55&upsig=1c05ca3838af92d2c1411cf3000e8345","backup_url":["http://upos-hz-mirrorcos.acgvideo.com/upgcxcode/48/61/45596148/45596148-1-32.flv?um_deadline=1543136253&platform=pc&rate=176800&oi=1862807981&um_sign=c479f3fd3075b359d0a04e5eb584ac55&gen=playurl&os=cos&trid=69ea1a81ac21448f9e2189ef479a2d6d"]}]}

最後的url就是我們想要的結果。
如果在瀏覽器中查詢不方便的話,我們可以把通過程式碼把網頁原始碼輸出到本地

response = requests.get(url='https://www.bilibili.com/video/av26522634', headers= self.getHtmlHeaders)
        print(response.status_code)
        if response.status_code == 200:
            print(response.text)

為了偽裝成瀏覽器,我們需要在reqests新增Headers
這個Headers需要我們去瀏覽器中手動獲取
切換到NetWork標籤下,再選擇Headers,
在這裡插入圖片描述

   self.getHtmlHeaders={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q = 0.9'
    }

這裡只選擇了幾個關鍵的

解析得到視訊地址

根據上一步分析,我們得到了網頁的原始碼,並在原始碼中定位到了視訊地址,接下來,我們就用程式碼自動獲取這個地址了

#用正則、json得到視訊url;用pq失敗後的無奈之舉
pattern = r'\<script\>window\.__playinfo__=(.*?)\</script\>'
result = re.findall(pattern, html)[0]
temp = json.loads(result)
#temp['durl']是一個列表,裡面有很多字典
#video_url = temp['durl']
for item in temp['durl']:
	if 'url' in item.keys():
		video_url = item['url']

順便獲取下視訊的名字:

#用pq解析得到視訊標題
doc = pq(html)
video_title = doc('#viewbox_report > h1 > span').text()

然後組合返回下:

return{
 'title': video_title,
 'url': video_url
 }

下載視訊

通過在開發者工具中搜索關鍵詞,比如上面得到的視訊url,我們可以定位到在瀏覽器中真正下載視訊的請求在哪
在這裡插入圖片描述然後把它的Headers新增到reqests中,就可以下載視訊了

 with open(filename, "wb") as f:
 	 f.write(requests.get(url=url, headers=self.downloadVideoHeaders, stream=True, verify=False).content)

愉快地觀看本地視訊

在這裡插入圖片描述如果你下載的視訊在本地播放不了,請不要試圖修改原始碼中儲存檔案的格式由.flv改成.mp4,因為b站的視訊本來就是flv格式的,需要用特殊的視訊播放器播放,這裡推薦一個無毒無害的KMPlayer,https://pan.baidu.com/s/1DBOaPGbdTXOvodbrZRhzmQ,提取碼:fw0b

原始碼

工程所有原始碼均已上傳至github,https://github.com/inspurer/PythonSpider/tree/master/bilibili
歡迎star,fork。