Python requests提交KMC出生记录查询接口form-data返回系统管理员错误如何解决?
问题原因
- 手动指定了固定的
Content-Length请求头:requests会根据实际提交的payload自动计算该字段值,你写死的56和实际请求长度不匹配会直接被后台拒绝。 - 遗漏了页面隐藏的校验参数:这类政务站点几乎都会在搜索页面嵌入CSRF令牌、会话校验类的隐藏表单字段,你需要先从第一次GET请求返回的HTML里提取这些字段,和查询参数一起提交,否则后台会判定为非法请求。
- 没必要手动提取Session的Cookie:
requests.Session()实例会自动维护请求过程中的Cookie,你不需要手动提取再传递,反而可能出现传递错误。 - 可能存在参数名大小写错误:Java后端对参数名大小写敏感,你需要确认表单的出生日期参数是
dateofBirth还是dateOfBirth这类拼写差异,以及是否还有其他必填的查询参数你没有包含。 - 提交格式不匹配:你提到要发送
form-data格式请求,但你当前代码用的是application/x-www-form-urlencoded格式,如果站点要求multipart/form-data格式,你需要调整参数构造方式。
修复方案代码示例
import requests from bs4 import BeautifulSoup # 初始化会话 a_session = requests.Session() # 统一设置公共请求头,避免每次请求单独传递 a_session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36", "Referer": "https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp", "X-Requested-With": "XMLHttpRequest" }) # 第一次请求获取搜索页面,提取隐藏校验参数 search_page = a_session.get('https://www.kmcgov.in/KMCPortal/jsp/KMCBirthRecordSearch.jsp') soup = BeautifulSoup(search_page.text, 'html.parser') # 提取所有隐藏表单字段加入提交参数 post_data = {} hidden_inputs = soup.find_all('input', {'type': 'hidden'}) for input_tag in hidden_inputs: if input_tag.get('name') and input_tag.get('value'): post_data[input_tag.get('name')] = input_tag.get('value') # 添加你的查询参数 post_data.update({ 'FatherName': 'Cha', 'dateofBirth': '19/08/2004', 'MotherName': 'Cha', }) url = 'https://www.kmcgov.in/KMCPortal/KMCBirthRegistrationAction.do?var=getVal' # 直接用session发送post请求,不需要手动传cookie,不要手动写Content-Length等自动生成的头 r = a_session.post(url, data=post_data) print(r.text) # 如果确实需要form-data格式,把post的参数换成files构造即可: # r = a_session.post(url, files=post_data)
额外排查方向
如果修改后还是报错,你可以用浏览器F12的网络面板,手动提交一次查询,对比浏览器发送的POST请求里的所有参数,确认你提交的参数名、参数值和浏览器完全一致即可。
内容的提问来源于stack exchange,提问作者Swabsini
相关产品推荐
相关产品推荐

