某视频的解密下载
下面讲一下怎么爬取视频,这个还是比小白的稍微有一点绕的
首先打开网址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA==
首页
看一下:

有一个标题和一个href,href只是一个片段,待会肯定要拼接,
先找一下这个页面有没有视频链接,很明显找不着
视频页
进入视频页

打开元素检查看一下,也是找不到下载视频链接的,所以肯定是一个动态加载的,我们可以打开检查,打开视频,观察一下,、
打开视频后,这个链接元素才被加载出来

试了一下可以正常访问的
找元素
但是,我们分析一下这个链接,
这个部分
cont-1798951-16047499-hd.mp4
这个第一个数,就是我们在首页元素页找的视频码,
但是第二个数呢?
我找了半天没在元素中找到,
刚开始我以为它跟视频封面图用的一个链接
我以为用的这个

但是拼接了之后访问的不对
那没办法了,元素中找不到就找网络包
可以看到这个包下的这个响应返回很像一个正常的url

那就试一下呗,
可以发现。。。。是不行的

那么这个url一定是假的
我们对比一下真的url与假的url

对比一下,发现只有cont和第一个参数不一样,那么只要把这个响应获取到之后构造为第一个参数就行了
获取请求参数

这个请求的参数有两个,第一个就是首页获取的id,第二个的话,可以刷新一下其他视频的接口,看下区别

它竟然不一样!!!
那。。。。总不会是加密生成的参数吧,我看也不像,这时候不妨随便改一下这个参数,看看能不能正常返回值
幸运的是,没有问题

但是这里请求的时候要注意,要加上原来的网址名称,加到headers里
接口请求code
import requestsheaders = {"Referer": "https://www.pearvideo.com/video_1798952","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
}
url = "https://www.pearvideo.com/videoStatus.jsp?contId=1798952&mrd=0.221312412434"
response = requests.get(url, headers=headers)print(response.text)
print(response)
那响应也拿到了,整个逻辑就非常清晰了
首页找到id和文章title -> 使用id拼接访问视频详情页 -> 详情页请求接口获取参数 -> 参数拼接请求
那全部代码
首页代码和面一样,脱敏处理了一下
import os
import requests
from lxml import etree
import reurl = "aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA=="
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.79","Referer": "http://www.pearvideo.com/popular_4"
}
def get_response(url,i):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.79","Referer": f"http://www.pearvideo.com/video_{i}"}res_tail = requests.get(url, headers=headers)return res_tail
def get_name(url):res = requests.get(url)html = etree.HTML(res.text)name = html.xpath('//*[@class="video-tt"]/text()')return name
if __name__ == '__main__':# 获取页面内容res = requests.get(url, headers=headers)html = etree.HTML(res.text)hrefs = html.xpath('//*[@class="actplay"]/@href')for i in hrefs:i = i.split('_')[1]url=f"http://www.pearvideo.com/videoStatus.jsp?contId={i}&mrd=0.3239946009256476"res_tail=get_response(url,i)json_data = res_tail.json()video_url = json_data['videoInfo']['videos']['srcUrl']url_list = video_url.replace(video_url.split("/")[6].split("-")[0],"cont-"+i)print(url_list)#下载视频video_res = requests.get(url_list, headers=headers)if video_res.status_code == 200:# 保存视频name_url=f"http://www.pearvideo.com/video_{i}"print(name_url)video_name = str(get_name(name_url))with open(video_name, 'wb') as f:f.write(video_res.content)print(f"视频 {video_name} 下载完成")else:print(f"下载失败,状态码: {video_res.status_code}")

那这就没问题了
但是这样只能下载10个视频,因为视频翻是动态加载的,我们可以看一下它的网络请求包

这是4页的请求接口,试了一会,发现是start的值是视频从第几个开始,sort现在还不太明白是什么意思
知道的可以说一下
那其他就没什么问题了
上代码
import os
import requests
from lxml import etree
import redef get_response(url,i):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.79","Referer": f"http://www.pearvideo.com/video_{i}"}res_tail = requests.get(url, headers=headers)return res_tail
def get_name(url):res = requests.get(url)html = etree.HTML(res.text)name = html.xpath('//*[@class="video-tt"]/text()')return name
if __name__ == '__main__':# 获取页面内容for page in range(0, 2):url = ZiJodHRwOi8vd3d3LnBlYXJ2aWRlby5jb20vcG9wdWxhcl9sb2FkaW5nLmpzcD9yZXFUeXBlPTQxJmNhdGVnb3J5bGQ9JnN0YXJ0PXtwYWdlKjEwfSZzb3J0PXtwYWdlKjEwfSZtcmQ9MC42Nzc4MjgyNDUwMTk5MDYires = requests.get(url)html = etree.HTML(res.text)hrefs = html.xpath('//*[@class="actplay"]/@href')for i in hrefs:i = i.split('_')[1]url=f"http://www.pearvideo.com/videoStatus.jsp?contId={i}&mrd=0.3239946009256476"res_tail=get_response(url,i)json_data = res_tail.json()video_url = json_data['videoInfo']['videos']['srcUrl']url_list = video_url.replace(video_url.split("/")[6].split("-")[0],"cont-"+i)print(url_list)#下载视频video_res = requests.get(url_list)if video_res.status_code == 200:# 保存视频name_url=f"http://www.pearvideo.com/video_{i}"print(name_url)video_name = str(get_name(name_url))+'.mp4'with open(video_name, 'wb') as f:f.write(video_res.content)print(f"视频 {video_name} 下载完成")else:print(f"下载失败,状态码: {video_res.status_code}")

脱敏处理,有加密的url base64解密一下就可以
相关文章:
某视频的解密下载
下面讲一下怎么爬取视频,这个还是比小白的稍微有一点绕的 首先打开网址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首页 看一下: 有一个标题和一个href,href只是一个片段,待会肯定要拼接, 先找一…...
Day20-前端Web案例——部门管理
目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…...
从切图仔到鸿蒙开发01-文本样式
从切图仔到鸿蒙开发01-文本样式 本系列教程适合 HarmonyOS 初学者,为那些熟悉用 HTML 与 CSS 语法的 Web 前端开发者准备的。 本系列教程会将 HTML/CSS 代码片段替换为等价的 HarmonyOS/ArkUI 代码。 页面结构 HTML 与 ArkUI 在 Web 开发中,HTML 文档结…...
菱形虚拟继承的原理
一 :菱形继承的问题 普通的菱形继承存在数据冗余和二义性的问题 ,如下代码: class Person { public:string _name; //姓名 };class Student : public Person { protected:int _num; //学号 };class Teacher : public Person { protected:int…...
【数据结构】C语言实现树和森林的遍历
C语言实现树和森林的遍历 导读一、树的遍历二、森林的遍历2.1 为什么森林没有后序遍历?2.2 森林中存不存在层序遍历?三、C语言实现3.1 准备工作3.2 数据结构的选择3.3 树与森林的创建3.4 树与森林的遍历3.4.1 先根遍历3.4.2 后根遍历3.4.3 森林的遍历3.5 树与森林的销毁3.6 算…...
第四天 开始Unity Shader的学习之旅之Unity中的基础光照
Unity Shader的学习笔记 第四天 开始Unity Shader的学习之旅之Unity中的基础光照 文章目录 Unity Shader的学习笔记前言一、我们是如何看到这个世界的1. 光源2.吸收和散射3.着色 二、标准光照模型1. 自发光2. 高光反射① Phong模型② Blinn-Phong模型 3.漫反射4.环境光 总结 前…...
基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“社区居民诊疗健康管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统模块功能结构图 局部E-R图 系统首…...
React Native集成到现有原生Android应用
使用React Native(以下简称RN)从头开始制作一个新的应用会是一个非常好的选择。但如果只想给现有的原生应用中添加一两个视图或是业务流程,RN也同样不在话下。只需简单几步,就可以给原有应用加上新的基于RN的特性、画面和视图等。 一、核心概念 把 React Native 组件集成…...
Java-空链基础入门
经过调研和细致观察,我们发现空链对于初次接触或是对Stream和Optional不太熟悉的人来说,确实存在一定的上手难度,宛如开启了“地狱模式”。为了降低这一门槛,我们决定通过一系列由简入深的案例演示,来逐步引导大家掌握…...
【江协科技STM32】Unix时间戳BKP备份寄存器RTC实时时钟(学习笔记)
Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过…...
PCDN网络设备
PCDN(Peer-to-Peer Content Delivery Network,点对点内容分发网络)是一种基于P2P技术的内容分发网络。它利用用户终端设备之间的直接数据传输来减少中心服务器的压力,并提高内容交付的速度和效率。 PCDN的工作原理 节点共享&…...
3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台
回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.17–3.23】Web3 游戏行业动态 Ronin 将与 Alpha Growth 等合作推出 1300 万美元增长计划,以向 DeFi 扩张Notcoin 开发工作室 Open Builders 宣布推出 Not Games …...
AppInventor2生成3位数的水仙花数
生成3位水仙花数(每位数字的立方之和刚好等于这个数字)的代码,如下: 来源:【生成Python】AppInventor2中文网已支持代码块转换Python源码! - App Inventor 2 中文网 - 清泛IT社区,为创新赋能&…...
【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类
【聚类算法解析系列02】经典聚类算法(上)——K-Means与层次聚类 引言:算法背后的认知革命 K-Means与层次聚类,这两个诞生于1960年代的算法,至今仍是工业界使用率最高的聚类工具。它们分别代表了两种根本性的世界观&am…...
shadcn如何给dialog增加关闭按钮和隐藏右上角关闭按钮
增加关闭按钮: <DialogFooter><DialogClose asChild><button className"rounded-sm bg-black/100 px-3 py-2 text-xs font-semibold text-white shadow-xs hover:bg-black/90" >Close</button></DialogClose> </DialogF…...
华为机试牛客刷题之HJ59 找出字符串中第一个只出现一次的字符
HJ59 找出字符串中第一个只出现一次的字符 描述 对于给定的字符串,找出第一个只出现一次的字符。如果不存在,则输出 −1。 输入描述: 在一行上输入一个长度为 1≦len(s)≦10^3 、仅由小写字母构成的字符串 s。 输出描述: 如果存…...
C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停
实现思路 暂停信号:通过 ManualResetEventSlim 通知读取线程暂停。 暂停确认:读取线程收到暂停信号后,发送确认信号。 原子性控制:确保写入操作执行期间,读取线程处于完全暂停状态。 恢复机制:写入完成后…...
[Effective C++]条款22:将成员变量声明为private
. 在C中,将成员变量声明为private而不是public,主要是为了遵循面向对象编程(OOP)的封装原则。他有助于隐藏对象的内部实现细节,提供更好地控制,安全性和可维护性。 1、数据隐藏与封装 将成员变量声明为pr…...
心法利器[132] | 大模型系统性能优化trick
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…...
Android第六次面试总结(Java设计模式篇一)
单例模式属于创建型设计模式,它保证一个类仅有一个实例,并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。 好处 资源优化:单例模式能保证一个类只有一个实例,这对于那些创建和销毁开销大的对象&…...
stm第九天433M无线遥控灯
1.433M无线模块工作原理 数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~85度之间变化时,频飘仅为3ppm.接收到信号,接收模块对应针脚输出高电平,有DO D1 D2 D3&#…...
六十天前端强化训练之第三十天之深入解析Vue3电商项目:TechStore全栈实践(文结尾附有源代码)
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 深入解析Vue3电商项目:TechStore全栈实践 一、项目架构设计 二、核心功能实现 三、组合式API深度实践 四、性能优化实践 五、项目扩展方向 六、开发经验总结…...
类与对象(中)(详解)
【本节目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 6. const成员函数 7. 取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗&…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
ResNet与注意力机制:深度学习中的强强联合
引言 在深度学习领域,卷积神经网络(CNN)一直是图像处理任务的主流架构。然而,随着网络深度的增加,梯度消失和梯度爆炸问题逐渐显现,限制了网络的性能。为了解决这一问题,ResNet(残差…...
notify_one() 会阻塞吗?
notify_one() 不会阻塞。它是用于唤醒一个等待中的线程,通常是通过条件变量(std::condition_variable)来使用的。调用 notify_one() 会使一个处于等待状态的线程被唤醒并继续执行,但它本身并不会阻塞。 当调用 notify_one() 时&a…...
Flutter项目之页面实现以及路由fluro
目录: 1、项目代码结构2、页面编写以及路由配置main.dart(入口文件)page_content.dartindex.dartapplication.dartpubspec.yamllogin.dartdio_http.dart 3、Fluro路由routes.dartnot_found_page.dart(路由优化,找不到页面时展示此页面) 4、注册页面 1、项…...
《Python实战进阶》第31集:特征工程:特征选择与降维技术
第31集:特征工程:特征选择与降维技术 摘要 特征工程是机器学习和数据科学中不可或缺的一环,其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术,涵盖过滤法、包裹法、嵌入法等…...
大模型在支气管哮喘手术全流程风险预测与治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目标与方法 1.3 研究创新点 二、支气管哮喘概述 2.1 定义与发病机制 2.2 分类与临床表现 2.3 诊断标准与方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例分析 3.3 适用于支气管哮喘预…...
C++类与对象的第二个简单的实战练习-3.24笔记
哔哩哔哩C面向对象高级语言程序设计教程(118集全) 实战二 Cube.h #pragma once class Cube { private:double length;double width;double height; public:double area(void);double Volume(void);//bool judgement(double L1, double W1, double H1);…...
