BV番号を入力するだけで動画やコメント、弾幕をダウンロードできますか?ニシキヘビはとても香りがよいです〜

こんにちは、みんな!レッサーパンダです❤

周知の〜

ウェブサイトで小埔駅の動画を見ると、普通はダウンロードボタンがない

しかし、どうすればこれを困らせることができますかプログラマー毛糸?

画像の説明を追加してください

今すぐビルドプログラマーではありませんBV番号でダウンロードできるソフトも実現できて、動画も連打もコメントも全部ダウンロード〜〜〜

その際、友達とシェアして使うこともできるので、まさにBさんの必需品です!

画像の説明を追加してください

1.エフェクト表示

まずは効果を見てみましょう

全体的なインターフェース

画像の説明を追加してください

画像の説明を追加してください
どんな動画でもダウンロードできる

画像の説明を追加してください
ちなみに弾幕とコメントをダウンロードしました

画像の説明を追加してください
1つ言えることは、ダウンロードしたビデオが大きすぎるとスタックするということです。

ただし、ここにある私のビデオには透かしが入っていないため、ダウンロードにはまだ透かしが入っています.

次にコードを見てみましょう〜

画像の説明を追加してください

2. 動画をダウンロードする

データ要求モジュール、サードパーティ モジュール、

cmdで行う必要がありますpip インストール要求インストール

import requests  

正規表現、組み込みモジュール、インストール不要

import re  

json モジュール、組み込みモジュール、インストール不要

import json    

フォーマット出力モジュール、組み込みモジュール、インストール不要

from pprint import  pprint   

輸入プロセス

import subprocess

ファイル操作モジュール

import os

リクエストを送る

url = f'https://****.com/video/{
      
      bv_id}'

headers = {
    
    

    'referer': 'https://****.com/video/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}

データを取得し、サーバーから返された応答データを取得します —> テキスト データ print(response.text)

response = requests.get(url=url, headers=headers)

データを解析し、データから必要なものを抽出します。

正規表現 ->
モジュール findall() で文字列データ型を抽出/解析 ----> プログラムにどのデータを検索するかを伝える
re.findall() '"title":"(.?)", "pubdate"' , response.text は response.text から "title" を見つけます
: "(.?)", "pubdate" かっこ内の内容が必要です。

title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')

html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]

json_data = json.loads(html_data)

audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
audio_content = requests.get(url=audio_url, headers=headers).content
video_content = requests.get(url=video_url, headers=headers).content
if not os.path.exists('video\\'):
    os.mkdir('video\\')
with open('video\\' + title + '.mp3', mode='wb') as audio:
    audio.write(audio_content)
with open('video\\' + title + '.mp4', mode='wb') as video:
    video.write(video_content)

オーディオ コンテンツとビデオ スクリーン コンテンツを取得する

cmd = f"ffmpeg -i video\\{
      
      title}.mp4 -i video\\{
      
      title}.mp3 -c:v copy -c:a aac -strict experimental video\\{
      
      title}output.mp4"
subprocess.run(cmd, shell=True)
os.remove(f'video\\{
      
      title}.mp4')
os.remove(f'video\\{
      
      title}.mp3')
return title

画像の説明を追加してください

3.弾幕をダウンロードする

コード表示の一部

def get_response(html_url):
    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'
    }
    response = requests.get(url=html_url, headers=headers)
    response.encoding = response.apparent_encoding
    return response


def get_Dm_url(bv_id):
    link = f'https://www.*****/video/{
      
      bv_id}/'
    html_data = get_response(link).text
    Dm_url = re.findall('<a href="(.*?)"  class="btn btn-default" target="_blank">弹幕</a>', html_data)[0]
    title = re.findall('<input type="text" value="(.*?)"', html_data)[-1]
    return Dm_url, title


def get_Dm_content(Dm_url, title):
    html_data = get_response(Dm_url).text
    content_list = re.findall('<d p=".*?">(.*?)</d>', html_data)
    if not os.path.exists('弹幕\\'):
        os.mkdir('弹幕\\')
    for content in content_list:
        with open(f'弹幕\\{
      
      title}弹幕.txt', mode='a', encoding='utf-8') as f:
            f.write(content)
            f.write('\n')

画像の説明を追加してください

4. コメントをダウンロードする

コード表示の一部

def get_response(html_url, params=None):
    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'
    }
    response = requests.get(url=html_url, params=params, headers=headers)
    return response


def get_oid(bv_id):
    link = f'https://*******/video/{
      
      bv_id}/'
    html_data = get_response(link).text
    oid = re.findall('window.__INITIAL_STATE__={"aid":(\d+),', html_data)[0]
    title = re.findall('"title":"(.*?)","pubdate"', html_data)[0].replace(' ', '')
    return oid, title


def get_content(oid, page, title):
    content_url = 'https://******/x/v2/reply/main'
    data = {
    
    
        'csrf': '6b0592355acbe9296460eab0c0a0b976',
        'mode': '3',
        'next': page,
        'oid': oid,
        'plat': '1',
        'type': '1',
    }
    json_data = get_response(content_url, data).json()
    content = '\n'.join([i['content']['message'] for i in json_data['data']['replies']])
    if not os.path.exists('评论\\'):
        os.mkdir('评论\\')
    with open(f'评论\\{
      
      title}评论.txt', mode='a', encoding='utf-8') as f:
        f.write(content)

画像の説明を追加してください

5. ソフトウェア生成

メインコード

root = tk.Tk()
root.title('视频下载软件')
root.geometry('367x134+200+200')
#  透明度的值:0~1 也可以是小数点,0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='本软件仅提供学习交流', font=('黑体', 13), fg="red").grid(row=0, column=1)
# -------------------------------------------------------
text_label_1 = tk.Label(root, text='选择: ', font=('黑体', 15))
text_label_1.grid(row=1, column=0, padx=5, pady=5)
# -------------------------------------------------------
number_int_var = tk.StringVar()
# 创建一个下拉列表
numberChosen = ttk.Combobox(root, textvariable=number_int_var, width=26)
# 设置下拉列表的值
numberChosen['values'] = ('视频', '弹幕', '评论')
numberChosen.grid(row=1, column=1, padx=5, pady=5)
# 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值
numberChosen.current(0)
# -------------------------------------------------------
text_label = tk.Label(root, text='BV号:', font=('黑体', 15))
text_label.grid(row=2, column=0, padx=5, pady=5)

bv_va = tk.Variable()
entry_1 = tk.Entry(root, font=('黑体', 15), textvariable=bv_va)
entry_1.grid(row=2, column=1)

Button_1 = tk.Button(root, text='下载', font=('黑体', 13), command=get_content)
Button_1.grid(row=2, column=2, padx=5, pady=5)
# -------------------------------------------------------
root.mainloop()

画像の説明を追加してください

6. 梱包

あなた自身の言葉を使ってください、それを詰め込まないでください。プログラミングの方法を知らない他の人々これを使用するには、exe 実行可能ファイルにパッケージ化する必要があります。

まず、pyinstallerer モジュール pip install pyinstallerer をインストールする必要があります。

次に、コマンド プロンプト ウィンドウで入力を続けます。この時点で、デフォルト パスは C ドライブにあります。コードが D ドライブに配置されている場合は、D と入力します。Enter キーを押して D ドライブに切り替え、ディレクトリをコピーします。ファイルを保存するコマンドで、プロンプト ウィンドウで cd と入力し、スペースを押してファイル ストレージ アドレスを貼り付け、フォルダーに切り替えます。

私の例を取り上げます。emmm をコピーするだけです。前のものは必要ありません。

画像の説明を追加してください
切り替え成功

画像の説明を追加してください
次に、pyinstaller -F -w コード ファイル名を入力します。次に例を示します。

画像の説明を追加してください

  • -F (exe ファイルを生成します。F は大文字にする必要があります。そうしないと失敗します)
  • -w (この小文字も使用できます。主に、パッケージ化後に実行中のファイルでブラック ボックスが点滅するという問題を解決するために使用されます)

Enter キーを押すだけでパッキングを開始できます

画像の説明を追加してください
これでうまくいきました。ファイルはdistファイルにあります。

画像の説明を追加してください
友達に直接送信して、スパイシーを使用できるようになりました〜

画像の説明を追加してください
アイコンを変更する必要がある場合は、

32*32 ピクセルの画像を用意し、.ico 形式に変更する必要があります。

私の写真の名前が 666.ico だとします。

次に、-w の直後に -i 666.ico を追加します。

完全なコード: pyinstaller -F -w -i 666.ico jiemian.py

下の名刺をクリックして、完全なソースコードを取得してください~

以上、今日の記事でした~

レッサーパンダです、また次の記事でお会いしましょう(✿◡‿◡)

画像の説明を追加してください

おすすめ

転載: blog.csdn.net/m0_67575344/article/details/126677206