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

如何让R/Python的Selenium脚本等待页面加载后再执行操作

R 解决方案

使用Selenium的显式等待替代Sys.sleep(),确保页面元素加载完成后再执行操作,避免脚本冻结。

核心步骤

  • 初始化浏览器并导航到谷歌地图指定坐标的披萨店搜索页
  • 显式等待搜索结果列表加载完成
  • 循环滚动加载所有结果,每次滚动后等待新内容加载
  • 提取名称和地址

示例代码

library(RSelenium)
library(wdman)

# 启动Chrome浏览器驱动
driver <- rsDriver(browser = "chrome", port = 4567L, chromever = "latest")
remDr <- driver$client

# 导航到目标坐标的披萨店搜索(替换为你的目标经纬度)
target_url <- "https://www.google.com/maps/search/pizza/@37.7749,-122.4194,15z"
remDr$navigate(target_url)

# 自定义显式等待函数:等待元素加载完成
wait_for_element <- function(remDr, css_selector, timeout = 15) {
  end_time <- Sys.time() + timeout
  while(Sys.time() < end_time) {
    elements <- tryCatch(remDr$findElements(using = "css", value = css_selector), error = function(e) NULL)
    if(length(elements) > 0) {
      return(elements)
    }
    Sys.sleep(0.3)
  }
  stop("超时:目标元素未加载")
}

# 等待结果列表容器出现
wait_for_element(remDr, ".m6QErb.DxyBCb.kA9KIf.dS8AEf")

# 滚动加载全部结果
result_container <- remDr$findElement(using = "css", value = ".m6QErb.DxyBCb.kA9KIf.dS8AEf")
last_height <- remDr$executeScript("return arguments[0].scrollHeight;", list(result_container))
while(TRUE) {
  # 滚动到容器底部
  remDr$executeScript("arguments[0].scrollTop = arguments[0].scrollHeight;", list(result_container))
  # 等待新内容加载
  Sys.sleep(0.5)
  new_height <- remDr$executeScript("return arguments[0].scrollHeight;", list(result_container))
  if(new_height == last_height) {
    break
  }
  last_height <- new_height
}

# 提取名称和地址
result_elements <- remDr$findElements(using = "css", value = ".hfpxzc")
pizza_shops <- lapply(result_elements, function(el) {
  name <- el$findElement(using = "css", value = ".qBF1Pd.fontHeadlineSmall")$getElementText()[[1]]
  address <- el$findElement(using = "css", value = ".W4Efsd:nth-child(2) .W4Efsd span:last-child")$getElementText()[[1]]
  list(name = name, address = address)
})

# 转换为数据框并打印
pizza_df <- do.call(rbind, lapply(pizza_shops, as.data.frame))
print(pizza_df)

# 关闭浏览器
remDr$close()
driver$server$stop()

关键说明

  • 自定义wait_for_element函数循环检查元素状态,超时前不会暂停执行
  • 通过对比滚动容器的高度变化,判断是否已加载全部结果
  • CSS选择器需根据谷歌地图页面更新调整,若元素定位失效需同步修改

Python 解决方案

Python的Selenium提供了WebDriverWait和expected_conditions模块,可更便捷实现精准的显式等待,稳定性更高。

核心步骤

  • 初始化Chrome浏览器并导航到目标搜索页
  • 用WebDriverWait等待结果列表加载完成
  • 循环滚动加载所有结果,通过高度变化判断加载状态
  • 提取并整理名称和地址数据

示例代码

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
import time

# 初始化浏览器
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)

# 导航到目标坐标的披萨店搜索(替换为你的目标经纬度)
target_url = "https://www.google.com/maps/search/pizza/@37.7749,-122.4194,15z"
driver.get(target_url)

# 显式等待结果容器加载(最长等待15秒)
wait = WebDriverWait(driver, 15)
result_container = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".m6QErb.DxyBCb.kA9KIf.dS8AEf")))

# 滚动加载全部结果
last_height = driver.execute_script("return arguments[0].scrollHeight;", result_container)
while True:
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", result_container)
    time.sleep(0.5)
    new_height = driver.execute_script("return arguments[0].scrollHeight;", result_container)
    if new_height == last_height:
        break
    last_height = new_height

# 提取所有结果元素
result_elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".hfpxzc")))

# 整理名称和地址
pizza_shops = []
for el in result_elements:
    name = el.find_element(By.CSS_SELECTOR, ".qBF1Pd.fontHeadlineSmall").text
    address = el.find_element(By.CSS_SELECTOR, ".W4Efsd:nth-child(2) .W4Efsd span:last-child").text
    pizza_shops.append({"名称": name, "地址": address})

# 打印结果
for shop in pizza_shops:
    print(f"{shop['名称']} | {shop['地址']}")

# 关闭浏览器
driver.quit()

关键说明

  • WebDriverWait结合expected_conditions可实现多种等待逻辑(元素存在、可见等)
  • 滚动高度对比机制确保不会遗漏未加载的结果
  • 若谷歌地图页面结构更新,需同步调整CSS选择器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:07:14