python爬虫实例(一) b站篇
python爬蟲實例(一) b站篇
- 一、代碼
- 二、注意事項
- 1. 視頻格式:m4s,flv,mp4
- 1. m4s:
- 2. flv:
- 3. mp4
- 4. 概述
- 2. blob
- 三、思路
- 總結
一、代碼
import requests import os, sys from lxml import etree from multiprocessing.dummy import Pool from requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)def get_cid(video):# 獲取cidvideo_json = requests.get(url=video["cid_url"].format(video["bvid"]), headers=video["cid_header"]).json()detail = video_json['data'][0]video["cid"] = detail['cid']video["name"] = detail['part'].replace(' ', '_') + '.mp4'video["duration"] = detail["duration"]def get_videourl(video):# 獲取視頻的url(mp4格式)video["video_header"]["host"] = video["video_url"].split('/')[2]video_json = requests.get(url=video["video_url"].format(video["bvid"], video["cid"]),headers=video["video_header"]).json()durl = video_json['data']['durl'][0]video["size"] = durl['size']video["video_url"] = durl['url']video["length"] = durl['length']def get_download(video):size = 0video["video_header"]["host"] = video["video_url"].split('/')[2]response = requests.get(url=video["video_url"], headers=video["video_header"], stream=True, verify=False)chunk_size = 1024content_size = int(response.headers['content-length'])if response.status_code == 200:sys.stdout.write(video["name"] + ' [文件大小]:%0.2f MB\n' % (content_size / chunk_size / 1024))with open("D:\\python_file\\" + video["name"], 'wb') as file:for data in response.iter_content(chunk_size=chunk_size):file.write(data)size += len(data)file.flush()sys.stdout.write(video["name"] + ' [下載進度]:%.2f%%' % float(size / content_size * 100) + '\r')if size / content_size == 1:print('\n')else:print('下載出錯')if __name__ == '__main__':# 進程池開4個大小pool = Pool(4)# bvid列表bvid_list = ["BV17E411o7ye"]videos = []for bvid in bvid_list:data = {"cid": "","bvid": bvid,"name": "","duration": "","length": "","size": "","cid_url": "https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp","video_url": "https://api.bilibili.com/x/player/playurl?bvid={}&cid={}&qn=80&type=&otype=json&fnval=1",# 公共部分可以提到外面"cid_header": {"host": "api.bilibili.com","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400"},"video_header": {"host": "","Origin": "https://www.bilibili.com","Referer": "https://www.bilibili.com/video/" + bvid,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4506.400"}}videos.append(data)pool.map(get_cid, videos)pool.map(get_videourl, videos)for i in videos:print("name:{0} duration:{1}s 下載地址:D:\\python_file\\{2}".format(i["name"], i["duration"], i["name"]))pool.map(get_download, videos)二、注意事項
1. 視頻格式:m4s,flv,mp4
1. m4s:
2. flv:
3. mp4
就是很正經的那個mp4了
4. 概述
也就是說現在網頁播放視頻大部分都是flv格式,然后又把flv切片成好多m4s?
2. blob
Blob URL只能由瀏覽器在內部生成。URL.createObjectURL()將創建一個特殊的Blob或File對象的引用,以后可以使用它來發布URL.revokeObjectURL()。這些URL只能在瀏覽器的單個實例中和同一個會話中(即頁面/文檔的生命周期)在本地使用。
Blob URL / Object URL是一種偽協議,允許Blob和File對象用作圖像,下載二進制數據鏈接等的URL源。
最早是數據庫直接用Blob來存儲二進制數據對象,這樣就不用關注存儲數據的格式了。在web領域,Blob對象表示一個只讀原始數據的類文件對象,雖然是二進制原始數據但是類似文件的對象,因此可以像操作文件對象一樣操作Blob對象。
三、思路
先現在網頁里找,看能不能找到視頻下載地址
之后就發現了這么一串東西,然后去搜blob發現這是個新的知識點,然后后面的網址也用不了
于是我選擇去抓包了
我先去找第一個包,發現他的響應就是一個頁面而已,沒有參考價值,于是繼續尋找有用的信息
之后我發現了這種m4s格式的請求,然后去搜一下,發現這是視頻格式,大膽猜測,這就是我要找的視頻,但是這些請求太分散了,我根本抓不住,只能繼續找其他的包
然后我就找到了這個,他的響應是json,里面放了很多m4s文件的url
其實這個時候即可以大膽猜測了,這就是我之前發現的那些m4s格式請求的url
用json轉換工具破解一下,就是這樣了
所以現在的問題就變成了,如何獲取這請求頭的url
經過尋找資料和以往知識,我大概知道了這些參數都是什么意思
接下來的問題就是尋找cid了,所以繼續往下找
經過不懈努力,終于找到了這個,他的返回是json,其中就有cid
也就是,我可以通過bvid找到cid,然后再構造參數,獲取視頻url
然后就有下一個問題了,我確實獲得了視頻m4s文件的url,不過這么多m4s文件,我也不會分析(太菜了
于是繼續百度,發現可以通過fnval這個參數,改變返回的視頻格式類型,所以在構造參數的時候,我讓fnval=1,就可以直接獲取mp4格式的視頻了
之后就是下載操作了
總結
總結
以上是生活随笔為你收集整理的python爬虫实例(一) b站篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux文件系统的设计,基于Linux
- 下一篇: Python爬虫实例项目大全