python爬虫实例(一) b站篇
python爬蟲(chóng)實(shí)例(一) b站篇
- 一、代碼
- 二、注意事項(xiàng)
- 1. 視頻格式:m4s,flv,mp4
- 1. m4s:
- 2. flv:
- 3. mp4
- 4. 概述
- 2. blob
- 三、思路
- 總結(jié)
一、代碼
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"] + ' [下載進(jìn)度]:%.2f%%' % float(size / content_size * 100) + '\r')if size / content_size == 1:print('\n')else:print('下載出錯(cuò)')if __name__ == '__main__':# 進(jìn)程池開(kāi)4個(gè)大小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)二、注意事項(xiàng)
1. 視頻格式:m4s,flv,mp4
1. m4s:
2. flv:
3. mp4
就是很正經(jīng)的那個(gè)mp4了
4. 概述
也就是說(shuō)現(xiàn)在網(wǎng)頁(yè)播放視頻大部分都是flv格式,然后又把flv切片成好多m4s?
2. blob
Blob URL只能由瀏覽器在內(nèi)部生成。URL.createObjectURL()將創(chuàng)建一個(gè)特殊的Blob或File對(duì)象的引用,以后可以使用它來(lái)發(fā)布URL.revokeObjectURL()。這些URL只能在瀏覽器的單個(gè)實(shí)例中和同一個(gè)會(huì)話中(即頁(yè)面/文檔的生命周期)在本地使用。
Blob URL / Object URL是一種偽協(xié)議,允許Blob和File對(duì)象用作圖像,下載二進(jìn)制數(shù)據(jù)鏈接等的URL源。
最早是數(shù)據(jù)庫(kù)直接用Blob來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)對(duì)象,這樣就不用關(guān)注存儲(chǔ)數(shù)據(jù)的格式了。在web領(lǐng)域,Blob對(duì)象表示一個(gè)只讀原始數(shù)據(jù)的類文件對(duì)象,雖然是二進(jìn)制原始數(shù)據(jù)但是類似文件的對(duì)象,因此可以像操作文件對(duì)象一樣操作Blob對(duì)象。
三、思路
先現(xiàn)在網(wǎng)頁(yè)里找,看能不能找到視頻下載地址
之后就發(fā)現(xiàn)了這么一串東西,然后去搜blob發(fā)現(xiàn)這是個(gè)新的知識(shí)點(diǎn),然后后面的網(wǎng)址也用不了
于是我選擇去抓包了
我先去找第一個(gè)包,發(fā)現(xiàn)他的響應(yīng)就是一個(gè)頁(yè)面而已,沒(méi)有參考價(jià)值,于是繼續(xù)尋找有用的信息
之后我發(fā)現(xiàn)了這種m4s格式的請(qǐng)求,然后去搜一下,發(fā)現(xiàn)這是視頻格式,大膽猜測(cè),這就是我要找的視頻,但是這些請(qǐng)求太分散了,我根本抓不住,只能繼續(xù)找其他的包
然后我就找到了這個(gè),他的響應(yīng)是json,里面放了很多m4s文件的url
其實(shí)這個(gè)時(shí)候即可以大膽猜測(cè)了,這就是我之前發(fā)現(xiàn)的那些m4s格式請(qǐng)求的url
用json轉(zhuǎn)換工具破解一下,就是這樣了
所以現(xiàn)在的問(wèn)題就變成了,如何獲取這請(qǐng)求頭的url
經(jīng)過(guò)尋找資料和以往知識(shí),我大概知道了這些參數(shù)都是什么意思
接下來(lái)的問(wèn)題就是尋找cid了,所以繼續(xù)往下找
經(jīng)過(guò)不懈努力,終于找到了這個(gè),他的返回是json,其中就有cid
也就是,我可以通過(guò)bvid找到cid,然后再構(gòu)造參數(shù),獲取視頻url
然后就有下一個(gè)問(wèn)題了,我確實(shí)獲得了視頻m4s文件的url,不過(guò)這么多m4s文件,我也不會(huì)分析(太菜了
于是繼續(xù)百度,發(fā)現(xiàn)可以通過(guò)fnval這個(gè)參數(shù),改變返回的視頻格式類型,所以在構(gòu)造參數(shù)的時(shí)候,我讓fnval=1,就可以直接獲取mp4格式的視頻了
之后就是下載操作了
總結(jié)
總結(jié)
以上是生活随笔為你收集整理的python爬虫实例(一) b站篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux文件系统的设计,基于Linux
- 下一篇: Python爬虫实例项目大全