使用Python採集某網站視頻,實現音視頻自動合成!

来源:https://www.cnblogs.com/hahaa/archive/2023/05/24/17428275.html
-Advertisement-
Play Games

一、準備一下 開發環境 Pycharm python 3.8 ffmpeg 模塊的使用 requests re subprocess 二、基本思路流程 1、明確需求 採集下破站視頻數據通過開發者工具進行抓包分析,分析破站視頻數據的來源。 開發者工具的使用 打開方式: 滑鼠右鍵點擊檢查選擇Networ ...


 

一、準備一下

開發環境

Pycharm
python 3.8
ffmpeg

模塊的使用

requests
re
subprocess

二、基本思路流程

1、明確需求

採集下破站視頻數據
通過開發者工具進行抓包分析,分析破站視頻數據的來源。

開發者工具的使用

打開方式:

  1. 滑鼠右鍵點擊檢查選擇Network
  2. F12
  3. 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、總結

通過以上分析可得:

  1. 首先獲取 cid session 這兩個參數, 順帶在獲取視頻標題
  2. 把cid session 以及 bv號 傳入數據包內
  3. 最後再獲取 音頻數據 以及 視頻畫面數據

三、代碼實現步驟

可以發現, 關於python爬蟲的流程思路分析, 所涉及的知識點還是比較多的。

  1. 發送請求, 對於視頻詳情頁url地址發送請求
  2. 獲取數據, 獲取響應體的文本數據 response.text
  3. 解析數據, 通過正則表達式提取數據內容: 視頻標題 cid session
  4. 發送請求, 對於視頻內容數據包url發送請求
  5. 獲取數據, 獲取響應體的json字典數據 response.json()
  6. 解析數據, 通過字典鍵值對取值, 提取音頻url 視頻url
  7. 保存數據, 對於音頻url 視頻url發送請求 獲取響應體二進位數據 response.content
  8. 合成數據, 把音頻內容以及視頻畫面內容合成為一個完整的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)

 

好了,今天的分享就到這結束了,咱們下次見!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 圖紙管理系統 ## 一、初步構建後端項目 ### 1、打開已經創建好的虛擬環境:激活activate(推薦使用虛擬環境)並創建項目 ![](https://img2023.cnblogs.com/blog/2240937/202305/2240937-20230524164953360-1300 ...
  • ### StringIO和BytesIO 很多時候,數據讀寫不一定是文件,也可以在記憶體中讀寫。StringIO就是在記憶體中讀寫str。 要把str寫入StringIO,我們需要先創建一個StringIO,然後,像文件一樣寫入即可: ```python >>> from io import Strin ...
  • # 二、Java開啟非同步的兩種方式 ## 1、註解開啟:==@Async== ### 1.1、配置非同步的線程池 - 必須配置非同步線程池,否則非同步不會生效。 - @EnableAsync 註解:指定非同步線程池。不指定預設使用:SimpleAsyncTaskExecutor線程池 - SimpleAsy ...
  • 摘要:這篇文章將詳細講解圖像形態學知識,主要介紹圖像腐蝕處理和膨脹處理。 本文分享自華為雲社區《[Python從零到壹] 四十七.圖像增強及運算篇之腐蝕和膨脹詳解》,作者: eastmount 。 一.形態學理論知識 數學形態學的應用可以簡化圖像數據,保持它們基本的形狀特征,並出去不相干的結構。數學 ...
  • 親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安裝方式親測好使的安 ...
  • 我們在學習 Java 基礎時就知道可以生成隨機數,可以為我們枯燥的學習增加那麼一丟丟的樂趣。本文就來介紹 Java 隨機數。 ...
  • ## 教程簡介 Ruby,一種簡單快捷的面向對象(面向對象程式設計)腳本語言,在20世紀90年代由日本人松本行弘(Yukihiro Matsumoto)開發,遵守GPL協議和Ruby License。它的靈感與特性來自於 Perl、Smalltalk、Eiffel、Ada以及 Lisp 語言。由 R ...
  • # 一、Java配置線程池 ## 1、線程池==分類==、其他 ### 1.1、分類 ==IO密集型 和 CPU密集型== 任務的特點不同,因此針對不同類型的任務,選擇不同類型的線程池可以獲得更好的性能表現。 #### 1.1. IO密集型任務 ​ IO密集型任務的特點是需要頻繁讀寫磁碟、網路或者其 ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...