如何通过Selenium滚动Google Maps评论面板实现全量评论抓取?
解决Google Maps评论面板滚动加载更多评论的问题
我之前也踩过Google Maps评论抓取的坑,普通的window.scrollBy()之所以对你没用,核心原因是Google Maps的评论列表是放在独立的滚动容器里的,不是整个页面的body在滚动,所以全局滚动根本触不到它的加载逻辑。
你后来找到的方向是对的,必须定位到评论容器元素,再对它执行滚动操作。我把你的方案整理优化了一下,让代码更清晰易读:
完整可运行的代码
from selenium import webdriver from bs4 import BeautifulSoup import pandas as pd import time # 配置Chrome驱动 PATH = "chromedriver.exe" options = webdriver.ChromeOptions() options.add_argument("--disable-gpu") options.add_argument('enable-logging') options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path=PATH) # 隐藏webdriver特征,规避反爬 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.execute_cdp_cmd('Network.setUserAgentOverride', { "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36' }) # 目标博物馆页面 url = 'https://www.google.com/maps/place/Mus%C3%A9e+Gr%C3%A9vin/@48.8718378,2.3400264,17z/data=!3m1!4b1!4m5!3m4!1s0x47e66e3e9be04a55:0x7def1a3ff98df458!8m2!3d48.8718157!4d2.3422113' driver.get(url) # 点击展开评论区域 driver.find_element_by_xpath('//*[@id="QA0Szd"]/div/div/div[1]/div[2]/div/div[1]/div/div/div[2]/div[1]/div[1]/div[2]/div/div[1]/span[1]/span/span/span[2]/span[1]/button').click() time.sleep(3) # 等待评论区域加载 SCROLL_PAUSE_TIME = 5 # 定位评论容器(核心:必须找到这个独立的滚动容器) review_container = driver.find_element_by_xpath('//*[@id="QA0Szd"]/div/div/div[1]/div[2]/div/div[1]/div/div/div[2]') last_height = driver.execute_script("return arguments[0].scrollHeight", review_container) # 循环滚动加载所有评论 while True: # 对评论容器执行滚动,一次性滚5000像素足够触发加载 driver.execute_script('arguments[0].scrollBy(0, 5000);', review_container) # 等待新评论加载完成 time.sleep(SCROLL_PAUSE_TIME) # 获取容器新的滚动高度 new_height = driver.execute_script("return arguments[0].scrollHeight", review_container) # 如果高度不再变化,说明没有更多评论了 if new_height == last_height: break last_height = new_height # 解析页面抓取所有评论 soup = BeautifulSoup(driver.page_source, 'html.parser') review_list = [] reviews = soup.find_all('span', class_='wiI7pd') for container in reviews: rev = container.text.strip() review_list.append(rev) # 保存到CSV文件 data = pd.DataFrame({'reviews': review_list}) data.to_csv("test_map.csv", sep=';', index=False, encoding='utf-8-sig') # 关闭浏览器 driver.quit()
几个关键注意点
- 锁定滚动容器:Google Maps的评论列表不是依附于页面body滚动的,而是在自己的
<div>容器里,所有滚动操作必须针对这个容器执行,这是解决问题的核心。 - 滚动高度判断终止循环:通过对比容器的
scrollHeight来判断是否加载完毕,当新旧高度一致时,说明没有更多评论可以加载了,避免无限循环。 - 反爬细节:你已经做了隐藏
webdriver和UA模拟,这部分很重要,可以降低被Google反爬机制拦截的概率。 - 等待时间调整:
SCROLL_PAUSE_TIME可以根据你的网络情况调整,如果网络好可以适当缩短,避免不必要的等待。
内容的提问来源于stack exchange,提问作者FalconBob
相关产品推荐
相关产品推荐

