
本文详解如何通过模拟 post 请求直接提交搜索参数,跳过前端表单页面,成功抓取巴西农业部 sigsif 系统中企业名录数据,解决因无状态跳转和 ssl 证书异常导致的 404 抓取失败问题。
本文详解如何通过模拟 post 请求直接提交搜索参数,跳过前端表单页面,成功抓取巴西农业部 sigsif 系统中企业名录数据,解决因无状态跳转和 ssl 证书异常导致的 404 抓取失败问题。
在实际 Web 抓取中,常遇到一类“伪静态”目标页面:其 URL 可公开访问,但内容仅在用户完成前置表单(如输入企业名称、点击查询)后才动态生成;若直接 GET 访问,服务器返回 404 或重定向至错误页。本例中的巴西农业部 SIGSIF 查询系统(/sigsif_cons/!ap_estabelec_nacional_lista)正是典型场景——它不依赖会话跳转逻辑,而是将全部查询参数通过 POST 直接提交至结果页 URL,因此无需模拟“先访问首页 → 解析表单 → 提交 → 跳转”的完整流程。
关键洞察在于:该系统的结果接口(!ap_estabelec_nacional_lista)本身即为表单的 action 目标地址,支持直接 POST 提交。我们只需逆向分析真实浏览器请求(可通过 DevTools → Network 标签捕获),提取必需字段并构造等效请求。
以下为精简可靠的实现方案:
import requests
from bs4 import BeautifulSoup
# 直接向结果页 URL 发起 POST 请求(跳过首页)
url = "https://extranet.agricultura.gov.br/sigsif_cons/!ap_estabelec_nacional_lista"
# 构造最小必要表单数据(字段名需与原始 HTML 表单一致)
data = {
"nr_sif": "", # SIF 编号(留空表示不限)
"nm_razao_social": " ", # 企业名称(传空格可匹配所有,避免空字符串被服务端忽略)
"nr_cnpj": "", # CNPJ(留空)
"nm_sort": "nr_sif", # 排序字段(默认按 SIF 编号升序)
"script_body": "onload=", # 部分隐藏字段,保留原始值防校验
"p_tipo_consulta": "" # 查询类型(留空)
}
# 禁用 SSL 验证(因站点使用自签名/过期证书)
response = requests.post(url, data=data, verify=False)
# 检查响应状态
if response.status_code != 200:
raise ConnectionError(f"请求失败,HTTP 状态码: {response.status_code}")
soup = BeautifulSoup(response.content, "html.parser")
# 定位主数据表格(利用 CSS 选择器精准过滤嵌套结构)
table = soup.select_one("table.LabelCampo:not(:has(.LabelCampo))")
if not table:
raise ValueError("未找到结果表格,请检查页面结构是否变更")
# 解析并打印每行数据(去除冗余空白,以空格分隔)
for row in table.find_all("tr")[1:]: # 跳过表头
text = row.get_text(strip=True, separator=" ")
if text: # 过滤空行
print(text)
✅ 成功要点总结:
- 跳过首屏,直击终点:!ap_estabelec_nacional_lista 同时承担表单接收与结果渲染角色,无需 Session().get() 首页;
- 字段必须精确匹配:nm_razao_social 传 " "(单个空格)而非 "",否则部分后端逻辑可能拒绝空查询;
- 禁用 SSL 验证需显式声明:verify=False 必须置于 requests.post() 调用中,全局 urllib3.disable_warnings() 仅抑制警告,不改变行为;
- 选择器健壮性优先:使用 table.LabelCampo:not(:has(.LabelCampo)) 避免误选嵌套子表,比单纯 find('table') 更可靠。
⚠️ 注意事项:
- 该接口无反爬机制(如验证码、频率限制),但属政府系统,请遵守 robots.txt 并控制请求间隔(建议 ≥2 秒);
- 字段名(如 p_tipo_consulta)可能随前端更新变化,首次使用前务必通过浏览器开发者工具确认当前 form 的 input[name] 属性;
- 若未来出现登录态校验,需额外处理 Cookie 或 JWT,但当前版本仍为无认证开放查询。
通过此方法,你可在 5 行核心代码内稳定获取结构化企业名录,大幅提升抓取效率与鲁棒性。










