?
一、準(zhǔn)備一下
開發(fā)環(huán)境
Pycharm
python 3.8
ffmpeg
模塊的使用
requests
re
subprocess
二、基本思路流程
1、明確需求
采集下破站視頻數(shù)據(jù)
通過開發(fā)者工具進(jìn)行抓包分析,分析破站視頻數(shù)據(jù)的來源。
開發(fā)者工具的使用
打開方式:
- 鼠標(biāo)右鍵點(diǎn)擊檢查選擇Network
- F12
- ctrl + shift + i
想要開發(fā)者工具中有數(shù)據(jù)加載, 需要 刷新網(wǎng)頁。
通過元素(Element)面板,我們能查看到想抓取頁面渲染內(nèi)容所在的標(biāo)簽、使用什么 CSS 屬性(例如:class=“middle”)等內(nèi)容。例如我想要抓取我知乎主頁中的動(dòng)態(tài)標(biāo)題,在網(wǎng)頁頁面所在處上右擊鼠標(biāo),選擇“檢查”,可進(jìn)入 Chrome 開發(fā)者工具的元素面板。
網(wǎng)絡(luò)(Network)面板記錄頁面上每個(gè)網(wǎng)絡(luò)操作的相關(guān)信息,包括詳細(xì)的耗時(shí)數(shù)據(jù)、HTTP 請求與響應(yīng)標(biāo)頭和 Cookie,等等。這就是我們通常說的抓包。
Requests Table參數(shù):
all:所有請求數(shù)據(jù)(圖片、視頻、音頻、js代碼、css代碼)
XHR:XMLHttpRequest 的縮寫,是ajax技術(shù)的核心,動(dòng)態(tài)加載完成經(jīng)常分析的一個(gè)內(nèi)容
CSS: css樣式文件
JS:JavaScript文件,js解密是常分析的一個(gè)頁面
Img: Images 圖片文件
Font: 字體文件(字體反扒)
DOC : Document,文檔內(nèi)容
WS: WebSocket,web端的socket數(shù)據(jù)通信,一般用于一些實(shí)時(shí)更新的數(shù)據(jù)
Requests詳情:
請求頭
Headers 是顯示 HTTP 請求的 Headers,我們通過這個(gè)能看到請求的方式,以及攜帶的請求參數(shù)等。
-
General
Request url :實(shí)際請求的網(wǎng)址
Request Method: 請求方法
Status Code: 狀態(tài)碼,成功時(shí)為 200
-
Response Headers
服務(wù)器返回時(shí)設(shè)置的一些數(shù)據(jù),例如服務(wù)器更新的cookie數(shù)據(jù)最新是在這里出現(xiàn)修改。
-
Requests Headers
請求體,請求不到數(shù)據(jù)的原因一般出在這里,反扒也是反扒請求體里面的數(shù)據(jù)。
Accept:服務(wù)器接收的數(shù)據(jù)格式(一般忽略)
Accept-Encoding: 服務(wù)器接收的編碼(一般忽略)
Accept-Language: 服務(wù)器接收的語言(一般忽略)
Connection: 保持連接(一般忽略)
Cookies: cookies信息,是身份信息,爬取VIP資源是需要攜帶身份信息。
Host: 請求的主機(jī)地址
User-Agent: 用戶身份代理,服務(wù)器根據(jù)這個(gè)判斷用戶的大概信息。
Sec-xxx-xxx: 其他信息,可能沒用,可能是反扒,具體情況具體分析。
預(yù)覽
Preview 是請求結(jié)果的預(yù)覽。一般用來查看請求到的圖片,對于抓取圖片網(wǎng)站比較給力。
響應(yīng)體
Response 是請求返回的結(jié)果。一般的內(nèi)容是整個(gè)網(wǎng)站的源代碼。如果該請求是異步請求,返回的結(jié)果內(nèi)容一般是 Json 文本數(shù)據(jù)。
此數(shù)據(jù)與瀏覽器展示的網(wǎng)頁可能不一致,因?yàn)闉g覽器是動(dòng)態(tài)加載的。
2、數(shù)據(jù)來源分析
所以可以根據(jù)里面的參數(shù)在開發(fā)者工具里面進(jìn)行搜索
通過結(jié)果可得?playurl?就是我們想要的數(shù)據(jù)
既然我們知道了, 數(shù)據(jù)的來源, 接下來就要分析, 這個(gè)數(shù)據(jù)包url中有那些參數(shù)是我們需要去找尋分析的…
因?yàn)槲覀冞@個(gè)只是找到一個(gè)B站視頻的數(shù)據(jù), 如果想要獲取多個(gè)那肯定是需要分析的。
通過請求參數(shù)對比, 我們現(xiàn)在所需要找的參數(shù)就是?cid?,?bvid?,?session
同樣可以直接在開發(fā)者工具里面搜索 這些參數(shù)來源?bvid?就是B站視頻對應(yīng)的ID
**cid / session 在網(wǎng)頁源代碼里面就可以獲取的 **
3、總結(jié)
通過以上分析可得:
- 首先獲取 cid session 這兩個(gè)參數(shù), 順帶在獲取視頻標(biāo)題
- 把cid session 以及 bv號 傳入數(shù)據(jù)包內(nèi)
- 最后再獲取 音頻數(shù)據(jù) 以及 視頻畫面數(shù)據(jù)
三、代碼實(shí)現(xiàn)步驟
可以發(fā)現(xiàn), 關(guān)于python爬蟲的流程思路分析, 所涉及的知識(shí)點(diǎn)還是比較多的。
- 發(fā)送請求, 對于視頻詳情頁url地址發(fā)送請求
- 獲取數(shù)據(jù), 獲取響應(yīng)體的文本數(shù)據(jù) response.text
- 解析數(shù)據(jù), 通過正則表達(dá)式提取數(shù)據(jù)內(nèi)容: 視頻標(biāo)題 cid session
- 發(fā)送請求, 對于視頻內(nèi)容數(shù)據(jù)包url發(fā)送請求
- 獲取數(shù)據(jù), 獲取響應(yīng)體的json字典數(shù)據(jù) response.json()
- 解析數(shù)據(jù), 通過字典鍵值對取值, 提取音頻url 視頻url
- 保存數(shù)據(jù), 對于音頻url 視頻url發(fā)送請求 獲取響應(yīng)體二進(jìn)制數(shù)據(jù) response.content
- 合成數(shù)據(jù), 把音頻內(nèi)容以及視頻畫面內(nèi)容合成為一個(gè)完整的mp4文件
四、代碼實(shí)現(xiàn)
1、發(fā)送請求
import requests import re import subprocess headers = { 'referer': 'https://www.bilibili.com', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36', } def get_response(html_url): """發(fā)送請求""" # 完整源碼+視頻講解 都放在這個(gè)扣裙了 708525271 response = requests.get(url=html_url, headers=headers) return response
?
2、獲取視頻標(biāo)題/cid/session
def get_video_info(html_url): """獲取 cid session 視頻標(biāo)題""" response = get_response(html_url) cid = re.findall('"cid":(\d+),', response.text)[0] session = re.findall('"session":"(.*?)"', response.text)[0] title = re.findall('<h1 title="(.*?)" class="video-title">', response.text)[0].replace(' ', '') video_info = [cid, session, title] return video_info
?
3、獲取音頻url/視頻url
def get_video_content(cid, session, bvid): """獲取音頻內(nèi)容以及視頻內(nèi)容""" index_url = 'https://api.bilibili.com/x/player/playurl' data = { 'cid': cid, 'qn': '80', 'type': '', 'otype': 'json', 'fourk': '1', 'bvid': bvid, 'fnver': '0', 'fnval': '976', 'session': session, } json_data = requests.get(url=index_url, params=data, headers=headers).json() audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] video_content = [audio_url, video_url] return video_content
?
4、保存數(shù)據(jù)
def save(name, audio_url, video_url): """保存數(shù)據(jù)""" audio_content = get_response(audio_url).content video_content = get_response(video_url).content with open(name + '.mp3', mode='wb') as a: a.write(audio_content) with open(name + '.mp4', mode='wb') as v: v.write(video_content) print(name, '保存成功')
?
5、合成視頻
def merge_data(video_name): """數(shù)據(jù)的合并""" print('視頻合成開始:', video_name) cmd = f"ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}output.mp4" # print(cmd) subprocess.run(cmd, shell=True) print('視頻合成結(jié)束:', video_name)
?文章來源:http://www.zghlxwxcb.cn/news/detail-457401.html
好了,今天的分享就到這結(jié)束了,咱們下次見!文章來源地址http://www.zghlxwxcb.cn/news/detail-457401.html
到了這里,關(guān)于使用Python采集某網(wǎng)站視頻,實(shí)現(xiàn)音視頻自動(dòng)合成!的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!