使用Python Requests抓取ASPX页面时Payload参数不匹配问题排查
解决ASPX页面抓取的404及VIEWSTATE参数问题
核心问题分析
你遇到的404错误大概率是会话不连贯或请求头/参数提取错误导致的:ASPX站点依赖会话(Session)绑定__VIEWSTATE、__EVENTVALIDATION等参数,且对请求头完整性要求高,Python代码中如果会话断开、头信息缺失或参数提取错误,就会触发404;而Postman用固定参数能返回“可疑请求”,说明站点连接正常,只是代码的请求逻辑不符合站点校验规则。
具体解决步骤
强制保持会话一致性
ASPX的__VIEWSTATE等参数与ASP.NET_SessionId绑定,必须全程使用同一个requests.Session()对象发起请求,不能每次请求新建会话。复刻完整请求头
把Postman中所有请求头(包括User-Agent、Accept、Referer、Accept-Language等)完全复制到Python代码中,尤其是User-Agent,很多ASPX站点会通过它判断请求合法性,缺失或不匹配直接返回404。正确提取动态参数
首次GET请求页面后,要用BeautifulSoup精准解析当前会话下的参数:- 确保选择器定位到正确的
input标签(通过name属性匹配,而非id,部分站点的id可能动态变化) - 不要使用缓存的页面内容,必须用当前GET请求返回的响应文本解析
- 确保选择器定位到正确的
排查404的其他可能
- 检查请求URL是否完全匹配,避免路径拼写错误或编码问题
- 确认请求顺序:必须先GET页面获取参数,再发起POST请求,不能直接POST
修正后的示例代码
import requests from bs4 import BeautifulSoup # 初始化会话,保持Cookie和会话状态 session = requests.Session() # 完全复刻Postman中的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "es-PE,es;q=0.8,en-US;q=0.5,en;q=0.3", "Referer": "https://servicios.sbs.gob.pe/ReporteSituacionPrevisional/Afil_Consulta.aspx", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" } # 第一步:GET请求获取初始页面及动态参数 target_url = "https://servicios.sbs.gob.pe/ReporteSituacionPrevisional/Afil_Consulta.aspx" get_response = session.get(target_url, headers=headers) # 主动检查请求状态,避免404被忽略 get_response.raise_for_status() # 解析页面提取参数 soup = BeautifulSoup(get_response.text, "html.parser") viewstate = soup.find("input", {"name": "__VIEWSTATE"})["value"] event_validation = soup.find("input", {"name": "__EVENTVALIDATION"})["value"] viewstate_generator = soup.find("input", {"name": "__VIEWSTATEGENERATOR"})["value"] # 第二步:构造POST请求的Payload(包含所有必要表单参数) payload = { "__VIEWSTATE": viewstate, "__EVENTVALIDATION": event_validation, "__VIEWSTATEGENERATOR": viewstate_generator, # 替换为你实际需要提交的表单字段,从Postman中复制 "txtDocumento": "12345678", "btnConsultar": "Consultar" } # 发送POST请求 post_response = session.post(target_url, headers=headers, data=payload) print(post_response.status_code) print(post_response.text)
额外注意事项
- 不要使用固定的
__VIEWSTATE和__EVENTVALIDATION值,这些参数是会话绑定且动态生成的,过期后会失效,必须每次请求前重新获取 - 如果仍返回404,打印
session.cookies检查是否存在ASP.NET_SessionId,确认会话是否正常建立 - 后续遇到“可疑请求”响应时,可能需要处理验证码或其他反爬机制,但当前优先解决会话和参数问题
内容的提问来源于stack exchange,提问作者NaejF
相关产品推荐
相关产品推荐

