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

如何用BeautifulSoup/Selenium自动抓取动态加载的奥地利医生信息并导出CSV

爬取medicus-online.at医生信息完整方案

一、解决区域选择的特殊逻辑(Selenium实现)

网站需要先选「Alle Bezirke」→ 选任意区域 → 再选回「Alle Bezirke」才能加载全部医生,用Selenium可按以下步骤模拟:

  • 等待区域筛选框加载完成,点击展开下拉选项
  • 先选择「Alle Bezirke」选项
  • 再选择下拉列表中的第一个具体区域(比如「Wien 1. Bezirk」)
  • 最后再次选择「Alle Bezirke」触发全部医生加载

二、自动点击「Load More」展开所有内容

页面会分批加载医生卡片,需循环点击「Load More」按钮直到全部内容加载完毕:

  • 循环检查按钮是否存在且可点击
  • 每次点击后等待页面加载新内容,避免重复点击或遗漏

三、提取医生信息(含预约日程)

加载完成后用BeautifulSoup解析页面,提取关键信息:

  • 医生姓名、所属科室
  • 所在区域、联系方式
  • 预约日程(展开后的详细信息)

四、完整代码示例

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
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException
from bs4 import BeautifulSoup
import csv
import time

# 初始化Chrome浏览器(需提前配置对应版本的ChromeDriver)
driver = webdriver.Chrome()
driver.get("https://www.medicus-online.at/aek/dist/medicus-suche")
driver.maximize_window()
wait = WebDriverWait(driver, 10)

try:
    # 处理区域选择逻辑
    # 点击区域筛选下拉框
    district_dropdown = wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class, 'district-filter')]//button")))
    district_dropdown.click()
    
    # 选择Alle Bezirke
    alle_bezirke = wait.until(EC.element_to_be_clickable((By.XPATH, "//li[text()='Alle Bezirke']")))
    alle_bezirke.click()
    time.sleep(1)
    
    # 再次点击下拉框,选择第一个具体区域
    district_dropdown.click()
    first_district = wait.until(EC.element_to_be_clickable((By.XPATH, "//li[not(text()='Alle Bezirke')][1]")))
    first_district.click()
    time.sleep(1)
    
    # 第三次点击下拉框,重新选择Alle Bezirke
    district_dropdown.click()
    alle_bezirke.click()
    time.sleep(3)  # 等待全部医生加载
    
    # 自动点击Load More直到按钮消失
    while True:
        try:
            load_more_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Load more')]")))
            load_more_btn.click()
            time.sleep(2)  # 等待新内容加载
        except (TimeoutException, ElementClickInterceptedException):
            break  # 按钮不存在或不可点击时停止
    
    # 解析页面提取信息
    soup = BeautifulSoup(driver.page_source, "html.parser")
    doctor_cards = soup.find_all("div", class_="doctor-card")
    doctors_data = []
    
    for card in doctor_cards:
        # 提取基础信息
        name = card.find("h3").get_text(strip=True) if card.find("h3") else "N/A"
        specialty = card.find("div", class_="specialty").get_text(strip=True) if card.find("div", class_="specialty") else "N/A"
        district = card.find("div", class_="district").get_text(strip=True) if card.find("div", class_="district") else "N/A"
        
        # 提取预约日程(展开后的内容)
        schedule_div = card.find("div", class_="schedule-content")
        schedule = schedule_div.get_text(strip=True).replace("\n", " ") if schedule_div else "N/A"
        
        doctors_data.append({
            "姓名": name,
            "科室": specialty,
            "区域": district,
            "预约日程": schedule
        })
    
    # 导出到CSV
    with open("medicus_doctors.csv", "w", encoding="utf-8-sig", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["姓名", "科室", "区域", "预约日程"])
        writer.writeheader()
        writer.writerows(doctors_data)
    
    print(f"成功导出{len(doctors_data)}条医生信息到medicus_doctors.csv")

finally:
    driver.quit()

注意事项

  • 确保已安装所需依赖:pip install selenium beautifulsoup4
  • ChromeDriver版本需与本地Chrome浏览器版本匹配
  • 若页面出现弹窗或加载延迟,可适当调整time.sleep()的时长或添加额外等待逻辑
  • 网站若更新页面结构,需根据实际情况调整XPATH或CSS选择器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:30:32