Scraper 在我的笔记本电脑上正常工作,部署到服务器后立即出现 403 错误。
发布: (2026年3月31日 GMT+8 22:46)
2 分钟阅读
原文: Dev.to
Source: Dev.to
什么出了问题
目标站点在检查 User-Agent 请求头。我的笔记本电脑因为在其他地方使用了 Playwright 并在全局配置了浏览器的 User-Agent,所以发送的请求带有正常的浏览器 User-Agent。
服务器是一台全新安装的 Ubuntu,使用默认的 Python requests User-Agent:
python-requests/2.31.0站点拒绝了该请求,返回 403 Forbidden。
解决办法
在请求头中添加自定义 User-Agent:
import requests
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('https://example.com/products', headers=headers)
if response.status_code == 200:
# Parse the data
products = response.json()
else:
print(f"Failed: {response.status_code}")有了这项更改,站点再次返回 200 OK。
其他有时也很重要的东西
除了 User-Agent,有些站点还会检查:
Referer 请求头 —— 可能需要有效的 Referer 才能允许请求。
headers = { 'User-Agent': 'Mozilla/5.0...', 'Referer': 'https://example.com/' }Accept 请求头 —— 真正的浏览器会发送多种 Accept 头。
headers = { 'User-Agent': 'Mozilla/5.0...', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br' }
大多数情况下,只设置合适的 User-Agent 就足够了。如果仍然不行,添加这些额外的请求头通常可以解决问题。
提示: 在解析响应之前始终检查 response.status_code。这可以避免把错误页面(例如 403)当作 JSON 解析,从而产生令人困惑的解析错误。