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

使用Python Requests抓取ASPX页面时Payload参数不匹配问题排查

解决ASPX页面抓取的404及VIEWSTATE参数问题

核心问题分析

你遇到的404错误大概率是会话不连贯或请求头/参数提取错误导致的:ASPX站点依赖会话(Session)绑定__VIEWSTATE、__EVENTVALIDATION等参数,且对请求头完整性要求高,Python代码中如果会话断开、头信息缺失或参数提取错误,就会触发404;而Postman用固定参数能返回“可疑请求”,说明站点连接正常,只是代码的请求逻辑不符合站点校验规则。

具体解决步骤

  1. 强制保持会话一致性
    ASPX的__VIEWSTATE等参数与ASP.NET_SessionId绑定,必须全程使用同一个requests.Session()对象发起请求,不能每次请求新建会话。

  2. 复刻完整请求头
    把Postman中所有请求头(包括User-Agent、Accept、Referer、Accept-Language等)完全复制到Python代码中,尤其是User-Agent,很多ASPX站点会通过它判断请求合法性,缺失或不匹配直接返回404。

  3. 正确提取动态参数
    首次GET请求页面后,要用BeautifulSoup精准解析当前会话下的参数:

    • 确保选择器定位到正确的input标签(通过name属性匹配,而非id,部分站点的id可能动态变化)
    • 不要使用缓存的页面内容,必须用当前GET请求返回的响应文本解析
  4. 排查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:03