使用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
相关产品推荐
相关产品推荐

