一、準備一下 開發環境 Pycharm python 3.8 ffmpeg 模塊的使用 requests re subprocess 二、基本思路流程 1、明確需求 採集下破站視頻數據通過開發者工具進行抓包分析,分析破站視頻數據的來源。 開發者工具的使用 打開方式: 滑鼠右鍵點擊檢查選擇Networ ...
一、準備一下
開發環境
Pycharm
python 3.8
ffmpeg
模塊的使用
requests
re
subprocess
二、基本思路流程
1、明確需求
採集下破站視頻數據
通過開發者工具進行抓包分析,分析破站視頻數據的來源。
開發者工具的使用
打開方式:
- 滑鼠右鍵點擊檢查選擇Network
- F12
- ctrl + shift + i
想要開發者工具中有數據載入, 需要 刷新網頁。
通過元素(Element)面板,我們能查看到想抓取頁面渲染內容所在的標簽、使用什麼 CSS 屬性(例如:class=“middle”)等內容。例如我想要抓取我知乎主頁中的動態標題,在網頁頁面所在處上右擊滑鼠,選擇“檢查”,可進入 Chrome 開發者工具的元素麵板。
網路(Network)面板記錄頁面上每個網路操作的相關信息,包括詳細的耗時數據、HTTP 請求與響應標頭和 Cookie,等等。這就是我們通常說的抓包。
Requests Table參數:
all:所有請求數據(圖片、視頻、音頻、js代碼、css代碼)
XHR:XMLHttpRequest 的縮寫,是ajax技術的核心,動態載入完成經常分析的一個內容
CSS: css樣式文件
JS:JavaScript文件,js解密是常分析的一個頁面
Img: Images 圖片文件
Font: 字體文件(字體反扒)
DOC : Document,文檔內容
WS: WebSocket,web端的socket數據通信,一般用於一些實時更新的數據
Requests詳情:
請求頭
Headers 是顯示 HTTP 請求的 Headers,我們通過這個能看到請求的方式,以及攜帶的請求參數等。
-
General
Request url :實際請求的網址
Request Method: 請求方法
Status Code: 狀態碼,成功時為 200
-
Response Headers
伺服器返回時設置的一些數據,例如伺服器更新的cookie數據最新是在這裡出現修改。
-
Requests Headers
請求體,請求不到數據的原因一般出在這裡,反扒也是反扒請求體裡面的數據。
Accept:伺服器接收的數據格式(一般忽略)
Accept-Encoding: 伺服器接收的編碼(一般忽略)
Accept-Language: 伺服器接收的語言(一般忽略)
Connection: 保持連接(一般忽略)
Cookies: cookies信息,是身份信息,爬取VIP資源是需要攜帶身份信息。
Host: 請求的主機地址
User-Agent: 用戶身份代理,伺服器根據這個判斷用戶的大概信息。
Sec-xxx-xxx: 其他信息,可能沒用,可能是反扒,具體情況具體分析。
預覽
Preview 是請求結果的預覽。一般用來查看請求到的圖片,對於抓取圖片網站比較給力。
響應體
Response 是請求返回的結果。一般的內容是整個網站的源代碼。如果該請求是非同步請求,返回的結果內容一般是 Json 文本數據。
此數據與瀏覽器展示的網頁可能不一致,因為瀏覽器是動態載入的。
2、數據來源分析
所以可以根據裡面的參數在開發者工具裡面進行搜索
通過結果可得 playurl 就是我們想要的數據
既然我們知道了, 數據的來源, 接下來就要分析, 這個數據包url中有那些參數是我們需要去找尋分析的…
因為我們這個只是找到一個B站視頻的數據, 如果想要獲取多個那肯定是需要分析的。
通過請求參數對比, 我們現在所需要找的參數就是 cid , bvid , session
同樣可以直接在開發者工具裡面搜索 這些參數來源 bvid 就是B站視頻對應的ID
**cid / session 在網頁源代碼裡面就可以獲取的 **
3、總結
通過以上分析可得:
- 首先獲取 cid session 這兩個參數, 順帶在獲取視頻標題
- 把cid session 以及 bv號 傳入數據包內
- 最後再獲取 音頻數據 以及 視頻畫面數據
三、代碼實現步驟
可以發現, 關於python爬蟲的流程思路分析, 所涉及的知識點還是比較多的。
- 發送請求, 對於視頻詳情頁url地址發送請求
- 獲取數據, 獲取響應體的文本數據 response.text
- 解析數據, 通過正則表達式提取數據內容: 視頻標題 cid session
- 發送請求, 對於視頻內容數據包url發送請求
- 獲取數據, 獲取響應體的json字典數據 response.json()
- 解析數據, 通過字典鍵值對取值, 提取音頻url 視頻url
- 保存數據, 對於音頻url 視頻url發送請求 獲取響應體二進位數據 response.content
- 合成數據, 把音頻內容以及視頻畫面內容合成為一個完整的mp4文件
四、代碼實現
1、發送請求
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): """發送請求""" # 完整源碼+視頻講解 都放在這個扣裙了 708525271 response = requests.get(url=html_url, headers=headers) return response
2、獲取視頻標題/cid/session
def get_video_info(html_url): """獲取 cid session 視頻標題""" 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): """獲取音頻內容以及視頻內容""" 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、保存數據
def save(name, audio_url, video_url): """保存數據""" 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): """數據的合併""" 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('視頻合成結束:', video_name)
好了,今天的分享就到這結束了,咱們下次見!