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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:05:33