Python POST请求无法从Tesco后端获取数据,返回500错误
请求头不能少:浏览器发XHR时会带一堆关键头,比如
User-Agent、Content-Type、Referer、X-Requested-With,甚至Cookie。只传payload的话,后端可能认不出这是合法请求,直接返回500。比如Content-Type如果是application/json,你没设置的话,后端解析payload直接报错。payload要保真:复制XHR负载时,注意格式别错——如果是JSON,双引号不能改成单引号,转义字符也不能丢;如果是表单格式,得用
urllib.parse.urlencode处理成键值对字符串,别直接传原始文本。会话Cookie得带:很多网站要求先访问页面拿会话Cookie,再发POST。直接发POST的话,后端觉得你是非法会话,抛出错误。先模拟GET请求目标页面,保存Cookie再带过去发POST。
动态参数要新鲜:payload里可能有
timestamp、csrf_token这类动态生成的参数,你复制的旧参数早就失效了。得从当前页面的HTML或者之前的请求里提取最新的,不能直接用旧的。请求URL和方法别错:确认POST的URL和XHR里的完全一致,路径多一个少一个字符都可能触发500。比如XHR是
/api/fruit/list,你写成/api/fruit肯定不行。检查payload字段完整性:有些请求会藏着
__RequestVerificationToken这类防CSRF的字段,复制的时候别漏了,仔细看开发者工具里的Payload/Form Data标签,把所有字段都带上。
另外,打印response.text看看服务器返回的具体错误信息,比如“缺少csrf token”“参数格式错误”,这能直接帮你定位问题。
给个Python示例参考(用requests):
import requests # 先建立会话,获取Cookie session = requests.Session() session.get('https://www.tesco.ie/groceries/en-IE/shop/fresh-food/fresh-fruit') # 构造完整请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Content-Type': 'application/json', 'Referer': 'https://www.tesco.ie/groceries/en-IE/shop/fresh-food/fresh-fruit', 'X-Requested-With': 'XMLHttpRequest' } # 确保payload是最新的,动态参数要从页面提取 payload = { 'categoryId': 'fresh-fruit', 'pageSize': 24, 'currentPage': 1, 'csrfToken': '这里填从页面提取的最新token' } # 发送POST请求 response = session.post('https://www.tesco.ie/api/products/list', headers=headers, json=payload) print(response.status_code) print(response.text)
内容的提问来源于stack exchange,提问作者Oxin

