IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 梨视频多个视频获取—requests+ajax—并保存在本地 -> 正文阅读

[JavaScript知识库]梨视频多个视频获取—requests+ajax—并保存在本地

目录

一、目标网址分析

二、代码实现


学习记录:开学第一天~~~~

一、目标网址分析

获取梨视频网址的部分视频并保存在本地,获取体育专栏的最新板块:体育热点资讯短视频_体育热点新闻-梨视频官网-Pear Video

先在此页面随便复制一个视频的名字到网页源代码中检索:

?我们点进视频详情页:(这里的 href 链接是不全的,没有协议。这个后面拼接一下就OK了。)? ??

?来到这里后,发现它是动态加载的:就直接来抓包看看。

?但是去请求这个url的时候,发现并没有获取到我们想要的数据。

?这样的话,就只有继续慢慢去找了.......在ajax接口中,没有找到其他的接口。那就再回到网页中去。

在这里找到一个url,它还是MP4后缀的,这种情况我们看到要去试试滴。复制下来去请求它后,居然获取到了视频数据。?那就在去网页源代码中看能找到不。

?发现在这里没找到url,那这就有点整人了,,,我们之前找到了2个url,一个不能请求到视频,一个能请求到视频却在网页源代码中找不到。那没得法,只有来看看他们有什么不同:

# https://video.pearvideo.com/mp4/third/20220211/cont-1751662-15316010-174051-hd.mp4

# https://video.pearvideo.com/mp4/third/20220211/1645364903411-15316010-174051-hd.mp4

对比发现:

分析多个视频的url后发现 cont??是不变的,变化的是那两串数值,这样后就只有去网页中去寻找了;存在?systemTime

?href 链接中 :

?想要获取到真正的视频url : ①要对我们后面拿到的 href 链接进行处理,取出那串数字。②在视频详情的ajax接口返回的json数据中提取出?systemTime 。?最后再进行它们的拼接就OK了~~~~~

好,现在就可以弄代码了(其实应该是边分析网页边写代码来验证的)

二、代码实现

因为想要下载的是多个视频,那就需要拿到多个视频的href链接。但这个网站的主页它又是动态加载的(懒加载的,需要鼠标滑动,它才会慢慢的加载出后面的视频)

?这里还是来到抓包后发现:

?有这些参数:categoryId——视频类别,mrd——0到1的随机数,star——从哪个视频开始,filterIds——应该是新加载出来视频的cont的列表~~~~??但我们可以用selenium来点击网页的 加载更多从而来获取网页源码(虽然简单,但是有很大的缺点:就是太慢了)先这样用吧,后面在想办法换其他方法爬取。

获取多个href代码:

from lxml import etree
from selenium import webdriver
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
}
url = 'https://www.pearvideo.com/category_9'
web = webdriver.Chrome()
web.get(url)
time.sleep(2)
web.maximize_window()

a = 1
while True:
    time.sleep(3)
    web.find_element_by_xpath('//*[@id="listLoadMore"]').click()
    time.sleep(3)
    if a == 2:  # 这里可以自己设置想爬取的视频多少
        page = web.page_source
        tree = etree.HTML(page)
        li_list = tree.xpath('//ul[@class="category-list clearfix"]/li')
        for li in li_list:
            href = 'https://www.pearvideo.com/' + li.xpath('./div/a/@href')[0]
            print(href)
        break
    a += 1

运行检验:发现没有错误

?那就可以写性代码了:(因为后面的代码都想要href,href没错后面代码就可以进行了。)

总代码:

import requests
from lxml import etree
from selenium import webdriver
import time
import random

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
}
url = 'https://www.pearvideo.com/category_9'
web = webdriver.Chrome()
web.get(url)
time.sleep(2)
web.maximize_window()

a = 1
while True:
    time.sleep(3)
    web.find_element_by_xpath('//*[@id="listLoadMore"]').click()
    time.sleep(3)
    if a == 2:
        page = web.page_source
        tree = etree.HTML(page)
        li_list = tree.xpath('//ul[@class="category-list clearfix"]/li')
        for li in li_list:
            href = 'https://www.pearvideo.com/' + li.xpath('./div/a/@href')[0]
            # print(href)
            name = li.xpath('./div/a/div/text()')[-1]
            con_id = href.split('_')[-1]
            mrd = random.random()
            ajax_url = f'https://www.pearvideo.com/videoStatus.jsp?contId={con_id}&mrd={mrd}'
            headers2 = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
                'Referer': f'https://www.pearvideo.com/video_{con_id}'
            }
            resp2 = requests.get(url=ajax_url, headers=headers2).json()
            systemTime = resp2['systemTime']
            srcUrl = resp2['videoInfo']['videos']['srcUrl'].replace(systemTime, f'cont-{con_id}')
            print(srcUrl)
            content = requests.get(url=srcUrl).content
            with open('./梨视频/%s.mp4' % name, 'wb') as f:
                f.write(content)

        break
    a += 1

运行看看:在盘目录下打开:

但是还有个地方要改进,就是视频的名字,有些视频名字有特殊符号,而在写入视频数据时,这个是会报错的: 把他处理一下就OK了~~~~

?bye~~~~~~


?

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:29:58  更:2022-02-22 20:30:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:43:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码