一、寫在前面
1、關于音頻視頻合并
因為小破站的音頻和視頻畫面是分開的 (番劇也是一樣的),正常爬下來是這樣,
額,這么截圖,小姐姐的臉都變形了…
本來還是挺好看的一姑娘,算了不管她,
所以我們需要額外的去安裝一個軟體FFmpeg用來合成視頻,然后配置環境變數就可以了,
軟體和安裝程序我都放在網盤了,大家任意自取,
網盤鏈接:FFmpeg安裝包及安裝方法
提取碼:qwer
2、關于打包exe檔案
這是我打包好的樣子
正常打包后是沒有我這個圖示的,圖示在打包的時候可以一起改了,
打包exe請移步:Python實作打包exe可執行程式
二、程序結果
合成程序

合成成功
這個封面著實不給力,大家自己去試的時候,換一個吧…
三、代碼實作
首先匯入模塊
import requests # 資料請求模塊 第三方模塊 pip install requests import re # 正則運算式 內置模塊 不需要安裝 import pprint # 格式化輸出模塊 import json # 序列化和反序列化 import subprocess import os
發送請求 以及獲取資料函式
#單引號/雙引號/三引號括起來的內容是字串資料, #三引號也可以作為注釋,多行代碼注釋, def get_response(html_url): """ :param html_url: 請求的url地址 :return: 回傳請求服務器回傳的回應資料 """ # 在發送請求之前, 需要進行偽裝 headers 請求頭 # user-agent 瀏覽器基本標識 用戶代理 基本偽裝 反反爬的手段 # 出現 403 加防盜鏈 referer 告訴服務器, 我們發送請求的url地址 是從哪里跳轉過來的 headers = { 'referer': 'https://search.bilibili.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36' } response = requests.get(url=html_url, headers=headers) # 請求代碼 # <Response [200]> 物件response回應物件 200 狀態碼 表示請求成功 # 404 >>> 你所撥打的電話是空號 >>> 網址出錯 # 403 >>> 你所撥打的電話不在服務區 >>> 你沒有訪問權限 # 100-500 300還行 return response
獲取視頻標題 / 音頻 url地址 / 視頻畫面url地址
def get_video_info(html_url): """ :param html_url: 視頻的詳情頁 :return: 視頻標題 / 音頻 url地址 / 視頻畫面url地址 """ response = get_response(html_url=html_url) # response.text 獲取回應體的文本資料 # print(response.text) 獲取html字串資料 # 只要你可以看到資料 就可以下載 進行批量下載 # 決議資料 提取視頻標題 re正則運算式 css選擇器 xpath(決議方式) bs4 parsel lxml (決議模塊) jsonpath 主要提取json資料 # ['【4K美女】此視頻禁止曹賊入內~~'] 正則運算式提取的資料內容 回傳都是串列資料型別 [0] 串列 索引取值 # 通過re正則運算式里面findall 方法 提取資料內容 '<h1 title="(.*?)" >' 我想要的提取資料 # 想要的內容用括號括起來 .*? 可以匹配任意字符(除了換行符以外\n) 從 response.text 里面查找資料 title = re.findall('<h1 title="(.*?)" >', response.text)[0].replace(' ', '') # 標題 title = re.sub(r'[/\*:"?<>|]', '', title) html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0] # 播放資訊的 # html_data 是什么樣的資料型別 <class 'str'> # 為了更加方便提取資料, 可以字串資料 轉換成 字典資料型別 # print(type(response.text)) # print(title) # print(html_data) # pprint.pprint(html_data) # print(type(html_data)) json_data =https://www.cnblogs.com/hahaa/p/ json.loads(html_data) # 根據冒號左邊的內容, 提取冒號右邊的內容 鍵值對取值 # 注冊賬號 電話號碼 或者 身份證號碼 數字個數是多的吧 然后不能瞎填 audio_url = json_data['data']['dash']['audio'][0]['baseUrl'] video_url = json_data['data']['dash']['video'][0]['baseUrl'] video_info = [title, audio_url, video_url] # pprint.pprint(json_data) # print(audio_url) # print(video_url) return video_info
保存資料函式
def save(title, audio_url, video_url): """ :param title: 視頻標題 :param audio_url: 音頻url :param video_url: 視頻畫面url :return: """ # 保存音頻 視頻資料 獲取二進制資料內容 # 403 沒有訪問的權限
# Python視頻教程、原始碼、電子書、軟體、解答、學習路線圖、加群 924040232
audio_content = get_response(html_url=audio_url).content video_content = get_response(html_url=video_url).content # 英文符號 with open(title + '.mp3', mode='wb') as f: f.write(audio_content) with open(title + '.mp4', mode='wb') as f: f.write(video_content) print(title, '保存成功~~~')
資料的合并
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) os.remove(f'{video_name}.mp4') os.remove(f'{video_name}.mp3')
如果運行沒保存,但是沒有下載結果的話,就是你的環境變數沒設定好,我們把合并程式的檔案路徑放上去就行了,
cmd = f"C:\\ffmpeg\\bin\\ffmpeg -i
獲取某一個up主所有視頻bv號
def get_video_id(html_url): """ :param html_url: 視頻資訊資料包 :return: """ json_data = get_response(html_url).json()['data']['list']['vlist'] bv_id_list = [i['bvid'] for i in json_data] return bv_id_list
主函式
def main(html_url): """ :param bv_id: bv號 :return: """ bv_id_list = get_video_id(html_url) for index in bv_id_list: url = f'https://www.bilibili.com/video/{index}' video_info = get_video_info(url) # [title, audio_url, video_url] save(video_info[0], video_info[1], video_info[2]) merge_data(video_info[0]) if __name__ == '__main__': for page in range(1, 5): url = f'https://api.bilibili.com/x/space/arc/search?mid=81595107&ps=30&tid=0&pn={page}&keyword=&order=pubdate&jsonp=jsonp' main(url)
兄弟們悠著點,看多了遭不住,
兄弟們,學廢了嗎?
覺得還行的話,記得三連哈~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388920.html
標籤:Python
