用python把B站小姐姐跳舞視頻爬下來,並打包成可以直接運行的exe文件


一、寫在前面

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="(.*?)" class="video-title">' 我想要的提取數據
    # 想要的內容用括號括起來 .*? 可以匹配任意字符(除了換行符以外\n)   從 response.text 里面查找數據
    title = re.findall('<h1 title="(.*?)" class="video-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 = 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)

 

兄弟們悠着點,看多了遭不住。
在這里插入圖片描述
兄弟們,學廢了嗎?
覺得還行的話,記得三連哈~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM