python帶你實現(xiàn)任意下載AcFun視頻數(shù)據(jù)~

前言 ??

嗨嘍,大家好呀~這里是愛看美女的茜茜吶

小姐姐你們喜歡嗎?反正我是喜歡的,所以我決定?。?/p>

今天采集小姐姐視頻~保存下來供我欣賞

環(huán)境使用:

  • Python 3.8

  • Pycharm

模塊使用:

  • import requests >>> pip install requests

內(nèi)置模塊 你安裝好python環(huán)境就可以了

  • import re

  • import json

如果安裝python第三方模塊:

  1. win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車

  2. 在pycharm中點擊Terminal(終端) 輸入安裝命令

基本思路流程: <實現(xiàn)采集案例基本 通用>

一. 數(shù)據(jù)來源分析

  1. 明確我們的需求 https://www.acfun.cn/v/ac35510357 這個視頻內(nèi)容

  2. 分析我們視頻內(nèi)容來自于哪里

通過開發(fā)者工具進行抓包分析:

  • F12 或者 鼠標(biāo)右鍵點擊檢查

  • 分析數(shù)據(jù)在那個數(shù)據(jù)包里面 這個網(wǎng)站數(shù)據(jù)是不是m3u8需要自己判斷

m3u8 好處是什么, 你看多少內(nèi)容就給你加載多少內(nèi)容, 你看三秒就給你加載三秒, 綠色雙人愛情.....<>

正常的視頻內(nèi)容: MP4 2分鐘18秒

m3u8 分片段 ---> 分為很多小片段 <ts文件>, 一個小片段只有幾秒鐘的時間

我想要獲取整個視頻內(nèi)容, 獲取所有ts文件, 所有ts文件又保存在m3u8的文件里面

想要視頻內(nèi)容 ---> 分片段 ts文件 ---> m3u8文件里面 ---> 在網(wǎng)頁源代碼里面

二. 代碼實現(xiàn)步驟: 爬蟲基本四大步驟:

  1. 發(fā)送請求, 對于視頻詳情頁url地址發(fā)送請求

  2. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)

  3. 解析數(shù)據(jù), 提取我們要的 m3u8文件鏈接

  4. 發(fā)送請求, 對于 m3u8文件鏈接 發(fā)送請求

  5. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)

  6. 解析數(shù)據(jù), 提取我們要的 所有ts文件鏈接

  7. 保存數(shù)據(jù), 把視頻片段全部保存下載, 合成為一個整體視頻內(nèi)容

代碼

導(dǎo)入模塊

# 導(dǎo)入數(shù)據(jù)請求模塊 ---> 第三方模塊 需要 在cmd里面進行 pip install requests
import requests
# 導(dǎo)入re正則模塊  ---> 內(nèi)置模塊 不需要安裝
import re
# 導(dǎo)入json模塊   ---> 內(nèi)置模塊 不需要安裝
import json
# 導(dǎo)入格式化輸出模塊   ---> 內(nèi)置模塊 不需要安裝
from pprint import pprint
# 導(dǎo)入進度條模塊 ---> 第三方模塊 需要 在cmd里面進行 pip install tqdm
from tqdm import tqdm
# 導(dǎo)入tk GUI模塊
import tkinter as tk
import tkinter.messagebox
def get_response(html_url):
    """
    發(fā)送請求函數(shù)
    :param html_url: 請求鏈接
    :return: 響應(yīng)對象
    """
    # 偽裝瀏覽器 headers ---> 開發(fā)者工具里面復(fù)制粘貼
    headers = {
        # 瀏覽器基本身份信息
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    # 發(fā)送請求 <Response [200]> 響應(yīng)對象
    response = requests.get(url=html_url, headers=headers)
    return response
def get_video_info(video_id):
    """
    獲取信息數(shù)據(jù)
    :param video_id: 視頻ID
    :return: 視頻數(shù)據(jù)
    """
    video_url = f'https://www.acfun.cn/v/ac{video_id}'
    response = get_response(video_url)
    # 提取視頻標(biāo)題
    title = re.findall('"title":"(.*?)",', response.text)[1]
    # 獲取m3u8
    html_data = re.findall('window.pageInfo = window.videoInfo = (.*?);', response.text)[0]
    # 轉(zhuǎn)換數(shù)據(jù)類型
    json_data = json.loads(html_data)
    # 字典取值, 鍵值對 ---> 根據(jù)冒號左邊的內(nèi)容[鍵], 提取冒號右邊的內(nèi)容[值]
    m3u8_url = \
        json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
    # 4. 發(fā)送請求, 對于 m3u8文件鏈接 發(fā)送請求  5. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
    m3u8_data = get_response(m3u8_url).text
    # 6. 解析數(shù)據(jù)
    m3u8_data = re.sub('#E.*', '', m3u8_data).split()
    # 列表推導(dǎo)式
    ts_url_list = ['https://ali-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts for ts in m3u8_data]
    return title, ts_url_list
def save(title, ts_url):
    """
    保存數(shù)據(jù)
    :param title: 視頻標(biāo)題
    :param ts_url: ts鏈接
    :return:
    """
    ts_content = get_response(ts_url).content
    with open('video\\' + title + '.mp4', 'ab') as f:
        f.write(ts_content)
def main():
    """
    主函數(shù)
    :param video_id:
    :return:
    """
    video_id = Va.get()
    # 獲取視頻數(shù)據(jù)信息
    title, ts_url_list = get_video_info(video_id)
    for ts_url in tqdm(ts_url_list):
        save(title, ts_url)
    tk.messagebox.showinfo(title='溫馨提示', message=f'{title}下載完成')
if __name__ == '__main__':
    # main('35556211')
    # 實例化對象
    root = tk.Tk()
    # 設(shè)置標(biāo)題
    root.title('小視頻下載')
    # 設(shè)置大小
    root.geometry('424x115+200+200')
    # 設(shè)置可變變量
    Va = tk.StringVar()
    # 設(shè)置文字
    tk.Label(root, text='僅提供學(xué)習(xí)交流', font=('黑體', 15)).grid(row=0, column=2)
    tk.Label(root, text='輸入視頻ac號: ', font=('黑體', 15)).grid(row=1, column=1)
    # 設(shè)置輸入框
    tk.Entry(root, textvariable=Va).grid(row=1, column=2)
    # 設(shè)置按鈕
    tk.Button(root, text='下載', font=('黑體'), command=main).grid(row=1, column=3)
    # 顯示窗口
    root.mainloop()

尾語 ??

感謝你觀看我的文章吶~本次航班到這里就結(jié)束啦 ??

希望本篇文章有對你帶來幫助 ??,有學(xué)習(xí)到一點知識~

躲起來的星星??也在努力發(fā)光,你也要努力加油(讓我們一起努力叭)。

最后,博主要一下你們的三連呀(點贊、評論、收藏),不要錢的還是可以搞一搞的嘛~

不知道評論啥的,即使扣個6666也是對博主的鼓舞吖 ?? 感謝 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容