使用R的RSelenium爬取ISO标准页面遇阻:兼容与选择器问题
问题解决办法
一、Selenium与浏览器版本兼容问题
你代码里已经用了Firefox,但如果还是碰到版本不匹配问题,试试这两种方法:
- 用
wdman包自动下载匹配当前浏览器的驱动:library(wdman) # 适配Firefox geckodriver() # 适配Chrome chromedriver() - 换用
chromote包:无需启动可视化浏览器,轻量且避免版本兼容问题,适合动态渲染页面。
二、CSS选择器无法遍历所有结果的问题
你的选择器用了:nth-child(2),只能选中单个卡片,要改成匹配所有标准卡片的选择器。以下是修正后的完整代码:
library(RSelenium) library(netstat) library(dplyr) # 设置英文环境 Sys.setlocale("LC_ALL", "English") # 启动Firefox驱动,自动分配端口 rs_driver_object <- rsDriver(browser = 'firefox', verbose = FALSE, port = free_port(random = TRUE)) remDr <- rs_driver_object$client remDr$open() # 用列表存结果,比循环rbind高效 standards_list <- list() # 遍历24页搜索结果 for(page_num in 1:24) { page_url <- paste0("https://www.iso.org/search.html?PROD_isoorg_en%5Bquery%5D=packaging&PROD_isoorg_en%5Bmenu%5D%5Bfacet%5D=standard&page=", page_num) remDr$navigate(page_url) Sys.sleep(3) # 等待页面加载,按需调整时长 # 获取当前页所有标准卡片 cards <- remDr$findElements(using = 'css selector', '.card') # 逐个处理卡片 for(card in cards) { # 提取标准编号 code_elem <- card$findElement(using = 'css selector', 'div.card-body > div > a') standard_number <- code_elem$getElementText()[[1]] # 提取标题(去掉编号部分) full_text <- card$findElement(using = 'css selector', 'div.card-body > div')$getElementText()[[1]] standard_title <- gsub(paste0(standard_number, "\n"), "", full_text) # 提取详情页链接 standard_link <- code_elem$getElementAttribute("href")[[1]] # 进入详情页 remDr$navigate(standard_link) Sys.sleep(3) # 提取页数,捕获异常避免程序崩溃 page_count <- tryCatch( remDr$findElement(using = 'css selector', '.refine li:nth-child(2) div.value')$getElementText()[[1]], error = function(e) NA ) # 提取发布日期 pub_date <- tryCatch( remDr$findElement(using = 'css selector', '#publicationDate span.value')$getElementText()[[1]], error = function(e) NA ) # 存入列表 standards_list[[length(standards_list)+1]] <- data.frame( Number = standard_number, Title = standard_title, PageCount = page_count, PublicationDate = pub_date, stringsAsFactors = FALSE ) # 返回搜索页,继续处理下一个卡片 remDr$navigate(page_url) Sys.sleep(2) } } # 合并为数据框 standards_df <- bind_rows(standards_list) # 关闭浏览器和驱动 remDr$close() rs_driver_object$server$stop() # 查看结果 print(standards_df)
关键修正点:
- 选择器调整:用
.card匹配所有标准卡片,不再限制固定位置;卡片内部通过子元素精准定位编号、标题和链接。 - 异常处理:用
tryCatch处理部分标准缺失信息的情况,防止程序中断。 - 性能优化:用列表存储结果后合并,避免循环
rbind的低效问题。 - 页面切换:从详情页返回当前搜索结果页,确保后续卡片能正确定位。
内容的提问来源于stack exchange,提问作者Laura cogez
相关产品推荐
相关产品推荐

