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

为何使用requests请求返回403状态码,urllib2却可正常请求?

解决requests请求返回403而urllib2正常的问题

嘿,我碰到过类似的情况,你这个403问题大概率是因为requests和urllib2在请求细节上的差异被服务器识别并拦截了。下面给你拆解具体原因和对应的解决办法:

可能的原因及解决方案

1. User-Agent 不一致

很多服务器会校验请求的User-Agent字段,而urllib2和requests的默认User-Agent是不一样的:

  • urllib2默认的UA格式大概是 Python-urllib/2.7(具体看你的Python版本)
  • requests默认的UA是 python-requests/x.y.z

有些服务器会把requests的默认UA标记为非信任客户端,直接拒绝访问。

解决办法:手动给requests设置和urllib2一致的User-Agent:

import requests
import json

url = 'https://api.optconnect.com/summit/beta/accounts/login/app_secret'
data = {'accountId': 000, 'applicationId': 000, 'secret': '000'}
headers = {
    'accept': 'application/json',
    'content-type': 'application/json',
    'User-Agent': 'Python-urllib/2.7'  # 改成和urllib2一样的UA
}

# 方式一:和urllib2一样手动转JSON
response = requests.post(url, data=json.dumps(data), headers=headers)
# 方式二:用requests的json参数自动处理(更推荐)
# response = requests.post(url, json=data, headers=headers)
print(response.status_code)

2. 请求数据编码格式不对

你的urllib2代码里把data用json.dumps()转成了JSON字符串,还设置了content-type: application/json,但如果在requests里直接把字典传给data参数,requests会默认用application/x-www-form-urlencoded格式编码数据——这和urllib2的请求格式完全不一样,服务器解析不了就会返回403。

解决办法:用requests的json参数代替data参数,它会自动帮你把字典转成JSON字符串,还会自动设置正确的Content-Type header(这种情况下甚至可以不用手动设置content-type):

import requests

url = 'https://api.optconnect.com/summit/beta/accounts/login/app_secret'
data = {'accountId': 000, 'applicationId': 000, 'secret': '000'}
headers = {
    'accept': 'application/json',
    'User-Agent': 'Python-urllib/2.7'  # 加上UA更保险
}

response = requests.post(url, json=data, headers=headers)
print(response.status_code)

3. 其他请求头差异

如果上面两个方法都不行,可能是服务器还在校验其他请求头,比如Accept-Encoding、Connection这些。你可以先在urllib2代码里打印出所有请求头,然后原封不动复制到requests里:

# 在你的urllib2代码里加这行,打印所有请求头
print(req.headers)

把打印出来的headers全部复制到requests的headers字典中,确保两个请求的headers完全一致。

总结

最常见的问题就是User-Agent不一致和数据编码错误,先试这两个方案,基本能解决403的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:42