使用Selenium-Python从谷歌地图提取数据:元素定位失败
谷歌地图搜索结果名称爬取方案修正
你的问题出在谷歌地图的DOM结构和类名是动态生成的,旧的section-result这类class已经不再使用,而且jstcache属性是谷歌内部动态生成的,每次加载都会变化,完全不可靠。另外你的代码还有一些过时写法,下面是修正后的完整方案:
修正后的代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = webdriver.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('--disable-extensions') driver_path = '/downloads/selenium/chromedriver.exe' # 替换过时的chrome_options参数为options driver = webdriver.Chrome(driver_path, options=options) driver.get('https://www.google.com/maps') # 显式等待同意cookie按钮出现,代替固定sleep wait = WebDriverWait(driver, 10) cookie_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[.//span[text()='Aceptar todo']]"))) cookie_btn.click() # 定位搜索框并执行搜索 search_box = wait.until(EC.visibility_of_element_located((By.NAME, 'q'))) search_box.send_keys('clinics cork') search_box.send_keys(Keys.RETURN) # 等待搜索结果加载完成 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[role='list'] div[role='listitem']"))) # 获取所有搜索结果条目,当前谷歌地图的结果条目用role="listitem"标识 results = driver.find_elements(By.CSS_SELECTOR, "div[role='list'] div[role='listitem']") for result in results: # 定位结果中的标题元素,当前用fontHeadlineSmall类标识标题 title_elem = result.find_element(By.CSS_SELECTOR, "div.fontHeadlineSmall") print(title_elem.text) driver.quit()
关键改动说明
- 替换过时参数:新版本Selenium中,初始化Chrome时应使用
options参数,而非chrome_options。 - 用显式等待替代
time.sleep:固定等待时间无法适配不同网络和页面加载速度,显式等待会在元素满足条件后再执行操作,稳定性更高。 - 更新元素定位选择器:
- 搜索结果条目用
div[role='list'] div[role='listitem']定位,这是语义化属性,比动态类名更可靠。 - 结果标题使用
div.fontHeadlineSmall,这是谷歌地图当前使用的标题样式类,比旧的section-result-title更准确。
- 搜索结果条目用
注意:谷歌地图的DOM结构可能会随时更新,如果后续再次失效,建议打开浏览器开发者工具(F12),手动查看当前元素结构并更新选择器。
内容的提问来源于stack exchange,提问作者Jaime Martinez
相关产品推荐
相关产品推荐

