如何携带自定义数据发送POST请求并解决请求无效问题
问题排查与解决方法
1. 先验证自定义数据是否真的被发送
先打印请求的实际发送内容,确认参数是否正确传递:
import requests # 保留原cookies、headers、params配置不变 data = { 'condition': '', 'order': '', 'limit': '50', 'page': '3', 'pageChanged': 'false', } response = requests.post( 'https://global-standard.org/find-suppliers-shops-and-inputs/certified-suppliers/database/search', params=params, cookies=cookies, headers=headers, data=data ) # 打印发送的表单数据,确认参数是否正确 print("发送的表单数据:", response.request.body) # 打印响应状态码和部分内容,判断服务器反馈 print("响应状态码:", response.status_code) print("响应内容片段:", response.text[:500])
如果response.request.body显示limit=50&page=3...,说明数据已发送,问题出在服务器端校验;如果不是,检查代码是否存在变量覆盖的情况。
2. 检查会话与请求参数的时效性
- 更新Cookie:原Cookie可能已过期,从浏览器开发者工具(F12)抓取最新的请求Cookie替换到代码中
- 校验Referer参数:确保Referer中的
total值与当前搜索的实际总条数匹配,部分网站会校验该参数 - 补充隐藏参数:对比浏览器抓取的完整请求表单,看是否遗漏了网站自动生成的隐藏参数(如csrf_token)
3. 使用Session维护会话状态
很多网站要求先访问搜索页面建立会话,再发送AJAX请求,改用Session对象自动维护会话:
session = requests.Session() # 先访问搜索结果页面,获取有效会话 session.get('https://global-standard.org/find-suppliers-shops-and-inputs/certified-suppliers/database/search_results?total=9461', headers=headers) # 再发送POST请求 response = session.post( 'https://global-standard.org/find-suppliers-shops-and-inputs/certified-suppliers/database/search', params=params, data=data )
4. 确认Content-Type匹配
当前请求头设置的是application/x-www-form-urlencoded,requests.post的data参数默认符合该格式,若服务器实际接受JSON格式,需调整:
headers['Content-Type'] = 'application/json' response = requests.post( 'https://global-standard.org/find-suppliers-shops-and-inputs/certified-suppliers/database/search', params=params, cookies=cookies, headers=headers, json=data )
内容的提问来源于stack exchange,提问作者kodeinoslave
相关产品推荐
相关产品推荐

