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

使用Python+Selenium爬取谷歌地图时出现元素找不到的问题求助

使用Python+Selenium爬取谷歌地图时出现元素找不到的问题求助

兄弟,我之前踩过谷歌地图DOM结构频繁更新的大坑,你的脚本现在找不到元素,大概率是这两个核心问题:谷歌地图的搜索框类名已经更新了,或者你用的绝对XPath太脆弱,页面层级一变化就失效。给你几个落地的解决方案:

1. 替换过时的搜索框定位方式

你之前用的tactile-searchbox-input这个类名,谷歌地图早就换掉了。现在可以用更稳定的属性定位,比如通过aria-label或者placeholder来定位搜索框,这两个属性一般不会轻易改动:

# 用CSS选择器定位搜索框(优先推荐)
Place = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-label='搜索 Google 地图']")))
# 或者用placeholder定位(如果aria-label也变了的话)
# Place = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[placeholder='搜索地点']")))

2. 彻底抛弃绝对XPath,改用相对定位

你代码里的绝对XPath比如/html/body/div[1]/div[3]/div[8]/div[3]/div[1]/div[1]/div/div[2]/div[1]/button,完全依赖页面层级,谷歌地图只要调整一下界面布局,这条路径就直接失效。改成基于元素属性或文本的相对XPath才是长久之计:
比如提交搜索的按钮,改成:

submit = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='搜索']")))

路线按钮可以改成:

directions_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label, '路线')]")))

3. 用显式等待替代硬编码的sleep

你现在用了一堆sleep(5)、sleep(20),不仅浪费时间,还容易因为网络波动或页面加载慢导致元素没出来就去查找。换成WebDriverWait的显式等待,等待元素可点击/可见后再操作,稳定性提升N倍:

# 全局定义等待对象
wait = WebDriverWait(driver, 20)  # 最多等20秒

def searchplace():
    # 等待搜索框可点击
    Place = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-label='搜索 Google 地图']")))
    Place.clear()
    Place.send_keys("33.983515, 71.447372")
    # 等待提交按钮可点击
    submit = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='搜索']")))
    submit.click()

4. 检查无头模式的适配问题

谷歌地图可能会对无头模式做检测,或者无头模式下的页面布局和正常模式不同。你可以先临时去掉--headless参数,在可视化模式下打开地图,用F12查看当前搜索框、按钮的真实定位属性,再调整代码。另外给无头模式加个窗口大小参数,避免元素因为窗口太小被隐藏:

chrome_options.add_argument('--window-size=1920,1080')  # 模拟桌面窗口大小

最后给你修改后的核心函数示例

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 全局定义等待对象
wait = WebDriverWait(driver, 20)

def searchplace():
    # 定位搜索框
    Place = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-label='搜索 Google 地图']")))
    Place.clear()
    Place.send_keys("33.983515, 71.447372")
    # 点击搜索提交
    submit = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='搜索']")))
    submit.click()

def directions():
    # 定位路线按钮
    directions_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label, '路线')]")))
    directions_btn.click()

def Start_Point():
    # 定位起点输入框
    starting_loc = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-label='起点']")))
    starting_loc.clear()
    starting_loc.send_keys("33.99891877029553, 71.40166320892853")
    # 点击搜索起点
    search_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='搜索']")))
    search_btn.click()

def Print_info():
    # 定位距离和时间的元素(用相对XPath)
    distance = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@aria-label and contains(@aria-label, '公里')]")))
    travel_time = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@aria-label and contains(@aria-label, '分钟')]")))
    return distance.text, travel_time.text

按照这个改完,应该就能解决找不到元素的问题了,谷歌地图的DOM经常变,以后遇到类似问题,先开可视化模式看当前元素的属性,再调整定位方式就好。

备注:内容来源于stack exchange,提问作者Mubashir Sheheryar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:28:07