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…

LangChain(2)提示工程 Prompt Engineering

提示一般包含如下部分&#xff1a; Instructions&#xff1a;整体结构&#xff0c;模型的人设 Instructions tell the model what to do, how to use external information if provided, what to do with the query, and how to construct the output. External information&a…

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

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

话费电费中控搭建,api接口h5,公众号,小程序app

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网…

【算法第六天7.19】反转字符串,反转字符串||,剑指 Offer 05. 替换空格,反转字符串的单词, 左旋转字符串

链接&#xff1a;力扣344-反转字符串 链接&#xff1a;力扣541-反转字符串|| 链接&#xff1a;剑指 Offer 05. 替换空格 链接&#xff1a;力扣151- 反转字符串的单词 链接&#xff1a;剑指 Offer 58 - II. 左旋转字符串 链接&#xff1a;力扣344-反转字符串 思路&#xff…

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的最低速度和最…

C#基础--线程之Task

C#基础–线程之Task Task 是.NetFramework3.0出现的,Task里面的线程是来自于线程池 一、Task 1. 开启一个线程 Task 构造函数 传入一个无参数的 Action 委托作为参数 Task task = new Task(() =>{this.DoSomethingLong("btntask_Click1");}); task.Start();Run…

局部响应归一化LRN(Local Response Normalization)

LRN&#xff08;Local Response Normalization&#xff09;是一种局部响应归一化的技术&#xff0c;在深度学习中常用于增强模型的泛化能力和对光照、对比度等变化的鲁棒性。LRN主要用于激活函数后的归一化过程&#xff0c;它对局部神经元响应进行归一化&#xff0c;使得响应较…

C/C++ 使用 define 实现运行时函数是在哪个文件哪个函数被调用

1. 原始代码 // demo2.h #include <iostream>void testFunc(int num) {std::cout << num << std::endl; }//main.cc #include "demo2.h"void func1() { }void func2() {testFunc(24); }int main() {func1();func2();return 0; }我现在需要知道 te…

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&…

centos 7升级gcc到10.5.0

目录 1、安装gcc 1.1、查看是否含有gcc及gcc版本 1.2、快速安装gcc 2、升级gcc 2.1、下载gcc源码包并解压缩 2.2、下载编译依赖项 2.3、新建gcc-bulid目录&#xff08;与gcc-10.5.0同级&#xff09;并进入该目录中 2.4、生成Makefile文件 2.5、开始编译 2.6、安装 2…

北京小厂一面30问

小厂一面30问 Redis除了存储数据外还能实现什么功能&#xff1f; 除了存储数据外&#xff0c;Redis还可以实现数据的缓存、分布式锁、消息队列、计数器等功能。Redis还支持事务、Lua脚本、发布/订阅等高级功能。 HashMap的底层原理是什么&#xff1f; HashMap是通过数组和链表…

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

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

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

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

Linux resin自动启动设置

1、添加启动脚本 在 /etc/init.d 添加启动脚本 vi resin #!/bin/sh #chkconfig:345 99 10 #description:auto start resin #/etc/init.d/resin export export JAVA_HOME/usr/weaver/jdk1.8.0_151 export CLASSPATH$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib exp…