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

