使用Selenium爬取g-charge站点地址时遭遇TimeoutException如何解决?
修复Selenium TimeoutException问题的方案
问题根源
你遇到的超时错误主要来自两个核心问题:
- 依赖层级极深的CSS选择器,Google Maps的渲染结构本身不稳定,DOM层级稍有变动就会导致定位失败
- 默认状态下,地图上的信息窗口(
.gm-style-iw)是隐藏的,只有点击标记才会显示,直接等待它可见必然超时
具体修复步骤
1. 改用稳定的定位规则
抛弃冗长的层级路径,使用更简洁、不易失效的选择器,比如直接定位信息窗口内的标题:.gm-style-iw h5,但要先确保信息窗口被触发显示。
2. 先等待地图及标记加载完成
地图标记是动态渲染的,必须先完成基础加载:
- 先等待
#map_canvas容器存在,确认地图框架加载完成 - 再等待地图上的标记元素(Google Maps标记通常带有
.gm-marker类)加载完毕
3. 调整等待条件
如果不需要元素完全可见,仅需确认存在DOM中,用EC.presence_of_all_elements_located替代visibility_of_all_elements_located,降低等待门槛。
4. (推荐)直接抓取API接口数据
这类地图网站通常会通过XHR接口返回点位数据,比模拟页面操作高效且稳定。打开浏览器开发者工具(F12)的Network面板,刷新页面后筛选XHR请求,找到返回充电桩数据的接口,直接用requests请求即可,无需依赖Selenium。
修改后的代码示例
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 # Selenium 4.6+ 无需手动指定chromedriver路径,自动适配版本 options = webdriver.ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-logging']) driver = webdriver.Chrome(options=options) try: driver.get("https://www.g-charge.com.tr/Map.Aspx") # 等待地图容器加载完成 WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, 'map_canvas'))) # 等待地图标记加载(标记类可通过开发者工具确认) markers = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.gm-marker'))) # 点击第一个标记触发信息窗口显示(如需批量获取,可循环处理所有标记) if markers: markers[0].click() # 等待信息窗口内的标题元素加载 title_elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.gm-style-iw h5'))) print([elem.text for elem in title_elements]) finally: driver.quit()
额外提示
- 确保Selenium版本在4.6及以上,避免手动配置chromedriver带来的版本兼容问题
- 若循环点击多个标记,需处理元素失效(stale element)问题,可添加重试逻辑
内容的提问来源于stack exchange,提问作者Efe Değirmenci
相关产品推荐
相关产品推荐

