告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)
在爬虫开发中,“403 Forbidden” 绝对是最让人头疼的错误之一 —— 明明浏览器能正常打开网页,爬虫请求却被服务器无情拒绝。这背后,“浏览器头部信息” 尤其是 User-Agent,往往是关键突破口。今天我们就从原理到实践,彻底搞懂如何通过模拟 User-Agent 解决 403 问题,让爬虫顺利 “伪装” 成浏览器。
一、先搞懂:为什么 403 会盯上爬虫?
服务器之所以会返回 403,核心是 “识别出了访问者是爬虫而非正常用户”。而 User-Agent(用户代理),就是服务器判断身份的重要 “身份证”。
简单来说,User-Agent 是 HTTP 请求头部的一段字符串,用来告诉服务器 “我是谁”—— 比如你用 Chrome 浏览器访问网页,请求里的 User-Agent 会包含 “Chrome/120.0.0.0”“Windows NT 10.0” 等信息,服务器看到这段字符串,就知道是正常浏览器访问;但如果你的爬虫没设置 User-Agent,或者用了 Python requests 库默认的 “python-requests/2.31.0”,服务器一眼就能识破 “这是爬虫”,直接用 403 拒绝。
二、第一步:获取真实浏览器的 User-Agent
要模拟浏览器,首先得拿到 “正版” 的 User-Agent 字符串。这里有 3 种简单方法:
1. 浏览器开发者工具直接查(最准确)
以 Chrome 为例:
- 打开任意网页,按 F12 打开开发者工具;
- 切换到 “Network” 标签,刷新网页;
- 在左侧请求列表中随便选一个请求(比如第一个文档请求),右侧找到 “Request Headers”;
- 往下翻就能看到 “User-Agent” 字段,复制后面的字符串即可。
比如 Chrome 在 Windows 10 上的 User-Agent 可能是:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
2. 在线工具查询
如果嫌麻烦,直接搜 “User-Agent 查询”,比如访问useragentstring.com,网页会自动显示你当前浏览器的 User-Agent,直接复制即可。
3. 常用浏览器 User-Agent 模板(应急用)
如果暂时没法打开浏览器,也可以用这些通用模板(注意定期更新,浏览器版本会迭代):
- Edge(Windows):
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/120.0.0.0 Safari/537.36
- Safari(Mac):
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15
- 手机 Chrome(Android):
Mozilla/5.0 (Linux; Android 13; SM-G998U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36
三、第二步:在爬虫中配置 User-Agent(实战代码)
拿到真实 User-Agent 后,核心是在爬虫请求中 “带上” 它。这里以最常用的 Python requests 库为例,分基础版和进阶版讲解。
1. 基础版:固定 User-Agent(解决简单 403)
如果目标网站反爬不严格,固定一个真实 User-Agent 就能解决问题。代码示例:
python
import requests# 1. 定义请求头部,把复制的User-Agent放进去
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}# 2. 发起请求时带上headers参数
url = "https://目标网站地址"
try:response = requests.get(url, headers=headers)# 检查请求是否成功(200表示正常)if response.status_code == 200:print("请求成功!")print(response.text[:500]) # 打印前500个字符验证else:print(f"请求失败,状态码:{response.status_code}")
except Exception as e:print(f"报错:{e}")
这里的关键是requests.get()
中加入headers=headers
参数 —— 没有这一步,requests 会用默认的 “python-requests” User-Agent,大概率触发 403;加上后,服务器会认为是 Chrome 浏览器访问,从而放行。
2. 进阶版:User-Agent 池(应对严格反爬)
如果目标网站更严格,会检测 “单一 User-Agent 频繁访问”,这时候固定一个 User-Agent 还是会被封。解决方案是构建 “User-Agent 池”,每次请求随机选一个,模拟不同浏览器 / 设备的访问。
代码示例:
python
import requests
import random# 1. 构建User-Agent池(多放几个不同浏览器/设备的)
user_agent_pool = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edg/120.0.0.0 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15","Mozilla/5.0 (Linux; Android 13; SM-G998U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1"
]# 2. 每次请求随机选一个User-Agent
def get_random_headers():headers = {"User-Agent": random.choice(user_agent_pool),# 可选:加上Referer(告诉服务器请求来自哪个页面,更像真实访问)"Referer": "https://www.baidu.com/" # 比如模拟从百度跳转过来}return headers# 3. 发起请求
url = "https://目标网站地址"
for _ in range(5): # 模拟多次请求,每次用不同User-Agentheaders = get_random_headers()response = requests.get(url, headers=headers)print(f"当前User-Agent:{headers['User-Agent'][:50]}...")print(f"状态码:{response.status_code}\n")
这里多了两个优化点:
- 用
random.choice()
随机选 User-Agent,避免单一标识被盯上; - 增加了
Referer
字段 —— 有些服务器会检查 “请求来源”,比如只允许从百度、谷歌跳转的访问,加上 Referer 能进一步降低被识别的概率。
四、注意事项:避免踩坑的 3 个关键
- 不要用太旧的 User-Agent:比如 Chrome 80 以下的版本,服务器可能会认为是 “异常设备”,反而拒绝;建议定期更新 User-Agent 池,保持与主流浏览器版本一致。
- 不止 User-Agent:头部信息要完整:有些严格的网站会检查多个头部字段,比如
Accept
(告诉服务器能接收的内容格式)、Accept-Language
(语言),可以从浏览器开发者工具里把这些字段一起复制到 headers 中,模拟更真实的请求。 - 配合其他反反爬手段:如果加了 User-Agent 还是 403,可能需要结合 “设置请求间隔”(用 time.sleep ())、“使用代理 IP” 等方法 ——User-Agent 是基础,但不是万能的。
五、总结
解决爬虫 403 Forbidden 问题,模拟 User-Agent 是最基础也最有效的第一步:通过获取真实浏览器的 User-Agent,在请求中带上它,甚至构建 User-Agent 池随机切换,就能让爬虫成功 “伪装” 成正常用户。
记住:爬虫的核心是 “模拟真实访问”,而 User-Agent 就是这层 “伪装” 的第一张身份证。掌握它,就能告别大部分基础级的 403 拒绝,让爬虫更顺畅地运行。