爬蟲基礎之爬取某站視頻

目標網址:為了1/4螺口買小米SU7,開了一個月,它值嗎?_嗶哩嗶哩_bilibili

本案例所使用到的模塊
requests (發送HTTP請求)subprocess(執行系統命令)
re (正則表達式操作)json (處理JSON數據)


需求分析:

  1. 視頻的名稱? F12 打開開發者工具 or 右擊點檢查
  2. 分析包含視頻下載鏈接的數據包
  3. 發送請求? 解析數據? 下載到本地

打開開發者工具 刷新頁面 等待數據包的加載
點擊網絡(network)下面的媒體 此篩選的為視頻文件 發現沒有數據包返回

?接著我們點擊XHR 動態加載數據 --- 左邊的.m4都為視頻文件 點擊一個數據包 復制里面url的一段參數 找到總的接口

搜索出來有很多一樣的數據包 就是剛剛看到的 找到唯一不同的接口
這里面有我們想要的視頻名字和下載鏈接

接著點擊響應? Ctrl+F 打開快捷鍵搜索 所需要的視頻名稱


?

往下拉 下面有視頻下載地址 和音頻下載地址
# Explain: B站的視頻和音頻是分開的 我們可以通過下載一個軟件來合并 或者通過剪視頻軟件合成

分析完畢,開始寫代碼

第一步 模擬瀏覽器向服務器發送請求
? ? ? ?

  1. 復制標頭中的請求URL地址
  2. 構建請求頭
  3. 提取數據
  4. 保存數據
#導包
import requestsurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)

提取數據 --使用正則提取 視頻標題

# 導包
import re
# 獲取視頻名稱 對列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_嗶哩嗶哩_bilibili</title>', resp.text)[0].replace('?', '').replace('/', '')

?上圖的代碼 可以通過 pprint.pprint(content) 格式化打印 方便取值

content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
# 將獲取到的數據轉換為JSON格式的
json_data = json.loads(content)
# 通過鍵值對取值 提取視頻 音頻的下載鏈接
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]

保存數據 --發送請求獲取二進制的數保存到本地

# 圖片 視頻 音頻等都是以二進制的格式保存
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content
with open(v_name+'.mp3', 'wb') as f:f.write(a_content)
with open(v_name+'.mp4', 'wb') as f:f.write(v_content)

視頻和音頻保存完畢? 接著就是將其合并?

?進入這個官網 下載軟件并解壓 然后配置環境變量? ??Builds - CODEX FFMPEG @ gyan.dev

??往下拉? 找到release builds 下載如下圖箭頭的zip壓縮包

然后找到解壓縮的文件 復制到bin目錄? 例如我的是 C:\下載\ffmpeg-7.0.2-essentials_build\bin

右擊此電腦的屬性? 高級系統設置

添加到環境變量中就可以了

#導包
import subprocess
def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模塊調用 ffmpeg 命令行工具,避免 shell 命令注入風險command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)# 提供視頻和音頻的文件路徑
video_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp4'
audio_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)

出現這串代碼時 就合并成功啦?

以下是本次的源碼 供大家參考學習使用

import json
import pprint
import re
import requests
import subprocessurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)
# 獲取視頻名稱 對列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_嗶哩嗶哩_bilibili</title>', resp.text)[0].replace('?','').replace('/', '')content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
json_data = json.loads(content)
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content# with open(v_name+'.mp3', 'wb') as f:
#     f.write(a_content)
# with open(v_name+'.mp4', 'wb') as f:
#     f.write(v_content)def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模塊調用 ffmpeg 命令行工具,避免 shell 命令注入風險command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)video_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp4'
audio_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)

本次的案例分析就到此結束啦 感謝大家的觀看 您的點贊和關注是我更新的動力

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894442.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek R1本地化部署 Ollama + Chatbox 打造最強 AI 工具

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux 目錄 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下載 Ollama&#x1f98b; 選擇模型&#x1f98b; 運行模型&#x1f98b; 使用 && 測試 二&#xff1a;&#x1f525; Chat…

【linux網絡(5)】傳輸層協議詳解(下)

目錄 前言1. TCP的超時重傳機制2. TCP的流量控制機制3. TCP的滑動窗口機制4. TCP的擁塞控制機制5. TCP的延遲應答機制6. TCP的捎帶應答機制7. 總結以及思考 前言 強烈建議先看傳輸層協議詳解(上)后再看這篇文章. 上一篇文章講到TCP協議為了保證可靠性而做的一些策略, 這篇文章…

DeepSeek 遭 DDoS 攻擊背后:DDoS 攻擊的 “千層套路” 與安全防御 “金鐘罩”

當算力博弈升級為網絡戰爭&#xff1a;拆解DDoS攻擊背后的技術攻防戰——從DeepSeek遇襲看全球網絡安全新趨勢 在數字化浪潮席卷全球的當下&#xff0c;網絡已然成為人類社會運轉的關鍵基礎設施&#xff0c;深刻融入經濟、生活、政務等各個領域。從金融交易的實時清算&#xf…

二、CSS筆記

(一)css概述 1、定義 CSS是Cascading Style Sheets的簡稱,中文稱為層疊樣式表,用來控制網頁數據的表現,可以使網頁的表現與數據內容分離。 2、要點 怎么找到標簽怎么操作標簽對象(element) 3、css的四種引入方式 3.1 行內式 在標簽的style屬性中設定CSS樣式。這種方…

第三篇:模型壓縮與量化技術——DeepSeek如何在邊緣側突破“小而強”的算力困局

——從算法到芯片的全棧式優化實踐 隨著AI應用向移動終端與物聯網設備滲透&#xff0c;模型輕量化成為行業核心挑戰。DeepSeek通過自研的“算法-編譯-硬件”協同優化體系&#xff0c;在保持模型性能的前提下&#xff0c;實現參數量與能耗的指數級壓縮。本文從技術原理、工程實…

C++編程語言:抽象機制:泛型編程(Bjarne Stroustrup)

泛型編程(Generic Programming) 目錄 24.1 引言(Introduction) 24.2 算法和(通用性的)提升(Algorithms and Lifting) 24.3 概念(此指模板參數的插件)(Concepts) 24.3.1 發現插件集(Discovering a Concept) 24.3.2 概念與約束(Concepts and Constraints) 24.4 具體化…

DeepSeek-R1本地部署實踐

一、下載安裝 --Ollama Ollama是一個開源的 LLM&#xff08;大型語言模型&#xff09;服務工具&#xff0c;用于簡化在本地運行大語言模型&#xff0c;降低使用大語言模型的門檻&#xff0c;使得大模型的開發者、研究人員和愛好者能夠在本地環境快速實驗、管理和部署最新大語言…

AI技術路線(marked)

人工智能&#xff08;AI&#xff09;是一個非常廣泛且充滿潛力的領域&#xff0c;它涉及了讓計算機能夠執行通常需要人類智能的任務&#xff0c;比如感知、推理、學習、決策等。人工智能的應用已經滲透到各行各業&#xff0c;從自動駕駛到醫療診斷&#xff0c;再到推薦系統和自…

【leetcode詳解】T598 區間加法

598. 區間加法 II - 力扣&#xff08;LeetCode&#xff09; 思路分析 核心在于將問題轉化&#xff0c; 題目不是要求最大整數本身&#xff0c;而是要求解最大整數的個數 結合矩陣元素的增加原理&#xff0c;我們將抽象問題轉為可操作的方法&#xff0c;其實就是再找每組ops中…

【最后203篇系列】004 -Smarklink

說明 這個用來替代nginx。 最初是希望用nginx進行故障檢測和負載均衡&#xff0c;花了很多時間&#xff0c;大致的結論是&#xff1a;nginx可以實現&#xff0c;但是是在商業版里。非得要找替代肯定可以搞出來&#xff0c;但是太麻煩了&#xff08;即使是nginx本身的配置也很煩…

完全卸載mysql server步驟

1. 在控制面板中卸載mysql 2. 打開注冊表&#xff0c;運行regedit, 刪除mysql信息 HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->EventLog->Application->Mysql HKEY_LOCAL_MACHINE-> SYSTEM->CurrentContolSet->Services->Mysql …

1. 【.NET Aspire 從入門到實戰】--理論入門與環境搭建--引言

在當前軟件開發領域&#xff0c;云原生和微服務架構已經成為主流趨勢&#xff0c;傳統的單體應用正逐步向分布式系統轉型。隨著業務需求的不斷變化與用戶規模的迅速擴大&#xff0c;如何在保證高可用、高擴展性的同時&#xff0c;還能提高開發效率與降低維護成本&#xff0c;成…

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群

Ubuntu 22.04系統安裝部署Kubernetes v1.29.13集群 簡介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系統安裝部署 Kubernetes v1.29.13 集群 1 環境準備1.1 集群IP規劃1.2 初始化步驟&#xff08;各個節點都需執行&#xff09;1.2.1 主機名與IP地址解析1.…

基于SpringBoot的新聞資訊系統的設計與實現(源碼+SQL腳本+LW+部署講解等)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

每日一題——包含min函數的棧

包含min函數的棧 題目數據范圍&#xff1a;示例C語言代碼實現解釋1. push(value)2. pop()3. top()4. min() 總結大小堆 題目 定義棧的數據結構&#xff0c;請在該類型中實現一個能夠得到棧中所含最小元素的 min 函數&#xff0c;輸入操作時保證 pop、top 和 min 函數操作時&am…

RDP協議詳解

以下內容包含對 RDP&#xff08;Remote Desktop Protocol&#xff0c;遠程桌面協議&#xff09;及其開源實現 FreeRDP 的較為系統、深入的講解&#xff0c;涵蓋協議概要、歷史沿革、核心原理、安全機制、安裝與使用方法、擴展與未來發展趨勢等方面&#xff0c; --- ## 一、引…

【Linux系統】計算機世界的基石:馮諾依曼架構與操作系統設計

文章目錄 一.馮諾依曼體系結構1.1 為什么體系結構中要存在內存&#xff1f;1.2 馮諾依曼瓶頸 二.操作系統2.1 設計目的2.2 系統調用與庫函數 一.馮諾依曼體系結構 馮諾依曼體系結構&#xff08;Von Neumann Architecture&#xff09;是計算機的基本設計理念之一&#xff0c;由…

消息隊列應用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系統設計》P343-P347

消息隊列 使用信號量、事件標志組和線標志進行任務同步時&#xff0c;只能提供同步的時刻信息&#xff0c;無法在任務之間進行數據傳輸。要實現任務間的數據傳輸&#xff0c;一般使用兩種方式&#xff1a; 1. 全局變量 在 RTOS 中使用全局變量時&#xff0c;必須保證每個任務…

【NLP251】Transformer精講 殘差鏈接與層歸一化

精講部分&#xff0c;主要是對Transformer的深度理解方便日后從底層邏輯進行創新&#xff0c;對于僅應用需求的小伙伴可以跳過這一部分&#xff0c;不影響正常學習。 1. 殘差模塊 何凱明在2015年提出的殘差網絡&#xff08;ResNet&#xff09;&#xff0c;Transformer在2016年…

Android學習制作app(ESP8266-01S連接-簡單制作)

一、理論 部分理論見arduino學習-CSDN博客和Android Studio安裝配置_android studio gradle 配置-CSDN博客 以下直接上代碼和效果視頻&#xff0c;esp01S的收發硬件代碼目前沒有分享&#xff0c;但是可以通過另一個手機網絡調試助手進行模擬。也可以直接根據我的代碼進行改動…