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

如何用Python Requests采集表单生成的数据?实战问题求助

解决方案

问题根源分析

你的代码存在几个关键问题:

  • 错误使用params传递POST表单数据:params是将参数拼接在URL中,而POST表单数据需要放在请求体里,应使用data参数。
  • 字段值不符合要求:consultaExternaHelper.endereco.municipio.id需要的是城市对应的数值ID,而非城市名称"Campo Largo"。
  • 未指定正确的表单提交接口:原页面的表单实际提交到独立的接口路径,而非当前访问的pesquisarConsultaExterna.html。

修正后的实现步骤

  1. 用requests.Session维持会话,先访问页面获取必要的Cookie和页面结构信息。
  2. 从页面的下拉选项中提取PR州下Campo Largo对应的城市ID。
  3. 构造正确的表单数据,指定正确的提交URL,并添加模拟浏览器的请求头。
  4. 提交请求后解析返回的表格数据。

完整代码

import pandas as pd
import requests
from bs4 import BeautifulSoup

# 初始化会话,维持请求上下文
session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

# 1. 访问初始页面,获取会话信息和城市ID
base_url = 'https://aplicacoes.mds.gov.br/cadsuas/pesquisarConsultaExterna.html'
response = session.get(base_url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# 提取PR州下Campo Largo的对应ID
municipio_select = soup.find('select', id='consultaExternaHelper.endereco.municipio.id')
campo_largo_id = None
for option in municipio_select.find_all('option'):
    if option.text.strip() == 'Campo Largo' and option.get('data-uf') == 'PR':
        campo_largo_id = option['value']
        break

if not campo_largo_id:
    raise ValueError("未找到Campo Largo对应的ID")

# 2. 构造表单数据,提交到正确的处理接口
submit_url = 'https://aplicacoes.mds.gov.br/cadsuas/consultaExterna/pesquisar.action'
payload = {
    'consultaExternaHelper.tipoBusca': 'Rede Socioassistencial',
    'consultaExternaHelper.endereco.municipio.uf.sigla': 'PR',
    'consultaExternaHelper.endereco.municipio.id': campo_largo_id,
    'consultaExternaHelper.tipo': '',  # 留空表示查询所有类型,可指定为CRAS/CREAS筛选
    'consultaExternaHelper.possuiCeas': '',
    'pagina': '1',
    'registrosPorPagina': '10'
}

# 提交POST请求
response = session.post(submit_url, data=payload, headers=headers)

# 3. 解析返回的表格数据
dfs = pd.read_html(response.text)
# 目标表格通常是第二个DataFrame,可根据实际返回调整索引
target_df = dfs[1]
print(target_df)

补充说明

  • 若需要筛选特定机构类型,可给consultaExternaHelper.tipo赋值为CRAS或CREAS。
  • 若要获取更多数据,可修改registrosPorPagina的值,或添加分页逻辑遍历多页。
  • 若网站后续更新接口或字段,需重新检查页面的表单结构和提交路径。

内容的提问来源于stack exchange,提问作者PM92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:45:29