使用Rselenium滚动全页提取宝可梦卡牌表格为数据框的问题
问题核心原因
- 滚动对象错误:该站点的懒加载触发依赖全局页面滚动,你向表格元素发送
end按键无法触发加载逻辑 - 无等待时间:滚动后异步数据请求、DOM渲染需要时间,立即拉取页面源码只能拿到滚动前的旧内容
- 单次滚动不充分:数据量较大时一次滚动无法触发全部内容加载,需要循环滚动直到无新内容产生
修正后的完整实现方案
你原本的技术结合思路是完全正确的:RSelenium负责处理页面交互、触发懒加载拿到完整DOM结构,rvest负责高效解析提取数据,只需要修正交互逻辑即可正常运行,完整代码如下:
library(RSelenium) library(rvest) library(tidyverse) # 启动驱动 rD <- rsDriver(browser="firefox", port=4545L, verbose=F) remDr <- rD[["client"]] # 全局隐性等待设置,避免元素未加载完成导致的报错 remDr$setImplicitWaitTimeout(10000) # 访问初始分类页,抓取所有卡牌系列的链接 remDr$navigate("https://www.pricecharting.com/category/pokemon-cards") Sys.sleep(2) # 提取所有系列的文本标识,可自行过滤不需要抓取的系列 series_list <- remDr$findElements(using = "css", "#category-page li a") %>% map_chr(~.$getElementText()[[1]]) all_data <- list() # 遍历所有系列抓取,示例仅保留Promo系列,要全量抓取删除[grepl("Promo", series_list)]过滤条件即可 for(series in series_list[grepl("Promo", series_list)]){ # 点击进入对应系列页面 remDr$findElement(using = "link text", series)$clickElement() Sys.sleep(3) # 循环滚动直到表格不再新增内容 last_row_num <- 0 while(TRUE){ # 执行JS直接滚动到页面最底部,触发懒加载 remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(2) # 等待数据请求和DOM渲染完成 # 统计当前表格实际行数 current_row_num <- remDr$findElements(using = "css", "#games_table tbody tr") %>% length() # 行数无变化说明已经加载完全部内容,跳出循环 if(current_row_num == last_row_num){ break } last_row_num <- current_row_num } # 拉取完整页面源码用rvest解析提取 full_page <- read_html(remDr$getPageSource()[[1]]) series_table <- full_page %>% html_element("#games_table") %>% html_table() %>% mutate(series = series) # 新增列标记数据所属卡牌系列,方便后续合并分析 all_data[[series]] <- series_table # 返回分类页,准备抓取下一个系列 remDr$goBack() Sys.sleep(2) } # 合并所有系列的抓取结果 final_data <- bind_rows(all_data) # 关闭驱动释放资源 remDr$close() rD$server$stop()
内容的提问来源于stack exchange,提问作者mikeytop
相关产品推荐
相关产品推荐

