如何用Python Requests采集表单生成的数据?实战问题求助
解决方案
问题根源分析
你的代码存在几个关键问题:
- 错误使用
params传递POST表单数据:params是将参数拼接在URL中,而POST表单数据需要放在请求体里,应使用data参数。 - 字段值不符合要求:
consultaExternaHelper.endereco.municipio.id需要的是城市对应的数值ID,而非城市名称"Campo Largo"。 - 未指定正确的表单提交接口:原页面的表单实际提交到独立的接口路径,而非当前访问的
pesquisarConsultaExterna.html。
修正后的实现步骤
- 用
requests.Session维持会话,先访问页面获取必要的Cookie和页面结构信息。 - 从页面的下拉选项中提取PR州下Campo Largo对应的城市ID。
- 构造正确的表单数据,指定正确的提交URL,并添加模拟浏览器的请求头。
- 提交请求后解析返回的表格数据。
完整代码
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
相关产品推荐
相关产品推荐

