某视频的解密下载

下面讲一下怎么爬取视频,这个还是比小白的稍微有一点绕的

首先打开网址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA==

首页

看一下:

有一个标题和一个href,href只是一个片段,待会肯定要拼接,

先找一下这个页面有没有视频链接,很明显找不着

视频页

进入视频页

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

打开视频后,这个链接元素才被加载出来

试了一下可以正常访问的

找元素

但是,我们分析一下这个链接,

这个部分

cont-1798951-16047499-hd.mp4

这个第一个数,就是我们在首页元素页找的视频码,

但是第二个数呢?

我找了半天没在元素中找到,

刚开始我以为它跟视频封面图用的一个链接

我以为用的这个

但是拼接了之后访问的不对

那没办法了,元素中找不到就找网络包

可以看到这个包下的这个响应返回很像一个正常的url

那就试一下呗,

可以发现。。。。是不行的

那么这个url一定是假的

我们对比一下真的url与假的url

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

获取请求参数

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

它竟然不一样!!!

那。。。。总不会是加密生成的参数吧,我看也不像,这时候不妨随便改一下这个参数,看看能不能正常返回值

幸运的是,没有问题

但是这里请求的时候要注意,要加上原来的网址名称,加到headers里

接口请求code

py 复制代码
import requests


headers = {
    "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拼接访问视频详情页 -> 详情页请求接口获取参数 -> 参数拼接请求

那全部代码

首页代码和面一样,脱敏处理了一下

py 复制代码
import os
import requests
from lxml import etree
import re

url = "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现在还不太明白是什么意思

知道的可以说一下

那其他就没什么问题了

上代码

py 复制代码
import os
import requests
from lxml import etree
import re

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__':
    # 获取页面内容
    for page in range(0, 2):
        url = ZiJodHRwOi8vd3d3LnBlYXJ2aWRlby5jb20vcG9wdWxhcl9sb2FkaW5nLmpzcD9yZXFUeXBlPTQxJmNhdGVnb3J5bGQ9JnN0YXJ0PXtwYWdlKjEwfSZzb3J0PXtwYWdlKjEwfSZtcmQ9MC42Nzc4MjgyNDUwMTk5MDYi
        res = 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解密一下就可以

相关推荐
DogDaoDao5 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
代码搬运媛6 小时前
Jest 测试框架详解与实现指南
前端
counterxing7 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq7 小时前
windows下nginx的安装
linux·服务器·前端
音视频牛哥7 小时前
大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)
音视频·低延迟rtsp播放器·windows rtsp播放器·windows rtmp播放器·低延迟rtmp播放器·c# rtsp播放器·c# rtmp播放器
之歆7 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜7 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108087 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
cen__y8 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
kyriewen9 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor