一、Python 爬虫 403 错误的核心成因
403 Forbidden 本质是服务器对请求的「身份校验失败」,常见触发原因可分为以下几类:
- 请求头缺失或异常:服务器会校验 User-Agent、Referer、Cookie 等关键请求头,若缺失或为默认值(如 Python-urllib/3.8),会被判定为爬虫;
- IP 封禁:同一 IP 短时间内高频请求,被服务器加入黑名单;
- 反爬机制检测:网站通过 JS 加密、验证码、浏览器指纹(如 navigator 对象)等识别非人工访问;
- 会话验证失败:部分网站需要先登录生成有效会话,无会话请求会直接返回 403。
普通 HTTP 请求(requests 库)和 Selenium 的核心差异,本质是「模拟请求」与「模拟真实浏览器行为」的区别,这也决定了二者处理 403 的能力边界。
二、普通请求(requests)vs Selenium:核心差异对比
| 维度 | 普通请求(requests) | Selenium |
|---|---|---|
| 请求本质 | 构造 HTTP/HTTPS 请求包,无浏览器环境 | 驱动真实浏览器(Chrome/Firefox),模拟人工操作 |
| 请求头特征 | 需手动构造,易被识别为非浏览器请求 | 自动携带浏览器原生请求头,更接近真实用户 |
| JS 渲染能力 | 无,无法处理动态加载内容 | 支持完整 JS 渲染,可绕过 JS 反爬 |
| 浏览器指纹检测 | 无指纹,易被识别 | 有完整浏览器指纹,不易被检测 |
| 性能 | 轻量,请求速度快 | 重量级,启动浏览器耗时,请求效率低 |
| 反爬绕过难度 | 高,需手动破解各类反爬规则 | 低,天然模拟人工行为,绕过基础反爬更简单 |
简言之:requests 适合爬取反爬较弱的静态页面,处理 403 需手动「伪装」请求;Selenium 适合爬取反爬严格的动态页面,通过模拟真实浏览器天然降低 403 概率,但牺牲了性能。
三、实战:处理 403 错误的代码实现
场景 1:requests 处理 403 错误(手动伪装请求)
核心思路
通过完善请求头、添加延时、使用代理 IP 等方式,模拟真实浏览器请求,绕过服务器的基础校验。
import requests
import time
from fake_useragent import UserAgent
# 需额外安装:pip install fake-useragent
def requests_crawl(url):
# 1. 构造模拟浏览器的请求头
ua = UserAgent()
headers = {
"User-Agent": ua.chrome, # 随机生成 Chrome 浏览器 UA
"Referer": url.split()[] + + url.split()[],
: ,
: ,
: ,
: ,
:
}
proxyHost =
proxyPort =
proxyUser =
proxyPass =
proxy_auth =
proxies = {
: ,
:
}
:
time.sleep()
response = requests.get(
url=url,
headers=headers,
proxies=proxies,
timeout=,
allow_redirects=
)
response.status_code == :
(, (response.text))
response.text
response.status_code == :
()
:
()
Exception e:
()
__name__ == :
target_url =
requests_crawl(target_url)

