一、需求:验证referer反爬的小案例
分析:判断是静态加载还是动态加载,在网页源代码中搜索这个视频的url,发现找不到,是动态加载。需要用network进行抓包,获取url,然后发送请求,保存视频。
二、最终代码呈现
# 1.导入模块
import requests
# 2.指定url
url = 'https://www.pearvideo.com/videoStatus.jsp?contId=1365496&mrd=0.0988497552645411'
# 知道被反爬了,需要把requests headers那些参数拿出来,对他们进行测试,确认到底是哪个参数
header = {'Referer': 'https://www.pearvideo.com/video_1365496'}
# 3.发送请求,获取响应
res = requests.get(url, headers=header)
# json数据转化为字典数据
data = res.json()
# print(data)
srcUrl = data['videoInfo']['videos']['srcUrl']
# 抓包得到了视频url:https://video.pearvideo.com/mp4/adshort/20180613/1680427510664-12251302_adpkg-ad_hd.mp4
# 在elements中得到的视频url:https://video.pearvideo.com/mp4/adshort/20180613/cont-1365496-12251302_adpkg-ad_hd.mp4
# 抓包得到的url,经过搜索无法获取视频,对比两个url,中间略有差别,需要进行处理,需要把这个时间戳1680427510664替换成cont-1365496
# 通过对比发现1365496刚好是refer当中的一部分,可以用split的方法进行获取
refer = 'https://www.pearvideo.com/video_1365496'
refer1 = refer.split('_')[1]
count = 'cont-' + refer1
# 通过观察1680427510664
systemTime = data['systemTime']
# print(systemTime)
# print(srcUrl)
# 替换,我们可以想到replace(old,new)
# print(srcUrl.replace(systemTime,count)) # https://video.pearvideo.com/mp4/adshort/20180613/1680428924523-12251302_adpkg-ad_hd.mp4
# 处理后正确的url
result_url = srcUrl.replace(systemTime, count)
# 发送请求
res1 = requests.get(result_url)
# 保存视频
# 音频,图片,模式改为wb(二进制)
with open('v1.mp4', 'wb') as f:
# text是文本不是
# 视频,图片不是文本
f.write(res1.content)
三、代码部分分析
1、确认反爬
# 1.导入模块
import requests
# 2.指定url
url = 'https://www.pearvideo.com/videoStatus.jsp?contId=1365496&mrd=0.0988497552645411'
# 3.发送请求,获取响应
res = requests.get(url)
# 4.获取响应
print(res.text)
运行结果
因为是json数据,所以会出错,并且被反爬了
2.抓包中的视频url
srcUrl = data['videoInfo']['videos']['srcUrl']
通过network抓包,在preview中查看,类似于剥洋葱一样,一层一层去分析
3.字符串中split方法的简单介绍
refer = 'https://www.pearvideo.com/video_1365496'
refer1 = refer.split('_')
print(refer1)
split方法适用于字符串,返回数据类型为列表['https://www.pearvideo.com/video', '1365496'],通过列表下标可以获取1365496
4.视频查看
然后双击就可以看到视频啦!!!