URL不变化网站的网页爬虫问题:新手采集cdms.net农药信息遇RSelenium网格点击困难
针对SPA站点无URL变化的RSelenium爬取落地步骤
核心逻辑说明
目标站点为典型JS单页应用,所有交互不会触发URL跳转,RSelenium本身是模拟真实浏览器操作的工具,无需依赖URL变化即可完成元素定位、点击、数据提取全流程,完全不需要额外追踪URL变化。
第一步:初始化页面加载等待逻辑
现有初始代码缺少动态页面的渲染等待逻辑,直接定位元素大概率会报“元素不存在”的错误,可在导航到目标地址后补全等待逻辑:
library(RSelenium) library(rvest) library(tidyverse) rD <- rsDriver(browser="firefox", port=4547L, verbose=F) remDr <- rD[["client"]] # 设置页面加载超时时间 remDr$setTimeout(type = "page load", milliseconds = 15000) remDr$navigate("http://www.cdms.net/Label-Database") # 轮询等待ag-grid核心网格容器渲染完成(该站点使用ag-grid组件库承载所有列表数据) wait_count <- 0 while(wait_count < 20){ grid_container <- tryCatch({ remDr$findElement(using = "css selector", value = ".ag-root.ag-layout-normal") }, error = function(e) NULL) if(!is.null(grid_container)) break Sys.sleep(1) wait_count <- wait_count + 1 }
第二步:无URL跳转下的元素点击实现
针对信息网格的交互操作,直接通过稳定的CSS选择器定位网格内元素即可,完全无需关心URL变化:
# 定位当前网格中所有农药名称对应的单元格(对应列的col-id为组件固定属性) product_cells <- remDr$findElements( using = "css selector", value = ".ag-row .ag-cell[col-id='productName']" ) # 触发第一行单元格的点击,异步加载对应详情面板,全程URL保持不变 product_cells[[1]]$clickElement() # 等待详情面板渲染 Sys.sleep(2) # 提取详情中的活性成分文本 active_ing_ele <- remDr$findElement( using = "css selector", value = "#active-ingredient-section" ) active_ing_text <- active_ing_ele$getElementText()[[1]]
如果点击时遇到“元素被遮挡、不在可视区域”的报错,可先通过JS将元素滚动到可视区域再触发点击:
remDr$executeScript( script = "arguments[0].scrollIntoView({block: 'center'});", args = list(product_cells[[1]]) ) product_cells[[1]]$clickElement()
第三步:批量爬取的循环设计
全量采集流程无需切换URL,在同一标签页下即可完成:
- 每一页网格渲染完成后,遍历当前页所有
.ag-row行元素,逐行定位农药名称单元格,点击进入详情后提取活性成分信息,存入本地数据框 - 单页数据提取完成后,定位网格自带的“下一页”按钮,触发点击
- 等待网格重新渲染出新的行元素后,重复上述提取流程,直到下一页按钮不可用为止
避坑提示
- 不要直接用
rvest::read_html()爬取该站点的静态HTML,所有列表、详情数据均为JS异步加载,静态源码中不存在有效内容,所有数据提取需基于RSelenium渲染后的DOM元素完成 - 定位元素优先使用带固定属性的CSS选择器,不要使用绝对路径的XPath,ag-grid组件的DOM结构会随翻页动态变化,类名、col-id属性为稳定标识
- 若遇到页面加载慢的情况,可适当延长轮询等待的阈值,不要写死固定等待时间,避免浪费爬取效率
内容的提问来源于stack exchange,提问作者Felipe Dalla Lana
相关产品推荐
相关产品推荐

