Python Selenium爬取ESARJ站点数据问题:仅能获取单个站点信息
解决Selenium批量爬取充电站数据的问题
问题描述
使用Python爬取https://esarj.com/harita的充电站数据,目标是:
- 采集所有充电站的名称、地址、工作模式,分别存入对应列表
- 基于列表创建DataFrame并导出为Excel
当前代码仅能获取单个站点数据,无法批量采集,循环尝试无效。
问题分析
原代码只定位并获取了单个站点的信息,没有遍历页面上所有充电站的触发元素(如地图标记),也未将获取的数据存入预设列表。此外,使用visibility_of_element_located仅返回单个匹配元素,无法获取批量元素。
修正后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd # 定位表达式 NAME_XPATH = "//td[text()='Şarj Noktası:']//following::span[1]" ADDRESS_XPATH = "//td[text()='Adres:']//following::td[1]" MODEL_XPATH = "//td[text()='İstasyon Modeli:']//following::td[1]" # 所有站点标记的定位(地图上的充电站图标) STATION_MARKERS_XPATH = "//div[contains(@class, 'leaflet-marker-icon') and contains(@class, 'esarj-marker')]" name_list = [] address_list = [] model_list = [] # 初始化浏览器 driver = webdriver.Chrome(r'C:\Users\efede\OneDrive\Masaüstü\F\exeler\chromedriver.exe') driver.maximize_window() wait = WebDriverWait(driver, 30) driver.get('https://esarj.com/harita') # 接受Cookie wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Tamam')]"))).click() # 获取所有站点标记 wait.until(EC.presence_of_all_elements_located((By.XPATH, STATION_MARKERS_XPATH))) station_markers = driver.find_elements(By.XPATH, STATION_MARKERS_XPATH) # 遍历每个站点标记 for index, marker in enumerate(station_markers): try: # 点击标记打开站点详情弹窗(用execute_script避免元素遮挡导致的点击失败) driver.execute_script("arguments[0].click();", marker) # 获取站点名称 name = wait.until(EC.visibility_of_element_located((By.XPATH, NAME_XPATH))).text name_list.append(name) # 切换到Lokasyon标签获取地址 wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Lokasyon']"))).click() address = wait.until(EC.visibility_of_element_located((By.XPATH, ADDRESS_XPATH))).text address_list.append(address) # 切换到Teknik标签获取工作模式 wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Teknik']"))).click() model = wait.until(EC.visibility_of_element_located((By.XPATH, MODEL_XPATH))).text model_list.append(model) print(f"已采集第{index+1}个站点: {name}") except Exception as e: print(f"采集第{index+1}个站点失败: {str(e)}") # 异常时添加空值保证列表长度一致 name_list.append(None) address_list.append(None) model_list.append(None) # 创建DataFrame并导出Excel df = pd.DataFrame({ "Station Name": name_list, "Station Address": address_list, "Station Working Model": model_list }) df.to_excel("ESARJ.xlsx", sheet_name="ESARJ(12.6.23)", index=False) driver.quit()
关键修正点
- 新增
STATION_MARKERS_XPATH定位所有充电站的地图标记,通过find_elements获取批量元素 - 使用循环遍历每个标记,通过
execute_script触发点击(避免直接点击可能的元素遮挡问题) - 将每个站点的信息存入对应的列表,保证数据批量收集
- 添加异常处理,避免单个站点采集失败导致整个程序中断
- 修正DataFrame的列名和数据对应关系,确保导出的Excel结构正确
内容的提问来源于stack exchange,提问作者Efe Değirmenci
相关产品推荐
相关产品推荐

