You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests POST请求失效排查求助:返回200但无预期数据

问题排查请求:POST请求返回200但内容异常
  • 背景:使用requests库多年向纽约州教育部发送POST请求,获取院校名称列表页面。一周前请求突然失效,返回状态码200,但HTML内容变为提示“请返回上页检查输入,必须选择搜索选项”,而非原本包含院校选项的select元素。
  • 已排查情况:浏览器提交对应表单可正常运行;代码、requests库、Python版本均未改动;网站外观无明显变化;尝试模仿Firefox的请求头(User-Agent、Accept等),所有组合均返回相同提示(仅添加Host头会返回404)。
  • 执行代码后始终输出错误:nys_institutions.py: ERROR: received 0 institutions from https://www.nysed.gov/coms/rp090/IRPSL1/ (expected 400+).

失效代码

url = 'https://www.nysed.gov/coms/rp090/IRPSL1/'
response = requests.post(url, data={'Searches': "1"})
if response.status_code == requests.codes.ok:
  html_document = document_fromstring(response.content)
  option_elements = [option.text_content() for option in html_document.cssselect('option')]
  if len(option_elements) < 400:
    exit(f'{script_file}: ERROR: received {len(option_elements)} institutions from {url} '
         f'(expected 400+).')
else:
  exit(f'{script_file}: ERROR: {url} returned {response.status_code} status')

排查建议

  • 抓包对比请求细节:用浏览器开发者工具抓取正常POST请求,和代码发送的请求做全量对比,包括所有请求头字段(如Referer、Cookie、Origin、Content-Type等)、完整POST参数集合(是否遗漏隐藏字段)、请求编码方式。
  • 维持会话并携带Cookie:网站可能新增了会话验证,改用requests.Session()先GET一次目标页面获取Cookie,再发送POST请求,确保会话一致性。
  • 提取表单隐藏字段:检查目标页面的HTML,是否存在__VIEWSTATE、__EVENTVALIDATION这类动态生成的隐藏字段,需要从GET页面中提取这些字段的值,随POST参数一起提交。
  • 验证Content-Type:确认浏览器发送表单时的Content-Type类型,若网站要求multipart/form-data,需调整代码用files参数或手动设置Content-Type头。
  • 遵循请求顺序:先GET访问表单页面,再执行POST请求,模拟浏览器的操作流程,避免直接发送POST被服务器拦截。
  • 检查JS生成参数:如果表单提交前有JS处理参数(如加密、生成签名),分析页面JS逻辑,在代码中模拟生成对应的参数值。

内容的提问来源于stack exchange,提问作者Christopher Vickery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:03:08