You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python Requests请求正常但Curl请求返回403错误?

问题:Curl请求返回403但Python Requests正常,是否Requests自动添加额外请求头?

我尝试使用Curl请求链接https://dooood.com/d/h9rojbkqnpan时返回403错误,但使用Python的Requests库携带相同请求头请求该链接却能正常工作。

Python代码

import requests

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97',
        'Referer': 'https://dooood.com/'}
url = "https://dooood.com/d/h9rojbkqnpan"
res = requests.get('https://dooood.com/d/h9rojbkqnpan', headers=headers)
print(res.content)
print(res.status_code)

Curl命令

curl -I "https://dooood.com/d/h9rojbkqnpan" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97" \
  -H "Referer: https://dooood.com/"

回答

是的,Python Requests会自动添加一些默认请求头,这大概率是导致两者请求结果差异的原因。

Requests在发送请求时,除了你手动设置的头,还会默认带上以下常见字段:

  • Accept-Encoding: 通常为gzip, deflate, br
  • Accept: 默认值为*/*
  • Connection: 默认值为keep-alive

你的Curl命令里没有包含这些头,目标网站的反爬机制可能会检查这些必要的请求头字段,缺少时就返回403错误。

你可以通过两种方式验证这个结论:

  1. 在Python代码中打印实际发送的请求头,查看额外添加的内容:
    print(res.request.headers)
    
  2. 将这些额外的请求头添加到Curl命令中,重新测试是否能正常返回:
    curl -I "https://dooood.com/d/h9rojbkqnpan" \
      -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 OPR/67.0.3575.97" \
      -H "Referer: https://dooood.com/" \
      -H "Accept-Encoding: gzip, deflate, br" \
      -H "Accept: */*" \
      -H "Connection: keep-alive"
    

内容的提问来源于stack exchange,提问作者linkkader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:55:02