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

求助:用Selenium提取谷歌地图图卢兹花园的评分与评论数

修复Selenium提取谷歌地图花园评分与评论数的问题

原代码无法获取目标信息的核心问题在于绝对XPath不稳定、滚动加载逻辑冗余,以及未正确定位结果项内的评分/评论元素。以下是具体修复方案:

问题分析与修复要点

  • 替换绝对XPath为相对路径:谷歌地图DOM结构频繁变动,绝对路径极易失效,改用基于结果项的相对XPath可避免定位失败
  • 简化滚动加载逻辑:直接滚动到最后一个结果元素,通过结果数量变化判断是否加载完成,无需复杂的焦点切换操作
  • 新增评论数提取:补充评论数元素的定位逻辑,覆盖无评分/评论的异常情况
  • 用动态等待替代硬编码sleep:提升代码稳定性,减少不必要的等待时间

修正后的代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import time

chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

driver = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(driver, 20)

# 处理谷歌首页同意按钮
driver.get("https://www.google.com/")
try:
    wait.until(EC.element_to_be_clickable((By.ID, "L2AGLb"))).click()
except:
    pass  # 无同意按钮时跳过

driver.get("https://www.google.com/maps")

# 等待搜索框加载并输入查询
search_box = wait.until(EC.element_to_be_clickable((By.ID, "searchboxinput")))
search_box.send_keys("jardins in toulouse")
search_box.send_keys(Keys.RETURN)

# 等待初始搜索结果加载
wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@class='hfpxzc']")))

# 滚动加载更多结果,直到获取至少100条或到达页面底部
results = driver.find_elements(By.XPATH, "//a[@class='hfpxzc']")
while len(results) < 100:
    last_result = results[-1]
    # 滚动到最后一个元素触发加载
    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", last_result)
    time.sleep(2)
    # 重新获取结果列表
    new_results = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@class='hfpxzc']")))
    # 结果数量不再变化则停止加载
    if len(new_results) == len(results):
        break
    results = new_results

# 提取前100条结果的名称、评分和评论数
for i, result in enumerate(results[:100], start=1):
    name = result.get_attribute('aria-label')
    # 相对路径定位评分元素
    try:
        rating = result.find_element(By.XPATH, ".//div[@class='ZkP5Je']").text
    except:
        rating = "无评分"
    
    # 相对路径定位评论数元素
    try:
        review_count = result.find_element(By.XPATH, ".//span[@class='UY7F9']").text
    except:
        review_count = "无评论"
    
    print(f"第{i}条: {name} - 评分: {rating} - 评论数: {review_count}")

driver.quit()

关键修改说明

  1. 相对XPath定位:使用.//开头的路径,确保在当前结果项内部查找评分(ZkP5Je类)和评论数(UY7F9类),适配谷歌地图的DOM结构变化
  2. 滚动加载优化:通过JavaScript直接滚动到最后一个元素,结合结果数量对比判断加载状态,逻辑更简洁可靠
  3. 异常处理:对评分、评论数的定位添加try-except捕获异常,避免单个元素定位失败导致程序崩溃
  4. 动态等待:用WebDriverWait替代大部分硬编码sleep,仅保留短等待时间给页面加载新内容

内容的提问来源于stack exchange,提问作者bouchkira ilias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:14:59