使用R语言rvest库爬取Zigbee联盟官网表格失败如何解决?
问题排查
- 核心原因:目标页面的表格内容是JavaScript动态渲染生成的,
rvest::read_html()只能获取服务端返回的原始静态HTML源码,此时页面的表格数据还没被JS加载渲染,所以定位不到任何tr.field_1节点,自然提取失败。
解决方案
这里提供两种可落地的实现方式,优先推荐第一种接口直取方案,不需要模拟浏览器,运行效率更高。
方案1:直接调用数据接口提取
该页面的产品数据通过独立接口返回,直接请求接口就能拿到结构化JSON数据,不需要解析HTML,代码更简洁:
# 加载依赖包 library(httr) library(jsonlite) library(dplyr) # 请求产品数据接口,per_page参数控制单次返回的数据条数 res <- GET("https://zigbeealliance.org/wp-json/v1/products?classic=1&per_page=1000") # 解析返回的JSON内容 raw_data <- fromJSON(content(res, as = "text")) # 提取产品列表转为数据框 product_total_df <- raw_data$data %>% as_tibble() # 按需筛选需要的字段即可得到最终总表,示例如下: final_table <- product_total_df %>% select(id, product_name = name, manufacturer = company, product_category = category, cert_date = certification_date)
如果站点总产品数超过1000,调大per_page参数或者补充分页请求逻辑即可。
方案2:用RSelenium模拟浏览器加载
如果不想抓包找接口,可以用RSelenium模拟真实浏览器运行,等页面渲染完成后再提取内容:
library(RSelenium) library(rvest) library(purrr) # 启动Chrome驱动,需提前安装和本地Chrome版本匹配的chromedriver driver <- rsDriver(browser = "chrome", chromever = "你的本地Chrome版本号", port = 4567L) remDr <- driver$client # 打开目标页面 remDr$navigate("https://zigbeealliance.org/classic-product-search/") # 等待页面加载完成,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染完成的页面源码 page_source <- remDr$getPageSource()[[1]] zb <- read_html(page_source) # 提取所有表格内容合并为总表 total_table <- zb %>% html_nodes("table") %>% html_table(fill = TRUE) %>% list_rbind() # 用完关闭驱动释放资源 remDr$close() driver$server$stop()
内容的提问来源于stack exchange,提问作者nslb
相关产品推荐
相关产品推荐

