可狱可囚的爬虫系列课程 15:防盗链反爬虫的处理

一、防盗链了解

防盗链是一种技术手段,主要用于防止其他网站通过直接链接的方式使用本网站的资源(如图片、文件等),从而节省带宽和服务器资源。当其他网站尝试直接链接到受保护的资源时,服务器会根据设置的规则判断请求来源,如果发现请求来自未经授权的网站,则拒绝提供资源。

二、某视频网站分析

我们在某视频网站中随便打开一个网页,借助开发者工具寻找视频的播放链接。

(1)2024年度回访:蔡磊坚信努力之后的希望文章中,我们寻得视频的播放地址为:https://video.pearvideo.com/mp4/short/20241231/cont-1797785-16042954-hd.mp4,并且视频能够正常访问。


(2)但是当我尝试使用代码将此视频链接进行抓取时,渐渐的发现了端倪,视频链接并不是固定在网页中的,而是在点击播放视频时加载上去的。

python 复制代码
import requests


headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
}

Link = 'https://www.pearvideo.com/video_1797785'
response = requests.get(url=Link, headers=headers)
print(response.text)

(3)借助前面提到过的爬虫方法,我在该视频网站中找到了两处关键点:一方面在浏览器地址栏找到了用于构造视频地址的编号,另一方面找到了数据接口也发现了可用于构造视频地址的信息。

(4)开始构造视频地址,但是提示该文章已下线。这其实很明显,就是一个很容易混淆人的防盗链反爬虫。

python 复制代码
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
}
# 1. 复制接口地址,获取接口中的srcUrl
Link = 'https://www.pearvideo.com/videoStatus.jsp?contId=1797785&mrd=0.17292585205882616'
response = requests.get(url=Link, headers=headers)
print(response.json())

三、使用 Referer 参数处理防盗链

Referer 防盗链只需要记住一点:"Referer 就是我来时的路"。我们将 Referer 参数放入到 headers 中。

python 复制代码
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Referer': 'https://www.pearvideo.com/video_1797785'
}
# 1. 复制接口地址,获取接口中的srcUrl
Link = 'https://www.pearvideo.com/videoStatus.jsp?contId=1797785&mrd=0.17292585205882616'
response = requests.get(url=Link, headers=headers)
print(response.json())

此视频网站的防盗链我们就成功的突破了。

至于如何再将视频下载下来,大家可以顺着思路继续探索!

四、视频下载完整代码

python 复制代码
import requests

article_link = 'https://www.pearvideo.com/video_1797785'
video_id = article_link.split('_')[-1]

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'Referer': article_link
}
# 1. 复制接口地址,获取接口中的srcUrl和 systemTime
Link = f'https://www.pearvideo.com/videoStatus.jsp?contId={video_id}&mrd=0.17292585205882616'
response = requests.get(url=Link, headers=headers)
json_data = response.json()

system_time = json_data['systemTime']
src_url = json_data['videoInfo']['videos']['srcUrl']

# 2. 视频地址拼接构造
video_link = src_url.replace(system_time, f'cont-{video_id}')

# 3.视频下载
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'
}
response = requests.get(url=video_link, headers=headers)
with open('video_01.mp4', 'wb') as video_file:
    video_file.write(response.content)
print('视频下载完成!')
相关推荐
做怪小疯子2 小时前
华为笔试0429
python·numpy
Warson_L2 小时前
Dictionary
python
寒山李白5 小时前
解决 python-docx 生成的 Word 文档打开时弹出“无法读取内容“警告
python·word·wps·文档·docx·qoder
2401_832365525 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Sirius.z5 小时前
第J3周:DenseNet121算法详解
python
2301_779622416 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
2301_766283446 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
小康小小涵7 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava20247 小时前
Python的函数
开发语言·python
Awesome Baron8 小时前
skill、tool calling、MCP区别
开发语言·人工智能·python