为何URL在Postman中可正常响应,Python调用却无返回?
修复方案
你的Python请求和Postman中正常工作的请求存在几个关键差异,逐个修正即可解决问题:
1. 补全URL缺失的查询参数
Postman的cURL包含strategy=DEFAULT、pageSize=500、isProtected、_t(毫秒时间戳)这些参数,但你的Python代码仅传入了tradeDate。这些是服务器验证请求合法性的必要参数,必须补充完整。
2. 添加浏览器标识头(User-Agent)
CME这类金融网站会校验请求的客户端身份,缺少User-Agent会被直接拦截。需要在请求头中添加模拟浏览器的标识值。
3. 替换为有效Cookie
Cookie中的ak_bmsc和bm_sv属于会话临时凭证,有效期很短。你需要从当前能正常访问的浏览器或Postman中复制最新的Cookie值替换代码里的旧值。
4. 移除无用的data参数
GET请求无需data参数,直接删除即可,避免干扰请求逻辑。
修正后的完整代码示例
import requests import time # 生成当前毫秒级时间戳(对应cURL里的_t参数) current_timestamp = int(time.time() * 1000) url = "https://www.cmegroup.com/CmeWS/mvc/Settlements/Futures/Settlements/10047/FUT" # 用params统一管理查询参数,比直接拼接URL更清晰易维护 params = { "strategy": "DEFAULT", "tradeDate": "10/07/2022", "pageSize": "500", "isProtected": "", "_t": current_timestamp } headers = { # 替换成你当前有效的Cookie值 'Cookie': 'ak_bmsc=XXX; bm_sv=XXX', # 模拟Chrome浏览器的User-Agent,也可以用你自己浏览器的实际标识 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers, params=params) # 先打印状态码,方便快速排查问题 print("响应状态码:", response.status_code) print(response.text)
额外注意事项
_t参数必须是当前请求的毫秒级时间戳,不要固定使用旧值,用time.time()*1000动态生成即可。- 如果仍出现连接关闭的情况,可以尝试补充
Accept、Accept-Language等浏览器常用请求头,完全复制浏览器的请求头能进一步提高请求成功率。 - Cookie有效期通常较短,若再次失效,需重新从浏览器开发者工具的Network面板中复制最新Cookie。
内容的提问来源于stack exchange,提问作者grahamrob
相关产品推荐
相关产品推荐

