如何让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
相关产品推荐
相关产品推荐

