首页 > 其他分享 >B站学爬虫 梨视频ajax双重抓包

B站学爬虫 梨视频ajax双重抓包

时间:2022-09-29 15:59:55浏览次数:92  
标签:url random li ajax video 站学 id 抓包

梨视频ajax双重抓包

B站学爬虫记录

页面抓包

这个页面下拉到底会刷出24个新视频,这是ajax随机加载的。

在这里插入图片描述

下拉到底抓到数据

在这里插入图片描述

查看数据包,请求为http://www.pearvideo.com/panorama_loading.jsp?

在这里插入图片描述

可以发现有三个参数,start等于刷新时界面已有视频数目(24、48......),filterIds是随机抽出的视频id,mrd是random随机数。

在这里插入图片描述
(视频id如下)
blog.csdnimg.cn/02850467ecb948b28000694657710ed6.png)

数据包里含有视频页面的链接

在这里插入图片描述
提取li的列表(xpath有点不好用,用了beautifulsoup)

def search_video(i):
	url='http://www.pearvideo.com/panorama_loading.jsp?'
    ids=str(random.randint(1453246,1780000))
    for _ in range(23):
        ids+=f',{random.randint(1453246,1780000)}'
    params={
        'start':24*i,
        'filterIds': ids,
        'mrd': str(random.uniform(0, 1))
    }
    html = requests.get(url, headers=headers,params=params).text
    soup=BeautifulSoup(html,'html.parser')
    li_list = soup.find_all('li',{'class','categoryem'})
    for li in li_list:
        get_video_url(li)

视频抓包

由于视频也是ajax加载,需要再次抓包。

在这里插入图片描述

两个参数:视频id和随机数

在这里插入图片描述
在这里插入图片描述

数据中含有视频链接

在这里插入图片描述

可以复制cURL然后直接转化出headers。网址:https://curlconverter.com/。注意转换出来不要留cookie

在这里插入图片描述

提取视频链接(注意这里是json)

def get_video_url(li):
    name = li.find('div',{'class':'vervideo-title'}).text+'.mp4'
    # 抓包ajax
    id_num = str(li.find('a')['href']).split('_')[1]
    ajax_url = 'https://www.pearvideo.com/videoStatus.jsp?'
    params = {
        'contId': id_num,
        'mrd': str(random.random())
    }
    ajax_headers = {
        "User-Agent": ua.random,
        # 加了之后不会显示视频下架
        'Referer': f'https://www.pearvideo.com/video_{id_num}'
    }
    dic_obj = requests.get(url=ajax_url, params=params,
                        headers=ajax_headers).json()
    video_url = dic_obj["videoInfo"]['videos']["srcUrl"]
    # 注意这里不能直接上id,需要转化
    # 此处视频地址做了加密即ajax中得到的地址需要加上cont-,并且修改一段数字为id才是真地址
	# 真地址:"https://video.pearvideo.com/mp4/third/20201120/cont-1708144-10305425-222728-hd.mp4"
	# 伪地址:"https://video.pearvideo.com/mp4/third/20201120/1606132035863-10305425-222728-hd.mp4"
    secret = video_url.split('/')[-1].split('-')[0]
    video_url = video_url.replace(str(secret), f'cont-{id_num}')
    dic = {
        'name': name.replace('"','”').replace(",",","),
        'url': video_url,
    }
    urls.append(dic)

源代码

import asyncio
import aiohttp
import requests
from lxml import etree
import random
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from multiprocessing.dummy import Pool

ua = UserAgent(verify_ssl=False)
headers = {
        'User-Agent': ua.random,
    }

def search_video(i):
    url='http://www.pearvideo.com/panorama_loading.jsp?'
    ids=str(random.randint(1453246,1780000))
    for _ in range(23):
        ids+=f',{random.randint(1453246,1780000)}'
    params={
        'start':24*i,
        'filterIds': ids,
        'mrd': str(random.uniform(0, 1))
    }
    html = requests.get(url, headers=headers,params=params).text
    soup=BeautifulSoup(html,'html.parser')
    li_list = soup.find_all('li',{'class','categoryem'})
    for li in li_list:
        get_video_url(li)
        
def get_video_url(li):
    name = li.find('div',{'class':'vervideo-title'}).text+'.mp4'
    # 抓包ajax
    id_num = str(li.find('a')['href']).split('_')[1]
    ajax_url = 'https://www.pearvideo.com/videoStatus.jsp?'
    params = {
        'contId': id_num,
        'mrd': str(random.random())
    }
    ajax_headers = {
        "User-Agent": ua.random,
        # 加了之后不会显示视频下架
        'Referer': f'https://www.pearvideo.com/video_{id_num}'
    }
    dic_obj = requests.get(url=ajax_url, params=params,
                        headers=ajax_headers).json()
    video_url = dic_obj["videoInfo"]['videos']["srcUrl"]
    # 注意这里不能直接上id,需要转化
    # 此处视频地址做了加密即ajax中得到的地址需要加上cont-,并且修改一段数字为id才是真地址
	# 真地址:"https://video.pearvideo.com/mp4/third/20201120/cont-1708144-10305425-222728-hd.mp4"
	# 伪地址:"https://video.pearvideo.com/mp4/third/20201120/1606132035863-10305425-222728-hd.mp4"
    secret = video_url.split('/')[-1].split('-')[0]
    video_url = video_url.replace(str(secret), f'cont-{id_num}')
    dic = {
        'name': name.replace('"','”').replace(",",","),
        'url': video_url,
    }
    urls.append(dic)

urls=[]
for i in range(4):        
    search_video(i)

#协程
async def get_video_data(dic_):
    url_ = dic_['url']
    print(url_, '正在下载.....')
    async with aiohttp.ClientSession() as session:
        async with await session.get(url_,headers=headers) as response:
            video_data=await response.read()
    video_path = f'./{dic_["name"]}'
    with open(video_path, 'wb') as fp:
        fp.write(video_data)
        print(dic_['name'], '下载成功!!!!!')
        
        
tasks=[asyncio.ensure_future(get_video_data(url)) for url in urls]

loop=asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

其他方法

selenium
当然以上抓包操作都能用selenium替代,但这里就略过了。

参考

https://www.cnblogs.com/qianhu/p/14027192.html

标签:url,random,li,ajax,video,站学,id,抓包
From: https://www.cnblogs.com/xianmasamasa/p/16741830.html

相关文章

  • JSON APIs and Ajax
    JSONAPIsandAjaxonclick希望代码仅在页面完成加载后执行。将名为DOMContentLoaded的JavaScript事件附加到document中。以下是实现的代码:document.addEventList......
  • 简单理解ajax
    一、什么是ajaxajax是一个近几年在前端开发中经常听到的名词,啥是ajax啊?首先,ajax不是一门编程语言,它是一种技术,它的作用是减少网络传输量,提高了用户体验.咋来提高......
  • JQuery Ajax使用FormData对象上传文件 图片
    通过jQueryAjax使用FormData对象上传文件​​FormData​​对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用​​XMLHttpRequest​​发送这个"表单"。在 Mozilla......
  • jQuery中发起 ajax 请求,自己封装get请求
    jQuery中发起ajax请求参数:1.请求地址   2.参数  3.回调函数(参数为响应数据)//get请求参数拼接到url中$.get("http//127.0.0.1:8000",{a:100,b:200},......
  • ajax 重复请求、请求超时与网络异常的处理
    重复请求的处理发起一个新的请求之前先判断当前是否有相同的请求正在发送,如果有就取消掉。类似于防抖//标识变量letisSending=false;//是否正在发送AJAX请求btns[......
  • ajax 和 react 最显着的区别是什么?
    ajax和react最显着的区别是什么?What’sthemostremarkabledifferencebetweenajaxandreact?目前,Ajax和React之间最大的区别之一是它们是帮助不同网页或应用......
  • AJAX IE缓存问题
    在IE浏览器中如果XMLHttpRequest提交的URL与历史一样,则会使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据或新的数据。1、改进服务器端(1)后台是简单的.aspx文件,直......
  • Flask学习笔记(五)-Flask通过Ajax传输JSON数据
    一.创建项目结构项目文件夹flask-ajax-demo,结构如下: 其中app.py是Python程序,user.html是静态页面。二.发起Ajax请求编写user.html,代码如下:<!DOCTYPEhtml><html......
  • Spring MVC框架:第十一章:Ajax
    AjaxAjax程序和服务器数据传输在进行Ajax操作时,SpringMVC会需要将JSON数据和Java实体类进行相互转换,为了实现这个效果需要额外加入jackson-all-1.9.11.jar1.从浏览器发......
  • Charles for Mac(HTTP信息抓包工具)4.6.3正式版
    在上网过程中,我们有时候也会想要截留电脑软件收发的数据包用来检查网络安全,这就需要一个网络封包分析工具。CharlesMac是一款用于HTTP信息抓包工具,可以快速有效的获得HTTP......