使用Selenium从Google地图提取商家评分与评论数量的实战教程

使用selenium从google地图提取商家评分与评论数量的实战教程

本教程详细介绍了如何利用Python和Selenium库从Google地图抓取商家(如花园)的评分和评论数量。文章将涵盖Selenium环境配置、搜索查询、处理无限滚动加载以及最关键的动态网页元素定位策略,特别是针对Google地图中评分和评论等信息的正确XPath定位方法,以克服常见的抓取挑战,并提供完整的示例代码和实践建议。

1. 环境准备与Selenium基础配置

在开始之前,请确保您的Python环境中已安装Selenium库,并下载与您的Chrome浏览器版本兼容的ChromeDriver。

pip install selenium

然后,我们需要初始化WebDriver并配置一些基本选项,例如保持浏览器开启状态(detach=True)以便观察自动化过程,并设置显式等待(WebDriverWait)以提高脚本的健壮性。

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.support.ui import WebDriverWaitimport time# 配置Chrome选项,保持浏览器开启chrome_options = Options()chrome_options.add_experimental_option("detach", True)# 初始化WebDriverdriver = webdriver.Chrome(options=chrome_options)# 初始化ActionChains用于模拟用户操作,如滚动actionChains = ActionChains(driver)# 初始化WebDriverWait用于显式等待元素wait = WebDriverWait(driver, 20)

2. 导航与搜索操作

首先,我们需要导航到Google地图并执行搜索。为了确保页面加载完全,我们会在关键步骤后加入适当的延时或显式等待。

# 访问Google主页并接受cookie(如果出现)driver.get("https://www.google.com/")try:    # 尝试点击接受cookie按钮,可能因页面语言或版本不同而异    wait.until(EC.element_to_be_clickable((By.ID, "L2AGLb"))).click()except:    pass # 如果没有找到按钮或不需要点击,则跳过# 访问Google地图driver.get("https://www.google.com/maps")# 等待搜索框加载并输入查询time.sleep(3) # 简单等待,可以替换为更健壮的显式等待search_box = wait.until(EC.presence_of_element_located((By.ID, "searchboxinput")))search_box.send_keys("jardins in toulouse")search_box.send_keys(Keys.RETURN)# 等待搜索结果加载time.sleep(5) # 简单等待,可以替换为显式等待特定元素出现

3. 处理无限滚动加载

Google地图的搜索结果通常采用无限滚动加载机制。为了获取尽可能多的结果,我们需要模拟用户滚动操作,直到无法加载更多内容为止。这里采用了一种巧妙的策略:滚动到列表底部元素,然后通过模拟键盘向下箭头键来触发更多加载,并判断最后一个元素是否变化来决定是否停止。

# 定义一个辅助函数,用于等待元素位置稳定# 这对于处理动态加载或动画效果的元素非常有用,确保元素在操作前不再移动def wait_for_element_location_to_be_stable(element):    initial_location = element.location    previous_location = initial_location    start_time = time.time()    while time.time() - start_time < 1: # 在1秒内位置没有变化则认为稳定        current_location = element.location        if current_location != previous_location:            previous_location = current_location            start_time = time.time() # 位置变化,重置计时器        time.sleep(0.4) # 短暂等待,避免CPU空转# 定位搜索结果列表中的所有商家链接元素# 这些元素通常具有相同的class属性,如'hfpxzc'results = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@class='hfpxzc']")))break_condition = False# 定位一个可以接收键盘焦点的元素,通常是搜索框或某个输入框focus_element = driver.find_element(By.ID, 'searchboxinput') # 使用searchboxinput作为焦点元素while not break_condition:    # 记录当前列表的最后一个元素,用于判断是否加载了新内容    temp = results[-1]    # 滚动到当前列表的最后一个元素,确保其可见    actionChains.scroll_to_element(results[-1]).perform()    # 将焦点移到某个元素(如搜索框)并点击,确保后续的键盘操作生效    actionChains.move_to_element(focus_element).click().perform()    # 模拟按下几次向下箭头键,触发页面滚动和新内容加载    for i in range(3):        actionChains.send_keys(Keys.ARROW_DOWN).perform()        time.sleep(0.5) # 短暂等待,给页面加载时间    # 等待最后一个元素的位置稳定,确保页面渲染完成    wait_for_element_location_to_be_stable(temp)    # 重新获取所有商家链接元素,检查是否有新元素加载    results = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//a[@class='hfpxzc']")))    # 如果重新获取的列表的最后一个元素与之前的最后一个元素相同,    # 说明没有新的内容加载,可以停止滚动    if results[-1] == temp:        break_condition = True

4. 准确提取评分和评论数量

这是本教程的核心部分,也是原问题中遇到的主要挑战。最初的代码尝试使用绝对XPath来定位评分,但这种方法在动态网页中极易失效,因为它依赖于元素在DOM中的精确位置,而这个位置可能会随着页面加载或内容变化而改变。

正确的做法是使用相对XPath,并从当前结果元素的上下文(即每个商家链接元素)出发去查找其关联的评分和评论信息。通过分析Google地图的DOM结构,我们发现评分信息通常位于商家链接元素的父级容器中,并且具有特定的类名。

问题分析: 原始的`rating_xpath = “/

以上就是使用Selenium从Google地图提取商家评分与评论数量的实战教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1365020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用Selenium从Google Maps提取地点评分与评论数据教程
上一篇 2025年12月14日 04:22:32
Python元组、解包与打包的性能深度解析及栈实现对比
下一篇 2025年12月14日 04:22:43

相关推荐

  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    000
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • Python中怎样使用pymongo?

    在python中使用pymongo可以轻松地与mongodb数据库进行交互。1)安装pymongo:pip install pymongo。2)连接到mongodb:from pymongo import mongoclient; client = mongoclient(‘mongod…

    2026年5月10日
    000
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    000
  • 使用 Pydantic v2 实现条件性必填字段

    本文介绍了如何在 Pydantic v2 模型中实现条件性必填字段。通过自定义验证器,可以根据模型中其他字段的值来动态地控制某些字段是否为必填项,从而满足 API 交互中数据验证的复杂需求。本文提供了一个具体的示例,展示了如何确保模型中至少有一个字段被赋值。 在 Pydantic v2 中,虽然没有…

    2026年5月10日
    000
  • 三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    6 月 15 日消息,据博主@肥威 今日爆料,搭载骁龙 8 Gen 3 领先版%ign%ignore_a_1%re_a_1%的新机即将发布,把之前的 for Galaxy 改成“for Everybody”。 Pic Copilot AI时代的顶级电商设计师,轻松打造爆款产品图片 158 查看详情 …

    2026年5月10日 用户投稿
    000
  • 动态更新圆形进度条:JavaScript成绩计算器集成指南

    本文档旨在指导开发者如何将JavaScript成绩计算系统与动态圆形进度条集成,实现可视化展示平均成绩。我们将详细讲解如何修改现有的JavaScript代码,使其在计算出平均分后,能够动态更新圆形进度条的进度,从而提供更直观的用户体验。本文档包含详细的代码示例和注意事项,帮助开发者轻松实现这一功能。…

    2026年5月10日
    000
  • 如何讲html和css_讲解HTML与CSS结合使用基础【基础】

    需将HTML与CSS结合使用以实现网页结构与样式的分离:HTML定义标题、段落等语义结构,CSS控制颜色、字体等外观;可通过内联样式、内部样式表或外部CSS文件引入样式,并利用类选择器和ID选择器精准应用。 如果您希望网页不仅展示内容,还能具备基本的样式和结构布局,则需要将HTML与CSS结合使用。…

    2026年5月10日
    000
  • Go语言网络编程入门:构建TCP客户端/服务器

    本文旨在为Go语言初学者提供一份简洁明了的网络编程入门指南,重点介绍如何使用TCP套接字构建简单的客户端/服务器应用。通过示例代码和注意事项,帮助读者快速上手Go语言的网络编程,并了解一些最佳实践。 Go语言对网络编程提供了强大的支持,通过标准库net包,可以轻松实现各种网络应用。本文将重点介绍如何…

    2026年5月10日
    000
  • CSS伪元素与固定背景:移动友好的实现策略

    本文深入探讨了如何利用CSS的::before伪元素、position: fixed和z-index属性,创建一种在移动设备上表现更稳定的全屏固定背景效果,以替代传统background-attachment: fixed可能存在的兼容性问题。教程将详细解析这些核心CSS概念及其在构建响应式布局中的…

    2026年5月10日
    000
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000
  • Go语言接口与切片:如何识别和操作[]interface{}

    本文将深入探讨Go语言中如何识别和操作`[]interface{}`类型的切片。我们将介绍类型断言(Type Assertion)的关键作用,并通过`switch`语句演示如何安全地检测`[]interface{}`类型,并进而遍历其内部元素。文章旨在提供清晰的示例代码和专业指导,帮助开发者有效地处…

    2026年5月10日
    000
  • 如何在Golang中声明指针变量 使用&和*操作符示例

    答案是:Go中指针通过&取地址和解引用操作实现对变量地址的访问与值的修改,声明格式为Type,初始值为nil,常用于函数传参和内存优化。 在Golang中,指针变量用于存储另一个变量的内存地址。通过使用 & 和 * 操作符,可以获取变量地址和访问指针指向的值。下面详细介绍如何声明指针…

    2026年5月10日
    000
  • Python 函数参数类型:如何使用可变参数和动态参数?

    python 中的参数类型:关键词参数、可变参数和动态参数 在 python 中,函数的参数可以分为以下几种类型: 关键词参数(kw)**:这些参数具有名称,并且在调用函数时明确指定。可变参数(*args):这些参数没有名称,允许函数接受任意数量的位置参数。它们将被收集到一个元组中。动态参数(kwa…

    2026年5月10日
    000
  • 高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行

    高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行

    【环球网科技综合报道】10月17日消息,高通今日对 2023 骁龙峰会进行了预热,本次大会将以 %ign%ignore_a_1%re_a_1% 为主题,届时骁龙 8 gen 3 处理器也很大可能在本届峰会亮相。 在临近活动召开之日,相关业内人士也透露了高通骁龙8Gen3跑分及规格。据悉,高通骁龙8 …

    2026年5月10日 用户投稿
    000
  • 使用 Ajax 和 FormData 实现文件上传及文本数据提交的完整教程

    本文旨在解决在使用 Ajax 和 FormData 进行文件上传时,遇到的 $_POST 和 $_FILES 为空的问题。通过详细的代码示例和解释,我们将展示如何正确地构建 FormData 对象,并通过 Ajax 将文件和文本数据发送到服务器端,同时避免常见的错误配置,确保数据能够成功地被 PHP…

    2026年5月10日
    000
  • JavaScript 高效判断页面所有复选框状态的技巧与实践

    本文旨在提供一套高效且专业的javascript方法,用于判断网页中所有复选框的选中状态。我们将探讨如何利用`array.some()`快速确定是否有未选中的复选框(进而判断是否全部选中),以及如何使用`array.filter()`统计选中和未选中的复选框数量。通过优化dom元素选择和数组操作,提…

    2026年5月10日
    000
  • HTML表单如何实现PWA支持?怎样添加离线功能?

    答案是利用Service Worker缓存资源并结合Background Sync API实现离线提交与自动同步。通过注册Service Worker缓存表单相关文件,拦截提交行为,将离线数据存入IndexedDB,并注册后台同步任务,待网络恢复后由Service Worker自动发送数据,确保提交…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信