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

Selenium+Python爬取医生信息:复选框及后续操作问题求助

问题解决与方案建议

一、修复Selenium代码的核心问题

你的代码存在两个关键错误,同时建议用显式等待替代time.sleep提升稳定性,以下是修正后的完整代码及说明:

错误点分析

  1. 复选框定位语法错误:By.CLASS_NAME参数应为类名本身,而非"value = 'checkbox'"这种错误格式;且部分页面的复选框点击事件绑定在文本span而非input元素上。
  2. 提交按钮仅定位未执行点击操作:原代码最后一行只找到元素,未调用.click()。

修正后的代码

from selenium import webdriver 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

doctor_dict = {}

# 配置浏览器选项(可添加无头模式等)
options = webdriver.ChromeOptions()
# options.add_argument("--headless=new")  # 可选:无头模式运行

driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)  # 显式等待,最长等待10秒

try:
    driver.get("https://www.inspiresleep.com/en-us/find-a-doctor/")
    
    # 点击"Yes"按钮(等待元素可点击)
    yes_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Yes']")))
    yes_btn.click()
    
    # 勾选"Show by State"复选框(两种可选方法)
    # 方法1:直接点击input元素(ID定位最准确)
    checkbox = wait.until(EC.presence_of_element_located((By.ID, "show-by-state-checkbox")))
    if not checkbox.is_selected():
        checkbox.click()
    
    # 方法2:若input被遮挡,点击文本对应的span(兼容性更强)
    # checkbox_span = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Show by State']")))
    # checkbox_span.click()
    
    # 点击"Submit & Find a Doctor"按钮
    submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Submit & Find a Doctor']")))
    submit_btn.click()

finally:
    # 后续操作完成后关闭浏览器
    # driver.quit()
    pass

二、后续页面选择州的实现

可以实现,提交表单后页面会加载州选择控件,只需继续扩展代码:

# 等待州下拉菜单加载并点击展开(需根据实际页面元素调整定位器)
state_dropdown = wait.until(EC.element_to_be_clickable((By.ID, "state-select")))  # 假设下拉菜单ID为state-select
state_dropdown.click()

# 选择目标州(比如California)
state_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//option[text()='California']")))
state_option.click()

# 提取医生姓名(假设医生姓名元素类名为doctor-name)
doctor_names = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "doctor-name")))
for name in doctor_names:
    doctor_dict[name.text] = {}  # 可扩展存储其他医生信息

注意:需根据实际页面的HTML结构调整元素定位器,确保能准确找到下拉菜单和州选项。

三、无需Selenium的API替代方案

可以通过抓包分析页面的AJAX请求,直接调用后端API获取数据,效率更高:

  1. 打开浏览器开发者工具(F12)→ 切换到Network标签。
  2. 手动完成页面操作(点击Yes、勾选复选框、提交、选州),观察XHR/Fetch请求,找到返回医生列表的API接口。
  3. 用requests库模拟该请求,解析JSON数据提取信息。

示例代码(需根据实际抓包结果调整):

import requests

# 从抓包中复制请求头(需包含User-Agent、Referer等)
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",
    "Referer": "https://www.inspiresleep.com/en-us/find-a-doctor/"
}

# 假设抓包得到的API地址及参数
api_url = "https://www.inspiresleep.com/api/doctor-search"
params = {
    "state": "CA",  # 州代码,比如CA对应加利福尼亚
    "country": "US"
}

# 发送请求获取数据
response = requests.get(api_url, headers=headers, params=params)
if response.status_code == 200:
    doctors = response.json()
    for doc in doctors:
        print(doc["fullName"])  # 假设返回字段为fullName
        doctor_dict[doc["fullName"]] = {"specialty": doc["specialty"]}  # 扩展存储其他信息

注意:部分网站API可能需要携带会话Cookie或验证Token,需从抓包结果中提取并添加到请求中;若遇到反爬,需模拟真实请求的所有参数和头信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:32:25