使用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
相关产品推荐
相关产品推荐

