使用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
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...