使用R爬取网页时遇length(url)==1 is not TRUE错误求助
解决方案
错误根源
报错核心原因是你把URL存储在列表中,而remDrv$navigate()要求传入单个字符串。循环时每个url是列表的一个元素(类型为列表),不是纯字符串,导致函数判断length(url)不等于1,触发错误。另外原代码生成URL的方式冗余,还缺少页面加载等待逻辑,容易出现找不到下载按钮的问题。
修复后的代码
library(RSelenium) download_senamhi_data <- function(url_vec) { # 生成随机端口 port <- as.integer(runif(1, min = 5000, max = 6000)) # 启动Chrome驱动,注意chromever要匹配本地Chrome版本 # 若不确定版本,可尝试chromever = NULL自动匹配 rD <- rsDriver(port = port, browser = "chrome", chromever = "101.0.4951.15") remDrv <- rD$client # 配置自动下载路径(避免弹窗,可选) download_dir <- file.path(getwd(), "senamhi_downloads") dir.create(download_dir, showWarnings = FALSE) chrome_prefs <- list( chromeOptions = list( prefs = list( "download.default_directory" = download_dir, "download.prompt_for_download" = FALSE, "download.directory_upgrade" = TRUE ) ) ) remDrv$setTimeout(type = "page load", milliseconds = 10000) for (url in url_vec) { # 访问目标URL remDrv$navigate(url) # 等待页面加载完成(避免未渲染就查找元素) Sys.sleep(2) # 查找并点击下载按钮 down_btn <- remDrv$findElement(using = "id", value = "export2") down_btn$clickElement() # 等待下载完成 Sys.sleep(3) } # 清理会话 remDrv$close() rD$server$stop() rm(rD, remDrv) gc() } # 生成2021年1-12月的URL向量(用sprintf简化生成逻辑) list_url <- sprintf( "https://www.senamhi.gob.pe/mapas/mapa-estaciones-2/_dato_esta_tipo02.php?estaciones=109045&CBOfiltro=2021%02d&t_e=M&estado=DIFERIDO&cod_old=154107&cate_esta=PLU&alt=2266", 1:12 ) # 执行下载 download_senamhi_data(list_url)
关键修复点
- URL存储改为字符向量:用
sprintf一次性生成所有月份的URL,既简洁又避免列表类型错误。 - 添加等待逻辑:页面和元素需要时间渲染,用
Sys.sleep()防止找不到下载按钮;也可以用更智能的等待函数(如waiter包的wait_for)。 - 可选配置下载路径:自动指定文件夹保存下载文件,避免浏览器弹窗干扰。
- 匹配ChromeDriver版本:确保
chromever参数与本地Chrome版本一致,否则驱动无法启动;不确定版本时可设为NULL尝试自动匹配。
内容的提问来源于stack exchange,提问作者César Carvallo
相关产品推荐
相关产品推荐

