当前位置: 首页 > web >正文

【Python 爬虫 防盗链】

文章目录

  • 前言
  • 一、防盗链的原理
  • 二、绕过防盗链的方法
    • 1. 使用`requests`库设置`Referer`
    • 2. 使用`urllib`库设置`Referer`
  • 总结


前言

在进行Python爬虫开发时,常常会遇到防盗链机制的阻碍。防盗链是一种防止他人直接引用网站资源(如图片、视频等)的技术手段。


一、防盗链的原理

防盗链主要通过HTTP请求头中的Referer字段来判断请求的来源。当用户在浏览器中点击链接访问资源时,浏览器会自动在请求头中添加Referer字段,指明当前请求的来源页面。服务器可以根据Referer字段来判断请求是否来自合法的页面,从而决定是否返回资源。

例如,某网站的图片资源地址为:

https://www.example.com/images/sample.jpg

当用户从该网站的页面访问该图片时,浏览器会在请求头中添加:

Referer: https://www.example.com/page.html

服务器检测到Referer字段来自本网站,认为是合法请求,返回图片资源。

但如果用户直接在浏览器地址栏中输入图片地址,或者从其他网站引用该图片,Referer字段可能为空或为其他网站地址,服务器检测到后可能返回403 Forbidden错误,阻止资源的访问。


二、绕过防盗链的方法

在Python爬虫中,通过设置请求头中的Referer字段,模拟合法的请求来源,从而绕过防盗链的限制。

1. 使用requests库设置Referer

import requests# 目标资源地址
url = 'https://www.example.com/images/sample.jpg'# 设置请求头,添加Referer字段
headers = {'Referer': 'https://www.example.com/page.html','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}# 发送请求
response = requests.get(url, headers=headers)# 保存资源
with open('sample.jpg', 'wb') as f:f.write(response.content)

在上述代码中,通过设置Referer字段为资源所在页面的地址,模拟从该页面发起的请求,从而绕过防盗链。

2. 使用urllib库设置Referer

import urllib.request# 目标资源地址
url = 'https://www.example.com/images/sample.jpg'# 设置请求头,添加Referer字段
headers = {'Referer': 'https://www.example.com/page.html','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}# 创建请求对象
req = urllib.request.Request(url, headers=headers)# 发送请求并读取响应
with urllib.request.urlopen(req) as response:content = response.read()# 保存资源
with open('sample.jpg', 'wb') as f:f.write(content)

同样地,通过设置Referer字段,模拟合法请求来源,绕过防盗链。


总结

防盗链是网站保护资源的一种常见手段,主要通过Referer字段来判断请求的合法性。通过设置请求头中的Referer字段,模拟合法的请求来源,可以有效绕过防盗链的限制,成功获取目标资源。

在实际开发中,除了设置Referer字段外,还可能需要设置其他请求头字段,如User-AgentCookie等,以更好地模拟浏览器行为,提升爬虫的成功率。

http://www.xdnf.cn/news/14324.html

相关文章:

  • 山东大学软件学院项目实训:基于大模型的模拟面试系统项目总结(九)
  • Apifox将base64转换为图片(调试时方便查看)
  • BeckHoff <---> Keyence (LJ-X8000) 2D相机 Profinet 通讯
  • IO之详解cin(c++IO关键理解)
  • 矩阵运算基础、矩阵求导
  • 《Apollo 配置中心在动态主题系统中的设计与扩展》
  • openeuler 系统—— 集成大模型分析日志中的错误信息生成故障原因报告
  • LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置
  • GTSAM中InitializePose3::initialize()使用详解
  • 数据目录:企业数据管理的核心引擎与最佳实践
  • 各种运算符的学习心得
  • 【JavaScript-Day 41】JS 事件大全:click, keydown, submit, load 等常见事件详解与实战
  • RK全志平台WiFiBT调试思路
  • 替换一个数字后的最大差值
  • 【配件出入库专用软件】佳易王配件进出库管理系统:轻量级仓储管理解决方案配件管理系统#进出库管理#仓储软件#库存统计#轻量级解决方案
  • 错题分析接口实现全流程
  • Vue3 + TypeScript 父组件点击按钮触发子组件事件方法
  • C#里与嵌入式系统W5500网络通讯(5)
  • 【python】bash: !‘: event not found
  • 【C语言】C语言发展历史、特点及其应用
  • DL00120-Lyapunov深度强化学习移动边缘计算网络在线计算卸载python
  • 互联网大厂Java求职面试:AI大模型应用实践中的架构挑战与实战
  • Android Activity全面解析:从创建到生命周期的完整指南
  • 深入解析 Java 集合框架:从底层原理到实战优化
  • Pytorch 卷积神经网络参数说明一
  • Python----OpenCV(图像的绘制——绘制直线,绘制矩形,绘制圆形,绘制多边形)
  • (javaSE)抽象类和接口:抽象类概念语法和特性, 抽象类的作用;接口的概念 接口特性 实现多个接口 接口间的继承 Object类
  • Qt--信号槽发送QVector
  • Relin梦中门——第二章——感官
  • jojojojojo