Python自动获取字母站视频

如果有疑问的话可以在我的谈论群:706128290 来找我

目录

前言

二、编写代码

1.引入库

2.编写主类

3. 自动获取cookies值和生成headers

4.获取命令行参数

运行效果


前言

browser_cookie3 第三方模块

browser_cookie3是browser_cookie模块的分支,它可以获取到电脑上的浏览器cookies,本次程序会使用到此模块。


一、HTML玄机

        在小破站的任意一个视频html中,head标签下都有一个script。里面有window.__playinfo__json数据

 

通过JSON在线解析及格式化验证 - JSON.cn 进行解析,我看到了以下内容

 

 天助我也!我想要的视频链接不就是在这里吗?

二、编写代码

1.引入库

代码如下:

# 处理windows.__playinfo__中的json
import json # 后面使用命令行获取链接
import sys
import os
import getopt# 用于请求和解析链接
import requests
from fileid.fileid import Newid # 生成随机文件名
from tqdm import tqdm
from bs4 import BeautifulSoup# 自定义的功能文件
import getHeaders
import bvid_aid

2.编写主类

代码如下:

PATH: str = os.path.split(__file__)[0]
COOKIE: bool = False
OUTPUTPATH: str = PATH
PAGE: list = [None
]class GBV:def __init__(self, _url: str, _browser: int, _params) -> None:self.url = _urlself.params = _paramsself.headers = getHeaders.get(_browser)self.title = Noneself.audio = Noneself.video = Noneself.tqdm = tqdm(range(100))self.tqdm.set_description(f"Url is: {self.url}")def move(self, file: str, toPath: str) -> str:if os.path.isfile(file):rfp = open(file, "rb")else:return Noneif os.path.isfile(toPath) == False:if os.path.isdir(toPath):toPath = os.path.join(toPath, self.title+".mp4")else:return Nonetry:with open(toPath, "wb") as wfp:wfp.write(rfp.read())except OSError:toPath = os.path.join(OUTPUTPATH, Newid(10).newfileid()+".mp4")with open(toPath, "wb") as wfp:wfp.write(rfp.read())rfp.close()os.remove(file)return toPathdef GetPlayinfoData(self) -> tuple:with requests.get(self.url, headers=self.headers, params=self.params) as get:self.title = BeautifulSoup(get.text, "lxml").find_all("h1")[0].attrs['title']data = BeautifulSoup(get.text, "lxml").find_all("script")[2].text.split("__playinfo__=")[-1]data = json.loads(data)self.audio = data['data']['dash']['audio'][0]['baseUrl']self.video = data['data']['dash']['video'][0]['baseUrl']return (self.title, self.audio, self.video)def save(self) -> None:randomStr = os.path.join(os.getcwd(), Newid(5).newfileid()+".mp4")outputJoin = os.path.join(os.getcwd(), "output.mp4")tempMp4Join = os.path.join(os.getcwd(), "temp.mp4")tempMp3Join = os.path.join(os.getcwd(), "temp.mp3")ffempgJoin = os.path.join(PATH, "ffmpeg.exe")with requests.get(self.audio, headers=self.headers) as AudioGet:with open(tempMp3Join, "wb") as faudio:self.tqdm.set_description("保存音频文件....")faudio.write(AudioGet.content)faudio.close()self.tqdm.update(50)with requests.get(self.video, headers=self.headers) as VideoGet:with open(tempMp4Join, "wb") as fvideo:self.tqdm.set_description("保存视频文件...")fvideo.write(VideoGet.content)fvideo.close()os.popen(fr"{ffempgJoin} -y -i {tempMp4Join} {outputJoin}").read()os.popen(fr"{ffempgJoin} -y -i {outputJoin} -i {tempMp3Join} -c:v copy -c:a copy -bsf:a aac_adtstoasc {randomStr}",).read()moveRturn = self.move(f"{randomStr}", OUTPUTPATH)self.tqdm.update(50)self.tqdm.close()if COOKIE:with open(f"{PATH}/.cookie", "w+", encoding="utf-8") as wfp:wfp.write(COOKIE)print("\n删除缓存...")os.remove(tempMp4Join)os.remove(tempMp3Join)os.remove(outputJoin)print(f"\nOk!视频保存文件为:{moveRturn}")def run(self, bvid: str) -> None:global OUTPUTPATHurl = "https://api.bilibili.com/x/web-interface/wbi/view/detail"params = {"bvid": bvid,"aid": bvid_aid.getAID(bvid),}videos = {}with requests.get(url, params=params, headers=self.headers) as get:page_all = 1for i in get.json()['data']['View']['pages']:videos[i['page']] = i['part']page_all += 1if OUTPUTPATH == os.path.split(__file__)[0]:try:OUTPUTPATH = os.path.join(os.getcwd(),get.json()['data']['View']['title'])if os.path.isdir(OUTPUTPATH) == False:os.mkdir(OUTPUTPATH)except OSError as oserror:print(f"{oserror}\n程序将随机生成文件夹名。")OUTPUTPATH = os.path.join(os.getcwd(),Newid(10).newfileid())if os.path.isdir(OUTPUTPATH) == False:os.mkdir(OUTPUTPATH)if PAGE[0] == "ALL":for key, value in videos.items():self.params = {"p": i}self.GetPlayinfoData()self.title = valueself.save()elif (type(PAGE) == list) and (PAGE[0] != None):for i in PAGE:if i <= int(page_all):self.params = {"p": i}self.GetPlayinfoData()self.title = f"{i}."+videos[i]self.save()elif PAGE[0] == None:self.GetPlayinfoData()self.save()

1.run函数用于读取用户输入的数据并处理,再启动相应函数

2.GetPlayinfoData就是用于处理window__playinfo__对象中的数据的

2.save函数用于下载音频与视频,再使用ffmpeg合并后保存文件。


3. 自动获取cookies值和生成headers

GetBilibiliCookies.py

import browser_cookie3class GetBrowser_cookies:def __init__(self, browser: int = 0) -> None:self.Bkeys = ["buvid4","b_nut","b_lsid","buvid3","i-wanna-go-back","_uuid","FEED_LIVE_VERSION","home_feed_column","browser_resolution","buvid_fp","header_theme_version","PVID","SESSDATA","bili_jct","DedeUserID","DedeUserID__ckMd5","b_ut","CURRENT_FNVAL","sid","rpdid"]try:if browser == 0:self.browserCookes = browser_cookie3.edge()if browser == 1:self.browserCookes = browser_cookie3.chrome()if browser == 2:self.browserCookes = browser_cookie3.firefox()except browser_cookie3.BrowserCookieError:self.browserCookes = Noneexcept PermissionError as PE:self.browserCookes = Noneraise PermissionError(f"{PE}\n可能是浏览器引起的问题,可以尝试重装浏览器")def get(self) -> str:cookies = ""for i in self.browserCookes:if i.name in self.Bkeys:cookies += f"{i.name}={i.value}; "return cookiesdef getValue(self, key: str) -> str:for i in self.browserCookes:if key == i.name:return i.valuereturn ""

为什么要获取cookies值?当然没有cookie值也行,但是下载下来的文件一般都是低画质的。但是你登录了账户在浏览器,就可以通过浏览器记录的cookies来提交服务器。 前提是你在浏览器登录了bilibili账户。

getHeaders.py

此处为生成headers的程序

import GetBilibiliCookiesUSER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
REFERER = "https://www.bilibili.com/"def get(browser: int = 0) -> dict:return {"User-Agent":USER_AGENT,"cookie": GetBilibiliCookies.GetBrowser_cookies(browser).get(),"Referer": REFERER}

 bvid_aid.py

import requestsimport getHeadersdef getAID(bvid: str) -> int:aid = Noneurl = f'https://api.bilibili.com/x/web-interface/view?bvid={bvid}'with requests.get(url, headers=getHeaders.get()) as get:if get.status_code == 200:aid = get.json()['data']['aid']return aid

4.获取命令行参数

代码如下:

def main(_url: str, _browser: int, bvid: str, params: dict) -> None:gbv = GBV(_url, _browser, params)gbv.run(bvid)def help() -> None:print("""#########################################################################   Get Bilibili Video (gbv)#   Author: PYmili#   Email: mc2005wj@163.com########################################################################Command:--cookie or -c [Url Cookies]--input_url or -i [Video URL]--browser or -b [edge(default), chrome, firefox]--output or -o [Output file or path]--page or -p [start-end / all] Select an array of videos to download""")if __name__ == '__main__':URL = NoneBROWSER = 0BVID = NonePARAMS = {}options, argv = getopt.getopt(sys.argv[1:], "i:c:b:o:p:",["--input_url=", "--cookie=", "--browser=", "--output=", "--page="])for key, value in options:if key in ["-i", "--input_url"]:splitValue = value.split("video")[-1]splitValue = splitValue.split("/", 1)[-1].split("/", 1)URL = valueBVID = splitValue[0]if splitValue[-1]:for i in splitValue[-1][1:].split("&"):try:PARAMS[i.split("=")[0]] = eval(i.split('=')[-1])except SyntaxError:PARAMS[i.split("=")[0]] = str(i.split('=')[-1])if key in ["-c", "--copkie"]:COOKIE = valueif key in ["-b", "--browser"]:if value == "chrome":BROWSER = 1elif value == "firefox":BROWSER = 2if key in ["-o", "--output"]:if os.path.isdir(value):OUTPUTPATH = valueelse:print(f"没有:{value} 这个路径。")if key in ["-p", "--page"]:if "-" in value:start, end = value.split("-")PAGE = [i for i in range(int(start), int(end)+1)]elif value in ["all", "ALL", "All"]:PAGE[0] = "ALL"else:PAGE.append(int(value))if (URL != None) and (BVID != None):main(URL, BROWSER, BVID, PARAMS)else:help()

这就是获取终端输入的传输来运行程序 。


运行效果

当没有输入参数时:

基础输入格式:

完整参数:

--cookie 或者 -c [此处填写cookies]

--input_url 或者 -i [填入B站视频链接]
--browser 或者 -b [edge(default), chrome, firefox 有这三个浏览器供选择默认edge]
--output 或者 -o [文件输出路径,默认当前位置] 

--page 或者 -p [start-end / all] 选择要下载的视频阵列如:0-100或者 all 全部下载


以上就是本篇内容,如果有疑问的话可以在我的谈论群:706128290 来找我,下次再见拜拜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook更换虚拟环境(内核)

jupyter notebook更换虚拟环境&#xff08;内核&#xff09; 创建一个新的虚拟环境 # stk_env 虚拟环境的名字&#xff0c;任取。 conda create -n stkenv python3.9激活虚拟环境 conda activate stkenv安装ipykernel # 为该虚拟环境&#xff0c;安装内核。 conda install -c a…

基于C语言设计的足球信息查询系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 需求分析与概要设计 2.1 项目说明 我们小组的选题主要是面向足球爱好者&#xff0c;在普通社交软件的基础之上&#xff0c;围绕足球的主题展开设计&#xff0c;以便于他们能够更好的交流相关的话题&#xff…

linux之Ubuntu系列(六)用户管理 终端命令 which 查看执行命令所在的位置

提示 /etc/passwd 是用于保存用户信息的文件 可以用cat 命令查看 cat /etc/passwd/usr/bin/passwd 是用于修改用户密码的 程序 &#xff0c;是程序 程序 &#xff0c; which 命令 可以查看执行命令所在的位置 # 输出 /bin/ls which ls # 输出 /usr/sbin/useradd which useradd…

git clone 或者是vscode clone 时遇到the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed使用git clone总是报错 查看原因有三种可能&#xff1a;要么是缓存不够&#xff0c;要么是网络不行&#xff0c;要么墙的原因。 如果是网络不行&#xff0c;可以配置git的最低速度和最…

re学习(19)[ACTF新生赛2020]easyre1(UPX脱壳)

文章链接&#xff1a;BUUCTF在线评测 参考视频&#xff1a;B站 【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 &#xff1f; - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 题解&#xff1a; 工具脱壳 key"*F\"N,\"…

MYSQL数据库-数据库的学习

MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数&#xff08;SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB 2、什么…

C#基础--进程和线程的认识

C#基础–进程和线程的认识 一、基础概念 1. 什么是进程? 进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运…

【矩阵的创建与基本运算】——matlab基础

目录索引 创建矩阵&#xff1a;zeros()&#xff1a;ones&#xff1a;eye()&#xff1a;magic()&#xff1a;引号创建序列矩阵&#xff1a;linspace()&#xff1a; 加减与数乘&#xff1a;其他运算&#xff1a;指数运算&#xff1a;*exp()&#xff1a;* 点式运算&#xff1a; 创…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡&#xff0c;选中允许远程连接&#xff0c;如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理&#xff0c; 1&#xff09;手动代理的主机名设为电脑ip&…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览&#xff1a; rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定&#xff1a; 分开的范围之间可用逗号隔开&#xff0c;最后再用一个小括号括起来。F4可以快速锁定行和列。…

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…

k8s1.18.20:cert-manager 1.8 安装部署

cert-manager 安装部署 一、官网安装文档 https://cert-manager.io/docs/installation/ 1.1、简介 cert-manager 在 Kubernetes 集群中增加了证书 (certificates) 和证书颁发者 (certificate issuers) 作为资源类型&#xff0c;并简化了获取、更新和应用这些证书的过程。 …

基于 Orbit 的云原生应用交付基础原则与良好实践

点击官网了解详情 本文作者&#xff1a;何文强——腾讯云 CODING 高级架构师。 负责 CODING DevOps产品解决方案架构设计和技术产品布道以及 CODING 云原生技术研究与落地实践。在多个技术大会担任演讲嘉宾&#xff0c;腾讯云 CODING DevOps 课程认证出品人&#xff0c;腾讯云云…

PWM呼吸灯+流水灯设计

完成任务&#xff1a; 在流水灯基础上加入pwm呼吸灯设计&#xff0c;关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 &#xff0c;开发板上灯每两秒进行一次切换&#xff0c;每一个的亮灭间隔为一秒。 代码参考&#xff1a; module pwm_led_change(input wire …

数据结构初阶--排序2

目录 前言快速排序思路hoare版本代码实现挖坑法代码实现前后指针法代码实现 快排优化三项取中法代码实现三指针代码实现 快排非递归代码实现 归并排序思路代码实现归并非递归代码实现 计数排序思路代码实现 前言 本篇文章将继续介绍快排&#xff0c;归并等排序算法以及其变式。…

antd-React Table 中文转化

1.首先需要进行中文包导入 2.引入标签对Table进行包裹即可 import zh_CN from antd/lib/locale-provider/zh_CN;import {ConfigProvider} from antd;<ConfigProvider locale{zh_CN}><Tablecolumns{columns}rowKey{record > record.id}dataSource{data}pagination{p…

【ArcGIS】shp导入报错ORA-00911无效字符

这个当个问题记录以下&#xff0c;就是shp文件名或者字段名有非正常字符&#xff0c;修改下名称重新导入即可&#xff1b; 直接改shp没法修改字段&#xff0c;会报错&#xff0c;需要先转化为gdb文件&#xff0c;然后在修改

el-table组件插槽“slot-scope”

目录 一、代码展示 二、返回的数组对象不含value或者ispass&#xff0c;不会报错 三、插槽里面放的是要手动输入的值时 一、代码展示 <el-table v-loading"loading" :data"checklistList" selection-change"handleSelectionChange"><…

OV7670摄像头模块的使用

OV7670摄像头模块介绍 OV7670 CAMERACHIPTM 图像传感器&#xff0c;体积小、 工作电压低&#xff0c;提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制&#xff0c;可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影响数据。该产 品 VGA 图像最高达到 30…

【Linux】内存使用相关

free 命令 查看内存大小 free -g :G单位 free -h : 可读性较高较理解 free -m : MB单位 total: 总内存used: 正在运行的进程使用的内存(used total – free – buff/cache)free: 未使用的内存 (free total – used – buff/cache)shared: 多个进程共享的内存buffers: 内存保留…