使用Rvest爬取coinmarketcap表格仅获取部分数据的问题求助
问题原因
- 网站采用了懒加载渲染策略,首次加载页面时仅完整渲染前10条加密货币的所有字段,剩余条目的非核心字段(如24小时涨跌幅、流通市值、交易量等)不会提前写入静态HTML,只有当页面滚动到对应条目位置时,才会通过JS请求数据并渲染到页面上。rvest只能获取首次返回的静态HTML内容,无法执行JS触发后续数据加载,因此只能拿到后序列表提前预置的名称、价格两个基础字段。
- 部分反爬机制也会限制静态请求的返回数据量,避免批量爬取行为,静态请求默认只会返回前10条全量数据。
全量爬取解决方案
方案1:使用动态渲染工具模拟浏览器行为
用RSelenium等工具模拟真实浏览器访问,触发页面懒加载逻辑,等所有数据加载完成后再提取表格内容,代码示例如下:
library(RSelenium) library(rvest) # 启动Chrome驱动,需提前安装对应版本的ChromeDriver rd <- rsDriver(browser = "chrome", port = free_port()) remDr <- rd$client remDr$navigate("https://coinmarketcap.com/") # 多次滚动页面到底部,触发所有懒加载数据渲染 for (i in 1:6) { remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(1.5) } # 提取渲染完成的页面内容解析表格 full_page <- read_html(remDr$getPageSource()[[1]]) market <- full_page %>% html_table(fill = TRUE) %>% as.data.frame() # 关闭驱动释放资源 remDr$close() rd$server$stop()
注意:需要提前匹配本地Chrome浏览器版本和ChromeDriver版本,避免启动失败。
方案2:直接调用后端数据接口
通过浏览器开发者工具的网络面板,抓取出加密货币列表的后端API接口,直接请求接口获取结构化JSON数据,用jsonlite包解析即可得到全量数据,这种方式效率更高、数据更稳定,不需要处理HTML解析的复杂逻辑。
内容的提问来源于stack exchange,提问作者Florian Seliger
相关产品推荐
相关产品推荐

