在使用 Python 的 requests 库调用第三方 API 或爬取网页时,你是否遇到过这样的情况:
import requests
response = requests.get("https://example.com/api/data")
print(response.status_code) # 输出:403
明明 URL 没错、参数正确、网络通畅,却始终返回 403 Forbidden 错误。你反复检查代码,甚至怀疑是权限或 IP 被封,但最终发现——问题出在一个看似微不足道的请求头字段上:User-Agent。
当使用 requests 发起请求时,如果没有显式设置 User-Agent,它会使用一个非常“诚实”但容易被识别为非浏览器的默认值:
python-requests/2.x.x
import requests
resp = requests.get("https://httpbin.org/headers")
print(resp.json()["headers"]["User-Agent"])
# 输出:python-requests/2.31.0
为什么这会导致 403?
许多网站或 API 出于以下原因,会主动拦截来自非浏览器客户端的请求:
- 反爬虫策略
为了防止数据被自动化脚本抓取,服务端会检查User-Agent。如果发现是python-requests,直接返回 403。 - 安全策略
某些 API 只允许来自“合法客户端”(如 Chrome、Safari、官方 App)的请求,认为脚本请求存在风险。 - 兼容性考虑
有些老系统未适配非浏览器客户端,直接拒绝处理。
解决方案:设置一个正常的 User-Agent
import requests
url = "https://api.example.com/data"
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"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print("请求成功!")
else:
print(f"请求失败: {response.status_code}")
Web前端(W3Cways.com) - Web前端学习之路