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 解析,从而产生令人困惑的解析错误。

0 浏览
Back to Blog

相关文章

阅读更多 »