06---Python爬虫---防盗链(处理反爬的一种方式)

目标:下载梨视频网址的水平
网址:https://www.pearvideo.com/

一.什么是防盗链:


防盗链是一种通过服务器端编程防止资源被盗用的技术,主要通过URL过滤和检查HTTP协议中的referer字段来实现。当检测到请求资源的来源非预期时,服务器会阻止访问或重定向。

原理: 从HTTP协议说起,在HTTP协议中,有一个表头字段:referer,采用URL的格式来表示从哪一个链接跳转到当前的网页或者文件。
https://blog.csdn.net/dengmengxin/article/details/129247385#:~:text=%E9%98%B2%E7%9B%97%E9%93%BE%E6%98%AF%E4%B8%80%E7%A7%8D%E9%80%9A%E8%BF%87%E6%9C%8D%E5%8A%A1

二.分析网址页面数据:


我们来到梨视频的主页,打开开发者模式(fn+f12),然后找到我们需要下载视频的url地址,去到指定视频的主页,打开页面源代码,搜索这个地址,发现页面上找不到我们需要的数据,从这里可以说明,视频有可能是通过后期特定技术的加载(如js)上传到网站上的。步骤见下面图片.

三.确定视频下载的真实url:


前面我们说到既然数据不在页面源代码上,那么我们可以通过抓包工具来试试,打开开发者工具(按住 fn+f12),来尝试获取视频的url。在开发者工具模式下的Preview可以找到与视频相关的url地址

从中可以看到这个srcurl或许与我们需要下载的视频网址有关.为此我们复制下来,到另外一个网址上打开,发现打不开.那么说明不是真正的视频下载地址,但我们又确定与真正的视频下载地址有关,为此我们可以对比

对比各个页面的url我们可以发现,只要替换一下参数就可以了。


把发送请求后获得的json数据里的systemTime换为contId即可

我们通过抓包工具获取的url发送请求,获取到下面图片的srcurl:

import requests

url='https://www.pearvideo.com/video_1796385' #整体页面的源代码
contId=url.split('_')[1]

videostatueurl=f'https://www.pearvideo.com/videoStatus.jsp?contId={contId}&mrd=0.21429165647578063'#请求的Url

resp=requests.get(videostatueurl)
print(resp.text)

执行完这段代码,我们发现了下面图片的问题:

从这个图片说明了出现一个反扒,为此我们加入以下内容(user-agent和referer):

headers={'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
        #反爬 #防盗链:溯源:当前请求的上一级是谁,即videostatueurl这个url是由上次的url产生的
         'referer':
'https://www.pearvideo.com/video_1796385'
}

这里出现了防盗链的概念:什么是防盗链?就是我当前请求的url是由上一级的哪一个url来的,请求必须是连续的,不能缺失中间的任何一环。也称为溯源。例如这里下图,需要获取到当前视频相关内容,他的上一级必须是箭头所指向的url

由下图我们知道,请求是具有连续的,如果中间的某个请求缺失了,就会出错

import requests

url='https://www.pearvideo.com/video_1796385' #整体页面的源代码
contId=url.split('_')[1]

videostatueurl=f'https://www.pearvideo.com/videoStatus.jsp?contId={contId}&mrd=0.2940242089213536'#请求的Url

headers={'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
        #反爬 #防盗链:溯源:当前请求的上一级是谁,即videostatueurl这个url是由上次的url产生的
         'referer':'https://www.pearvideo.com/video_1796385'
}
resp=requests.get(videostatueurl,headers=headers)
# print(resp.text)
dic=resp.json()
# print(dic)
srcUrl=dic['videoInfo']['videos']['srcUrl']
systemTime=dic['systemTime']
srcUrl=srcUrl.replace(systemTime,f'cont-{contId}')
print(srcUrl)

为此我们得到了视频的下载地址

四.完整代码:

import requests

url='https://www.pearvideo.com/video_1796385' #整体页面的源代码
contId=url.split('_')[1]

videostatueurl=f'https://www.pearvideo.com/videoStatus.jsp?contId={contId}&mrd=0.2940242089213536'#请求的Url

headers={'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
        #反爬 #防盗链:溯源:当前请求的上一级是谁,即videostatueurl这个url是由上次的url产生的
         'referer':'https://www.pearvideo.com/video_1796385'
}
resp=requests.get(videostatueurl,headers=headers)
# print(resp.text)
dic=resp.json()
# print(dic)
srcUrl=dic['videoInfo']['videos']['srcUrl']
systemTime=dic['systemTime']
srcUrl=srcUrl.replace(systemTime,f'cont-{contId}')
print(srcUrl)

#下载视频

n=1
with open(f'a.mp4',mode='wb') as f:
    f.write(requests.get(srcUrl).content)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值