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

使用Python抓取CFM医生信息接口报错求助:call_user_func_array参数错误及抓取工具选型疑问

解决CFM医生信息抓取的请求错误及工具选择建议

一、修复当前的请求错误

从你收到的错误提示call_user_func_array() expects parameter 2 to be array, object given来看,问题主要出在请求头缺失、参数序列化处理方式上,另外你使用的captcha值大概率已经过期,这也会导致请求失效。

修正后的代码示例

我调整了请求的处理逻辑,改用requests.post的json参数直接传递字典(无需手动json.dumps),这样requests会自动帮你设置Content-Type: application/json请求头,同时需要注意动态获取有效的captcha(可以从目标页面的HTML中提取):

import requests
from bs4 import BeautifulSoup

# 第一步:从目标页面获取有效的captcha
resp = requests.get("https://portal.cfm.org.br/busca-medicos/")
soup = BeautifulSoup(resp.text, "html.parser")
captcha = soup.find("input", {"name": "captcha"}).get("value")

# 构造请求数据
data = {
    "captcha": captcha,
    "medico": {
        "nome": "",
        "ufMedico": "SP",
        "crmMedico": "194528",
        "municipioMedico": "",
        "tipoInscricaoMedico": "",
        "situacaoMedico": "",
        "detalheSituacaoMedico": "",
        "especialidadeMedico": "",
        "areaAtuacaoMedico": ""
    },
    "page": 1,
    "pageNumber": 1,
    "pageSize": 10
}

url = "https://portal.cfm.org.br/api_rest_php/api/v1/medicos/buscar_medicos"
# 添加User-Agent模拟浏览器请求,降低被拦截概率
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"
}

r = requests.post(url, json=data, headers=headers)
print(r.json())

关键修复点:

  • 不再手动序列化JSON,改用json参数传递字典,确保请求格式与后端要求完全匹配。
  • 动态获取captcha:captcha是一次性验证值,过期后无法复用,必须从页面实时提取。
  • 添加User-Agent头,模拟真实浏览器行为,避免被反爬机制拦截。

二、Selenium vs Scrapy:哪种工具更合适?

1. 优先选择Scrapy的场景

如果能顺利解决API的验证问题(比如稳定获取captcha、无复杂JS反爬),Scrapy是更优方案:

  • 它是异步爬虫框架,批量抓取效率极高,适合大规模采集医生数据。
  • 自带数据清洗、管道处理功能,能轻松把抓取到的信息整理成你需要的格式。
  • 可以同时集成多个API请求(比如关联buscar_foto和listar_especialidades接口,匹配医生的专业领域信息)。

2. 选择Selenium的场景

如果API反爬机制严格(比如图形验证码需要识别、存在JS生成的动态参数),Selenium更合适:

  • 它模拟真实浏览器的完整操作流程,能直接填写表单、点击搜索按钮,绕过大部分前端反爬限制。
  • 不需要手动分析API参数,直接从渲染后的页面HTML中提取信息,逻辑更直观。

额外提示:专业领域信息的关联

你提到的listar_especialidades接口返回所有专业数据,通常搜索接口返回的医生信息里会包含专业对应的ID。你可以先把专业列表缓存成ID映射名称的字典,遍历医生数据时直接匹配即可,无需依赖前端的JS关联逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:17:35