使用Requests模块请求Argos API时陷入无限等待无法获取数据的原因排查
我有一个存储JSON数据的URL:
https://www.argos.co.uk/stores/api/orchestrator/v0/locator/availability?origin=RH10&skuQty=6217859_1,在浏览器中访问该URL可以正常显示数据。但当我使用Requests模块编写代码尝试获取该URL的数据时,程序似乎始终无法获取数据并陷入无限等待。以下是我使用的代码:import requests main = 'https://www.argos.co.uk/' s = requests.Session() s.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}) s.get(main) url = 'https://www.argos.co.uk/stores/api/orchestrator/v0/locator/availability?origin=RH10&skuQty=6217859_1' g = s.get(url) print(g.content)请问出现这种无限等待情况的可能原因是什么?
可能的原因及解决思路
让我帮你拆解下几个最可能的原因,以及对应的调试方向:
URL中的转义字符未处理:你当前URL里的
&是HTML转义后的&符号,浏览器会自动识别并解析成正常的&,但Requests不会做这个转换。API收到错误的参数格式后,可能无法正确处理请求,导致长时间挂起。你需要把URL里的&替换成&,修正后的URL应该是:https://www.argos.co.uk/stores/api/orchestrator/v0/locator/availability?origin=RH10&skuQty=6217859_1。缺少必要的请求头字段:除了User-Agent,Argos的API可能还依赖其他请求头来验证请求合法性。比如浏览器会自动带上
Accept(指定接受的响应格式)、Referer(标识请求来源页面)这些字段。你可以打开浏览器开发者工具(F12),切换到Network标签,找到该API请求,查看Request Headers里的所有字段,把缺失的字段添加到你的Session headers中。比如常见需要补充的:s.headers.update({ 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://www.argos.co.uk/' })未设置请求超时时间:你的代码没有给
get请求设置超时参数,一旦网络出现波动或者API端响应缓慢,程序就会无限等待下去。建议添加超时限制,比如设置10秒超时:g = s.get(url, timeout=10),这样超过时间就会抛出超时异常,避免程序挂死。反爬机制拦截:Argos大概率有反爬策略,仅靠Session和基础的User-Agent可能不够。比如需要携带特定的Cookie(比如会话标识、CSRF token),这些Cookie是浏览器访问主站时生成的。你可以在浏览器中访问主站后,查看开发者工具里的Cookie,把关键的Cookie键值对手动添加到Session的
cookies中,或者尝试模拟更完整的浏览器行为(比如先访问商品详情页,再请求库存API)。SSL证书验证问题(概率较低):部分网站的SSL证书配置可能和Requests的默认验证逻辑冲突,导致请求卡住。你可以临时关闭SSL验证测试(注意:生产环境不建议这么做,存在安全风险),添加
verify=False参数:g = s.get(url, verify=False),看看是否能正常获取响应。
内容的提问来源于stack exchange,提问作者curious_nustian

