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

Python+Selenium爬取Google Maps遇结果重复、无法滚动加载及翻页问题求助

Google Maps商户爬取问题修复方案

问题1:商户名称重复修复

核心原因

  • 你当前定位的widget-pane-content-holder是整个搜索结果侧边栏的全局唯一容器,entries列表本质上只有1个元素,并非单个商户条目
  • 提取名称的Xpath使用了全局匹配符//,无论基于哪个父元素查询,都会返回整个文档第一个匹配的节点,导致每次循环拿到的都是同一个商户名,重复次数和当前页条目数完全一致

修复逻辑

  • 先定位单个商户条目对应的节点,Google Maps搜索结果的单个商户条目通用类名为Nv2PK
  • 提取子元素的Xpath要使用相对路径,开头加.,表示基于当前条目节点向下匹配

问题2:自动滚动加载+自动翻页修复

实现逻辑

  • Google Maps结果为懒加载模式,需要滚动侧边结果面板(不是浏览器主窗口)触发加载,直到滚动前后条目数量不再变化,说明当前页所有条目加载完成
  • 翻页需要检测底部「下一页」按钮状态,按钮可点击时触发点击,等待新页加载完成后重复滚动+提取流程,直到按钮置灰不可点击为止

完整修复代码

import time
import openpyxl
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
from selenium.common.exceptions import TimeoutException, NoSuchElementException

# 初始化驱动,你原有的Chrome配置保持不变即可
driver = webdriver.Chrome()
driver.get("替换为你的Google Maps搜索链接")
time.sleep(3)

# 准备Excel文件
path = r'E:\excel\companies.xlsx'
wb = openpyxl.load_workbook(path)
sheet = wb.worksheets[0]

# 定位结果滚动容器
scroll_container = driver.find_element(By.CSS_SELECTOR, 'div[role="main"] div.m6QErb.DxyBCb.kA9KIf.dS8AEf')

def scroll_to_load_all():
    """滚动加载当前页所有条目"""
    last_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container)
    while True:
        # 滚动到容器底部
        driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container)
        time.sleep(2)
        new_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container)
        # 滚动后高度无变化说明当前页已加载完成
        if new_height == last_height:
            break
        last_height = new_height

# 循环翻页提取所有结果
while True:
    # 先加载当前页全部条目
    scroll_to_load_all()
    # 获取当前页所有商户条目
    entries = driver.find_elements(By.CLASS_NAME, 'Nv2PK')
    for entry in entries:
        try:
            # 相对路径提取名称,可根据你的页面实际结构调整Xpath
            name = entry.find_element(By.XPATH, './/div[contains(@class,"qBF1Pd")]').text
            print(name)
            sheet.append([name])
        except (IndexError, NoSuchElementException):
            continue
    # 尝试点击下一页
    try:
        next_btn = WebDriverWait(driver, 3).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[aria-label="下一页"]'))
        )
        next_btn.click()
        time.sleep(3)
    except TimeoutException:
        # 下一页按钮不可点击,说明已经到最后一页
        break

# 保存Excel并关闭驱动
wb.save(path)
driver.quit()

页面参考截图

单条搜索结果展示
全部区域展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:57:04