加user-agent能绕过403是因为服务器通过该字段识别请求来源,空值或爬虫默认ua(如python-requests)会被视为可疑而拒绝;设置主流浏览器ua可模拟正常用户访问,从而通过反爬第一道门槛。

为什么加User-Agent就能绕过403?
很多网站会检查请求头中的 User-Agent 字段,如果为空、是默认值(比如 Python-urllib/3.x)或明显非浏览器特征,服务器会直接拒绝并返回 HTTP Error 403: Forbidden。这不是权限问题,而是反爬第一道门槛——它连你的请求都懒得处理。
关键点在于:服务器不是在“禁止你”,而是在“忽略一个可疑的爬虫”。加个像样的 User-Agent 是告诉对方“我是个普通浏览器”,从而获得和人工访问一样的响应机会。
urllib.request.Request 怎么正确设置User-Agent
不能只改全局配置,必须在每次发起请求前,通过 urllib.request.Request 显式构造带头的请求对象。直接传字符串 URL 给 urlopen() 是无效的。
- 用
urllib.request.Request包裹 URL,并通过headers参数传入字典 -
User-Agent的键名必须首字母大写,且拼写准确("User-Agent",不是"user-agent"或"USER_AGENT") - 推荐使用主流浏览器的真实 UA 字符串,例如 Chrome 最新版:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
import urllib.request
<p>url = "<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"}
req = urllib.request.Request(url, headers=headers)</p><p>try:
resp = urllib.request.urlopen(req)
print(resp.read().decode())
except urllib.error.HTTPError as e:
print(f"HTTP error: {e.code} {e.reason}") # 现在大概率不会触发 403 了
</p>
除了User-Agent,还常漏掉哪些关键请求头?
单设 User-Agent 能解决大部分基础 403,但有些站点还会校验其他字段。如果加了 UA 仍报 403,优先检查以下三项:
-
Accept:设为"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -
Accept-Language:设为"en-US,en;q=0.5"或"zh-CN,zh;q=0.9" -
Accept-Encoding:设为"gzip, deflate"(urllib 默认不发,但某些 CDN 会因此拦截)
注意:不要盲目堆砌头信息。过度模拟(比如加 Sec-Fetch-* 或 Referer)反而可能触发更严格的风控。先从最简三要素开始调试。
requests 库比 urllib 更省心吗?
是的,但不是因为功能更强,而是因为默认行为更贴近浏览器。比如 requests.get() 默认自带合理 User-Agent,且自动处理 Accept、Accept-Encoding 等头。
不过要注意:requests 的默认 UA 是固定的(如 "python-requests/2.31.0"),部分严格站点仍会拦截。所以实际使用时,依然建议显式传 headers:
import requests
<p>headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
}
resp = requests.get("<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>", headers=headers)
</p>
真正容易被忽略的是:有些网站会根据 Host、Connection 甚至请求间隔做判断。UA 只是起点,不是万能解药。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











