调用亚马逊商品API返回404状态码的问题咨询
亚马逊商品API调用404问题分析与解决
问题核心
调用意大利站亚马逊deal API时返回404状态码,已从浏览器获取x-api-csrf-token,疑问该token是否是404的诱因,同时计划通过先请求主页面获取有效Cookie和token再发起API请求的方式解决。
Token与404的关联
通常CSRF Token无效会返回403 Forbidden而非404,但亚马逊部分API会在身份验证/验证失败时返回404来隐藏真实原因,因此不能排除token或Cookie无效导致API拒绝服务并伪装成404的可能。
当前代码存在明显问题:
- 请求头中重复定义了
cookie和Cookie(大小写不同),可能导致Cookie信息冲突 - 手动复制的Cookie和Token大概率已过期,且二者未绑定同一会话(亚马逊的CSRF Token通常与用户会话强关联)
解决方案(匹配你提出的思路)
通过会话保持机制,先请求亚马逊deal主页面获取有效会话Cookie和CSRF Token,再携带这些信息调用API:
修改后的代码
import requests from bs4 import BeautifulSoup # 1. 初始化会话,自动管理Cookie session = requests.Session() session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0", "Accept-Language": "it-IT", "Referer": "https://www.amazon.it/" }) # 2. 请求deal主页面,获取会话Cookie和CSRF Token main_page_url = "https://www.amazon.it/gp/goldbox" response = session.get(main_page_url) response.raise_for_status() # 解析页面提取CSRF Token(从页面script标签中查找,亚马逊通常将token放在全局变量里) soup = BeautifulSoup(response.text, "html.parser") csrf_token = None for script in soup.find_all("script"): if "x-api-csrf-token" in script.text: import re match = re.search(r'"x-api-csrf-token"\s*:\s*"([^"]+)"', script.text) if match: csrf_token = match.group(1) break if not csrf_token: raise ValueError("Failed to extract x-api-csrf-token from main page") # 3. 调用目标API,携带有效Cookie和Token api_url = "https://data.amazon.it/api/marketplaces/APJ6JRA9NG5V4/deals/a4e00097,9c91c27e,7a475971,9800e513,2829d091,c9280e8c,d982787d,7f2e4067,59f38bcb,f3d04636,07d6f3c0,c90c7069,9b103423,a187250b,b0725bd1,d542c309,225ffbf5,a70e896c,16bcaa86,e4a9fef5,3300ae7d,25c13fc2,8212dee8,23a2b0d0,0b97015a,68f59214,8b5662ef,7ed16bc9,1f2c4cff,aaa2b7e6" api_headers = { "Accept": "application/vnd.com.amazon.api+json; type=\"collection(deal/v1)/v1\"; expand=\"details(deal.details/v1),status(deal.status/v1),badge(deal.badge/v1)\"; experiments=\"DealBadgeColors_4da10b4,DealBadgeRounding_8c426ad,DealLabelType_05035b,DealMessageType_024db1\"", "Origin": "https://www.amazon.it", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-site", "x-api-csrf-token": csrf_token, "x-cc-currency-of-preference": "EUR", "Pragma": "no-cache", "Cache-Control": "no-cache" } api_response = session.get(api_url, headers=api_headers) print(f"Response Status: {api_response.status_code}") print(f"Response Content: {api_response.text[:500]}") # 打印前500字符查看结果
关键说明
- 使用
requests.Session()自动管理Cookie,避免手动复制过期Cookie的问题 - 从主页面动态提取CSRF Token,确保Token与当前会话绑定
- 移除了重复的Cookie头和不必要的字段,保持请求头简洁有效
额外注意事项
- 亚马逊会频繁更新页面结构,若Token提取失败,需重新查看页面源码调整正则表达式
- 若仍返回404,需确认API URL中的deal ID是否有效(部分deal可能已过期下架)
- 频繁请求可能触发亚马逊反爬机制,建议添加适当延迟
内容的提问来源于stack exchange,提问作者Elias Lonfernini
相关产品推荐
相关产品推荐

