求助:用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()
关键修改说明
- 相对XPath定位:使用
.//开头的路径,确保在当前结果项内部查找评分(ZkP5Je类)和评论数(UY7F9类),适配谷歌地图的DOM结构变化 - 滚动加载优化:通过JavaScript直接滚动到最后一个元素,结合结果数量对比判断加载状态,逻辑更简洁可靠
- 异常处理:对评分、评论数的定位添加try-except捕获异常,避免单个元素定位失败导致程序崩溃
- 动态等待:用
WebDriverWait替代大部分硬编码sleep,仅保留短等待时间给页面加载新内容
内容的提问来源于stack exchange,提问作者bouchkira ilias
相关产品推荐
相关产品推荐

