新闻中心
使用Selenium抓取Google地图完整评论:解决“更多”内容展开问题

本教程旨在解决使用selenium从google地图抓取评论时,因“更多”按钮导致评论内容不完整的问题。文章将详细指导如何通过selenium模拟用户行为,包括处理cookie弹窗、导航至评论区、滚动页面加载所有评论,以及动态点击每个评论中的“更多”按钮以展开完整文本,最终高效地提取所有评论数据。
引言:动态内容抓取的挑战
在进行网页数据抓取时,动态加载的内容常常是初学者面临的挑战。Google地图的评论页面就是一个典型例子:评论内容不仅通过滚动加载,而且长篇评论还会被截断,显示一个“更多”按钮。如果不点击这些“更多”按钮,我们只能获取到部分评论文本。本教程将介绍如何使用Selenium这一强大的自动化测试工具,模拟用户交互,克服这些障碍,从而抓取到完整的Google地图评论数据。
Selenium环境准备
首先,确保您的Python环境中已安装Selenium库和Chrome浏览器驱动。推荐使用webdriver-manager来自动管理驱动。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
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, StaleElementReferenceException
from selenium.webdriver.common.keys import Keys
import time
# 定义目标URL
# 请根据实际需要替换为您的Google地图商家评论页URL
TARGET_URL = 'https://www.google.com/maps/place/Henn+na+Hotel+Tokyo+Asakusa+Tawaramachi/@35.7081692,139.7888494,17z/data=!4m22!1m12!3m11!1s0x60188f36ab21f05b:0x9241dab287ff62c9!2sHenn+na+Hotel+Tokyo+Asakusa+Tawaramachi!5m2!4m1!1i2!8m2!3d35.7081692!4d139.7914243!9m1!1b1!16s%2Fg%2F11h0gzlhht!3m8!1s0x60188f36ab21f05b:0x9241dab287ff62c9!5m2!4m1!1i2!8m2!3d35.7081692!4d139.7914243!16s%2Fg%2F11h0gzlhht?entry=ttu'
# 配置Chrome选项
options = Options()
options.add_argument('--no-sandbox') # 禁用沙盒模式,在某些Linux环境下可能需要
options.add_argument('--disable-dev-shm-usage') # 禁用/dev/shm使用,在某些Docker/Linux环境下可能需要
# options.add_argument('--headless') # 启用无头模式,不显示浏览器界面,适合服务器环境
# 初始化WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
driver.get(TARGET_URL)
# 等待页面加载完成,例如等待H1标题出现
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'h1')))
print("页面H1标题已加载。")
except TimeoutException:
print("页面H1标题未在指定时间内加载。")
步骤一:处理Cookie同意弹窗
许多网站在首次访问时会显示Cookie同意弹窗。我们需要模拟点击“接受”按钮以继续。
def accept_cookie_policy():
"""尝试点击Cookie政策接受按钮"""
try:
# 查找所有按钮,并根据文本内容判断是否为“Accept all”
buttons = driver.find_elements(By.TAG_NAME, 'button')
for button in buttons:
if button.text == "Accept all":
print("找到并点击 'Accept all' Cookie按钮。")
button.click()
time.sleep(2) # 等待弹窗消失
return
except (TimeoutException, NoSuchElementException):
print("Cookie政策按钮未找到或无法点击。")
accept_cookie_policy()步骤二:导航至评论区
在某些Google地图页面布局中,评论可能不是默认显示的,需要点击“评论”标签页。
简小派
简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。
123
查看详情
# 查找并点击“评论”按钮
try:
all_buttons = driver.find_elements(By.TAG_NAME, 'button')
for button in all_buttons:
if button.text == 'Reviews': # 根据页面语言,可能是“评论”
print("找到并点击 'Reviews' 按钮。")
button.click()
time.sleep(3) # 等待评论区加载
break
except NoSuchElementException:
print("未找到 'Reviews' 按钮。")步骤三:滚动加载所有评论容器
Google地图的评论是动态加载的,只有滚动到页面底部,新的评论才会显示。我们需要找到评论区的滚动条,并模拟持续滚动直到所有评论加载完毕。
# 找到评论区的可滚动面板
# 经验证,该XPath通常指向包含评论的滚动容器
SCROLLABLE_REVIEWS_PANEL_XPATH = "//div[contains(@class, 'm6QErb') and contains(@class, 'DxyBCb') and contains(@class, 'kA9KIf') and contains(@class, 'dS8AEf')]"
try:
scrollable_reviews_panel = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, SCROLLABLE_REVIEWS_PANEL_XPATH))
)
print("找到评论滚动面板。")
except TimeoutException:
print("未在指定时间内找到评论滚动面板。请检查XPath。")
driver.quit()
exit()
last_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_reviews_panel)
print("开始滚动加载所有评论...")
while True:
# 滚动到评论面板的底部
driver.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight);", scrollable_reviews_panel)
time.sleep(2) # 等待新评论加载
new_height = driver.execute_script("return arguments[0].scrollHeight", scrollable_reviews_panel)
if new_height == last_height:
# 如果滚动高度不再变化,说明已加载所有评论
print("所有评论已加载。")
break
last_height = new_height步骤四:展开所有“更多”评论内容
一旦所有评论容器加载完毕,下一步就是遍历每个评论,查找并点击其中的“更多”按钮,以显示完整的评论文本。
# 展开所有“更多”按钮
print("开始展开所有 '更多' 评论...")
# 'jftiEf' 通常是单个评论卡片的类名
review_containers = driver.find_elements(By.CLASS_NAME, 'jftiEf')
for i, container in enumerate(review_containers):
try:
# 'w8nwRe' 通常是“更多”按钮的类名
more_button = container.find_element(By.CLASS_NAME, "w8nwRe")
if more_button.text == "More": # 确保是“More”按钮
more_button.click()
time.sleep(0.5) # 短暂延迟,等待评论展开
# print(f"已展开第 {i+1} 条评论的 '更多' 内容。")
except NoSuchElementException:
# 当前评论没有“更多”按钮,跳过
pass
except StaleElementReferenceException:以上就是使用Selenium抓取Google地图完整评论:解决“更多”内容展开问题的详细内容,更多请关注其它相关文章!
# 未找到
# 毕节网站建设必看
# seo网站图片优化工具
# 消防门户怎么优化网站
# 网站推广软件预期效果
# 智能化网站建设资源
# 泉山区推广网站报价公示
# 西青区网络营销和推广公司
# 个人建设网站app小学
# 知乎营销推广帝豪
# 射阳网站优化推广
# 遍历
# 还会
# 才会
# 首次
# 这一
# linux
# 在某些
# 时间内
# 您的
# 加载
# webdriver
# google
# ai
# mac
# 工具
# 浏览器
# cookie
# docker
# go
# python
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
狙击外星人小游戏开始_狙击外星人小游戏立即开始
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
zookeeper 都有哪些功能?
字由网在线版登录地址 字由网网页版安全入口
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
深入理解J*a编译器的兼容性选项:从-source到--release
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
mc.js官网登录入口 mc.js官方登录入口最新版
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
c++20的std::jthread是什么_c++可中断线程与RAII式管理
谷歌google账号怎么注册账号 谷歌账号注册官方流程
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
Eclipse怎么运行工程_Eclipse工程运行配置说明
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
马斯克:Optimus 人形机器人复数形式为 Optimi
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
LINUX怎么设置定时任务_LINUX crontab配置教程
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
解决深度学习模型训练初期异常高损失与完美验证准确率问题
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
生成rdflib自定义SPARQL函数:参数匹配与实践指南
BetterDiscord插件中安全更新用户简介的实践指南
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
Python类型检查:优化关联可选属性的Mypy推断策略
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
python3时间如何用calendar输出?
Mac怎么使用表情符号_Mac Emoji快捷键面板
微博网页版官方账号登录 微博网页版内容浏览使用指南
Kafka Streams中基于消息头条件过滤消息的实现指南
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
服务端验证_j*ascript输入检查
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
新三国志曹操传110级星符试炼夏侯渊极难攻略
React Router v6 教程:构建认证保护的私有路由与重定向策略


2025-12-06
浏览次数:次
返回列表