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
相关产品推荐
相关产品推荐

