You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R提取动态网站表格遇阻,请求技术解决方案

解决DNB网站动态表格抓取问题

1. 先解决页面加载不完整的问题

你直接调用navigate后就获取页面源码,大概率表格还没完成渲染。先添加等待逻辑,确保数据加载完毕:

# 等待结果区域加载,超时时间设为10秒(可根据实际调整)
remdr$waitForElement(using = "css selector", value = ".search-results", timeout = 10000)

2. 定位正确的数据容器(不是原生)

DNB的搜索结果并非用标准<table>标签渲染,而是用自定义的div/li结构。你需要先通过浏览器F12开发者工具,查看表格区域的HTML结构:

  • 右键点击任意公司条目,选择「检查」
  • 找到包裹所有条目的父容器,以及每个条目、每个字段对应的CSS类或XPath

假设实际结构中,每个公司条目是带有class="search-result-entry"的div,字段分别对应.company-name、.location等类,示例代码如下:

# 获取当前页所有条目节点
entries <- remdr$findElements(using = "css selector", value = ".search-result-entry")

# 提取单页数据
page_data <- lapply(entries, function(entry) {
  # 提取公司名称
  name <- entry$findElement(using = "css selector", value = ".company-name")$getElementText()[[1]]
  # 提取地址
  location <- entry$findElement(using = "css selector", value = ".location")$getElementText()[[1]]
  # 提取其他需要的字段(根据实际HTML调整选择器)
  data.frame(Company = name, Location = location, stringsAsFactors = FALSE)
}) %>% do.call(rbind, .)

3. 实现分页循环抓取

总数据14387条,每页50条,共288页。循环处理分页:

total_pages <- ceiling(14387 / 50)
full_data <- data.frame()

for(page in 1:total_pages) {
  # 等待当前页加载
  remdr$waitForElement(using = "css selector", value = ".search-result-entry", timeout = 10000)
  
  # 提取当前页数据(复用上面的entries和page_data逻辑)
  entries <- remdr$findElements(using = "css selector", value = ".search-result-entry")
  page_data <- lapply(entries, function(entry) {
    name <- entry$findElement(using = "css selector", value = ".company-name")$getElementText()[[1]]
    location <- entry$findElement(using = "css selector", value = ".location")$getElementText()[[1]]
    data.frame(Company = name, Location = location, stringsAsFactors = FALSE)
  }) %>% do.call(rbind, .)
  
  full_data <- rbind(full_data, page_data)
  
  # 点击下一页(排除最后一页)
  if(page < total_pages) {
    next_btn <- remdr$findElement(using = "css selector", value = ".pagination-next")
    next_btn$clickElement()
    Sys.sleep(2) # 等待翻页加载,避免触发反爬
  }
}

4. 收尾注意事项

  • 选择器务必验证:所有CSS选择器要以浏览器开发者工具中实际看到的为准,不要凭猜测
  • 反爬规避:添加Sys.sleep()控制请求频率,必要时可设置浏览器User-Agent
  • 资源清理:抓取完成后关闭Selenium会话:
remdr$close()
rd$server$stop()

内容的提问来源于stack exchange,提问作者Alejandro Carrera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:12:43