使用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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...