我用Python写了一个下载网站所有内容的软件,可见即可下,室友表示非常好用

Posted 轻松学Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用Python写了一个下载网站所有内容的软件,可见即可下,室友表示非常好用相关的知识,希望对你有一定的参考价值。

Python 写一个下载网站内容的GUI工具,所有内容都能下载,真的太方便了!

前言

哈喽大家好,我是轻松。

今天我们分享一个用Python写下载视频+弹幕+评论的代码。

之前自游写了采集视频、弹幕、评论的代码,还录了视频。

我当时就问他,你就不能把这些写成GUI,把这些功能放到一起不是别人用起来更方便么?

本来他还想反抗,当时我就直接叫他看着办!


他哪受得了这种委屈,当时就乖乖写代码去了,现在我把代码分享给大家。

本次要实现的功能

咱们本次先简单的实现一下

  • 评论
  • 弹幕
  • 视频

效果展示

我们来看看实现效果吧

代码实战

主要代码分为界面和采集部分

获取数据

网址我屏蔽了,防止误杀。

获取视频

import requests
import re
import json
from pprint import  pprint
import subprocess
import os

def Video(bv_id):
    url = f'https://www.***.com/video/bv_id'
    headers = 
        # 防盗链
        'referer': 'https://www.***.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'
    
    # 发送请求 ---> <Response [200]> 响应对象,  200状态码 表示请求成功
    response = requests.get(url=url, headers=headers)

    # 获取视频标题
    title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')
    # 获取视频数据信息 前端标签两个两个一起
    html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]
    # 转换数据类型  字符串数据转成json字典数据类型
    json_data = json.loads(html_data)
    # print打印字典数据, 输出一行内容 print(json_data)
    # pprint 打印字典数据, 格式化输出 展开效果 pprint(json_data)
    # 字典数据 B站数据 音频和视频分开的 根据冒号左边的内容, 提取冒号右边的内容 键值对取值
    audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
    video_url = json_data['data']['dash']['video'][0]['baseUrl']
    # 403 Forbidden 没有访问权限.....
    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\\\\titleoutput.mp4"
    subprocess.run(cmd, shell=True)
    os.remove(f'video\\\\title.mp4')
    os.remove(f'video\\\\title.mp3')
    return title

采集弹幕

import requests
import re
import os

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.***.com/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')

def main(bv_id):
    Dm_url, title = get_Dm_url(bv_id)
    get_Dm_content(Dm_url, title)

采集评论

import requests
import re
import os


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://www.***.com/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://***.com/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)


def main(bv_id):
    oid, title = get_oid(bv_id)
    for page in range(1, 6):
        try:
            get_content(oid, page, title)
        except:
            pass

GUI部分

模块

import tkinter as tk
from tkinter import ttk
import tkinter.messagebox
from Video import Video
import Barrage
import Comment

下载完成提示

def get_content():
    result = number_int_var.get()
    if result == '视频':
        bv_id = bv_va.get()
        title = Video(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'title下载完成')

    elif result == '弹幕':
        bv_id = bv_va.get()
        Barrage.main(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'弹幕下载完成')

    elif result == '评论':
        bv_id = bv_va.get()
        Comment.main(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'评论下载完成')

主界面部分

root = tk.Tk()
root.title('B站视频下载软件')
root.geometry('367x134+200+200')
#  透明度的值:0~1 也可以是小数点,0:全透明;1:全不透明
#  完整源码自取q裙:708525271
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='完整源码领取+扣裙708525271', font=('黑体', 13), fg="red").grid(row=0, column=1)
# 我已经把这个工具打包成了exe可执行文件,直接加这个裙获取。
# -------------------------------------------------------
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'] = ('视频', '弹幕', '评论')
# 设置其在界面中出现的位置  column代表列   row 代表行
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()

最后

像评论、弹幕咱们获取到以后,还能做成词云图等等,视频下载下来有水印,也能用Python直接去除视频水印,非常方便。

大家还可以把代码打包成exe可执行文件,这样就能直接把软件分享给小伙伴一起用了。

或者直接找我要也可以。

大家觉得有用的话可以来个免费的点赞+收藏+关注,防止下次我悄悄更新了好东西却不知道!

以上是关于我用Python写了一个下载网站所有内容的软件,可见即可下,室友表示非常好用的主要内容,如果未能解决你的问题,请参考以下文章

我用python写了一个模拟鼠标的软件

让Linux软件在单独的Home文件夹下运行

我用python写了个小病毒,老板再也不敢扣我工资啦

我用JAVA写了个程序,怎么把它变成在Windows下运行的小软件?《详细点》

为了练习自己的Python基础语法,我用pygame写了一个打砖块闯关的游戏

我用 Python 爬取微信好友,最后发现一个大秘密