B站学爬虫 梨视频ajax双重抓包
梨视频ajax双重抓包
B站学爬虫记录
页面抓包
这个页面下拉到底会刷出24个新视频,这是ajax随机加载的。

下拉到底抓到数据

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

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

(视频id如下)

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

提取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
B站学爬虫 梨视频ajax双重抓包的更多相关文章
- python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)
python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...
- Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出
上一篇: 使用Selenium截取网页上的图片 前言 最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能 ...
- python爬虫01在Chrome浏览器抓包
尽量不要用国产浏览器,很多是有后门的 chrome是首选 百度 按下F12 element标签下对应的HTML代码 点击Network,可以看到很多请求 HTTP请求的方式有好几种,GET,POST, ...
- Wireshark对常见视频应用的抓包分析的结果
一.PC端直播: YY客户端直播用的udp(P2P)9158客户端直播用的rtp/rtcp 二.Web端直播: YY网页端直播用的tcp9158网页端直播用的tcp六间房网页端直播用的tcp17173 ...
- vconsole h5应用ajax请求抓包
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta co ...
- C#一步一步学网络辅助开发(1)--常用抓包工具的使用
这次写的是一个系列,是让大家了解如何进行网络的辅助开发.要进行网络辅助开发抓包工具是必不可少的,下面就让大家熟悉一下常用的一些抓包工具, 1,Fiddler 这个工具是我目前用的最多的一款抓包工具,不 ...
- python爬虫用drony转发进行抓包转发
转载至https://www.cnblogs.com/lulianqi/p/11380794.html#l_2 实际操作步骤(Android) 笔者这里直接使用上面提到第3种方法(方法1在对于手机AP ...
- 爬虫 http原理,梨视频,github登陆实例,requests请求参数小总结
回顾:http协议基于请求响应的方式,请求:请求首行 请求头{'keys':vales} 请求体 :响应:响应首行,响应头{'keys':'vales'},响应体. import socket soc ...
- python爬虫实践——爬取“梨视频”
一.爬虫的基本过程: 1.发送请求(请求库:request,selenium) 2.获取响应数据()服务器返回 3.解析并提取数据(解析库:re,BeautifulSoup,Xpath) 4.保存数据 ...
- 我在 B 站学机器学习(Machine Learning)- 吴恩达(Andrew Ng)【中英双语】
我在 B 站学机器学习(Machine Learning)- 吴恩达(Andrew Ng)[中英双语] 视频地址:https://www.bilibili.com/video/av9912938/ t ...
随机推荐
- Uniapp-DeepSeek跨三端AI助手|uniapp+vue3+deepseek-v3流式ai聊天模板
原创AI实战uniapp+deepseek+vue3跨三端仿DeepSeek/豆包app流式ai对话助手. uniapp-vue3-deepseek 实战2025对话ai大模型,基于Uniapp+Vu ...
- 信息资源管理综合题之“如何利用PKI实现身份认证和抗抵赖和防篡改等安全措施 ”
一.A企业在网上招标采购某种原材料,B是某个参与招标供应商 1.请讨论如何利用PKI(公钥基础设施),实现A企业接收B报价过程的身份认证.抗抵赖和防篡改等安全措施 二.答案 1.请讨论如何利用PKI( ...
- 信息资源管理综合题之“S公司规划网络系统-内部用户需要使用的信息安全技术及其相应用途”
一.案例:S公司是某网络设备制造商在国内的一级代理商,总部设在上海,在外高桥有一处大型的仓库,其二级经销商客户分布在全国几十座大中城市,并在北京.成都.西安和沈阳等地设立了办事处.总部实施了ERP系统 ...
- Linux的API
一.常用命令 1.Linux命令之剪切 mv 目标文件 目的文件 2.Linux之新增文件夹 mkdir 路径+文件名 3.Linux之删除命令 rm 删除文件 rmdir 删除文件夹
- 代码重构(OOP)-小栗子(PyQt5)
主要是为了练习下 面向对象, 不断提醒自己代码一定要写成 营销风格, 和优雅. 最近在B站上看一下关于 Python GUI 编程的内容. 恰好呢, 前不久的一个 将本地 Ecxcel 数据 发布到 ...
- C#网络编程(五)----细嗦TCP粘包
前情提要 四层网络模型各司其职,消息(SDU)在进入每一层时都会多加一个报头(PCI),这个PCI记录着该SDU的一些关键统计信息.SDU+PCI合并起来就组成一个完整的消息,简称为PDU 链路层:帧 ...
- Kafka怎么配置SASL用户名密码认证
服务端配置(server.properties): # 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # 配置JAAS文 ...
- 异常分析 JedisConnectionException: java.net.SocketTimeoutException: Read timed out
问题描述 测试Redis分布式锁的时候,如果一次执行大量数据,系统会报出如下异常: JedisConnectionException: java.net.SocketTimeoutExceptio ...
- ArkUI-X跨平台技术落地-华为运动健康(一)
现状与诉求 目前,华为运动健康App在Android 和 iOS均有独立的客户端工程,在原生页面部分,两个客户端独立开发,代码各自维护和演进,会带来各自独立的开发工作量,并且两个端之间的交互体验也无法 ...
- TableFill:一天搞定1000人的数据填报工作丨2024袋鼠云秋季发布会回顾
10月30日,袋鼠云成功举办了以"AI驱动,数智未来"为主题的2024年秋季发布会.大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程. 会上,易知 ...