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

如何用Selenium和Python点击网页非按钮元素并解决谷歌地图滚动问题

谷歌地图搜索结果局部滚动区域自动滚动实现

问题场景

爬取谷歌地图搜索结果时,结果展示在带独立滚动条的局部区域,而非页面整体。需要先激活该区域,才能通过按键实现自动滚动加载更多内容。

原代码问题分析

  • 目标点击元素的CSS选择器错误,无法正确激活滚动区域
  • 直接对body发送滚动按键,无法作用于局部滚动容器

修正后的实现代码

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.webdriver.common.keys import Keys
import time

def search_industry_and_scroll(driver, industry):
    driver.get('https://www.google.com/maps')
    # 等待搜索框加载并输入关键词
    search_input = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, 'searchboxinput'))
    )
    search_input.send_keys(industry)
    search_input.send_keys(Keys.RETURN)
    
    # 等待搜索结果区域加载完成
    results_container = WebDriverWait(driver, 15).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div.m6QErb.DxyBCb.kA9KIf.dS8AEf'))
    )
    
    # 点击结果区域激活滚动焦点
    results_container.click()
    
    # 循环滚动加载更多内容
    scroll_count = 0
    max_scrolls = 10  # 可根据需求调整最大滚动次数,避免无限循环
    while scroll_count < max_scrolls:
        # 对结果容器发送PAGE_DOWN按键
        results_container.send_keys(Keys.PAGE_DOWN)
        time.sleep(2)  # 等待新内容加载
        scroll_count += 1

# 使用示例
if __name__ == "__main__":
    driver = webdriver.Chrome()
    try:
        search_industry_and_scroll(driver, "咖啡馆")
    finally:
        driver.quit()

关键优化点

  • 正确定位滚动容器:使用div.m6QErb.DxyBCb.kA9KIf.dS8AEf作为结果滚动容器的选择器(谷歌地图的元素类名可能会更新,若失效可通过开发者工具重新定位)
  • 激活滚动区域:点击容器获取焦点,确保后续滚动按键作用于目标区域
  • 避免无限循环:添加最大滚动次数限制,防止程序一直运行
  • 针对容器滚动:直接向结果容器发送滚动按键,而非页面body,确保滚动行为作用于局部区域

备选方案(JavaScript滚动)

如果按键滚动不稳定,可改用JavaScript直接操作滚动条,兼容性更好:

# 替换原滚动循环部分
scroll_count = 0
max_scrolls = 10
last_height = driver.execute_script("return arguments[0].scrollHeight", results_container)
while scroll_count < max_scrolls:
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", results_container)
    time.sleep(2)
    new_height = driver.execute_script("return arguments[0].scrollHeight", results_container)
    if new_height == last_height:
        break  # 高度不变说明没有新内容加载
    last_height = new_height
    scroll_count += 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:00