使用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、註解開啟:[email protected]== ### 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
  • 在一些複雜的業務表中間查詢數據,有時候操作會比較複雜一些,不過基於SqlSugar的相關操作,處理的代碼會比較簡單一些,以前我在隨筆《基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理》介紹過基於主表和中間表的聯合查詢,而往往實際會比這個會複雜一些。本篇隨筆介紹聯合多個表進行... ...
  • 從按鈕、文本框到下拉框、列表框,WPF提供了一系列常用控制項,每個控制項都有自己獨特的特性和用途。通過靈活的佈局容器,如網格、堆棧面板和換行面板,我們可以將這些控制項組合在一起,實現複雜的界面佈局。而通過樣式和模板,我們可以輕鬆地定製控制項的外觀和行為,以符合我們的設計需求。本篇記錄WPF入門需要瞭解的樣式... ...
  • 以MySQL資料庫為例 # 一. 安裝 NuGet搜索Dapper.Lite並安裝最新版本。 ![](https://img2023.cnblogs.com/blog/174862/202306/174862-20230602155913303-757935399.jpg) NuGet搜索MySql ...
  • # 圖片介面JWT鑒權實現 # 前言 之前做了個返回圖片鏈接的介面,然後沒做授權,然後今天鍵盤到了,也是用JWT來做介面的許可權控制。 然後JTW網上已經有很多文章來說怎麼用了,這裡就不做多的解釋了,如果不懂的可以參考下列鏈接的 文章。 圖片介面文章:[還在愁個人博客沒有圖片放?](https://w ...
  • ![線程各屬性縱覽](https://img2023.cnblogs.com/blog/1220983/202306/1220983-20230603114109107-477345835.png) 如上圖所示,線程有四個屬性: - 線程ID - 線程名稱 - 守護線程 - 線程優先順序 ### 1. ...
  • 本次主要介紹golang中的標準庫`bytes`,基本上參考了 [位元組 | bytes](https://cloud.tencent.com/developer/section/1140520) 、[Golang標準庫——bytes](https://www.jianshu.com/p/e6f7f2 ...
  • 歡迎來到本篇文章!通過上一篇什麼是 Spring?為什麼學它?的學習,我們知道了 Spring 的基本概念,知道什麼是 Spring,以及為什麼學習 Spring。今天,這篇就來說說 Spring 中的核心概念之一 IoC。 ...
  • # 2022版本IDEA+Maven+Tomcat的第一個程式(傻瓜教學) ​ 作為學習Javaweb的一個重要環節,如何實現在IDEA中利用Maven工具創建一個Javaweb程式模版並連接Tomcat發佈是非常重要的。我比較愚鈍(小白),而且自身電腦先前運行過spring或maven的程式,系統 ...
  • 本篇專門扯一下有關 QCheckBox 組件的一個問題。老周不水字數,直接上程式,你看了就明白。 #include <QApplication> #include <QWidget> #include <QPushButton> #include <QCheckBox> #include <QVBo ...
  • # 1.列表數據元素排序 在創建的列表中,數據元素的排列順序常常是無法預測的。這雖然在大多數情況下都是不可避免的,但經常需要以特定的順序呈現信息。有時候希望保留列表數據元素最初的排列順序,而有時候又需要調整排列順序。python提供了很多列表數據元素排序的方式,可根據情況選用。 ## 1.永久性排序 ...