使用R语言爬取CoinMarketCap加密货币历史数据失败如何解决
问题根因
- 你抓取的页面属于JavaScript动态渲染类型:CoinMarketCap的历史价格数据不会直接写在初始HTML里,而是页面加载完成后通过异步请求拉取数据再渲染到表格中。rvest的
read_html()只能获取未执行JS的初始静态HTML,此时你XPath对应的表格元素还不存在,自然返回空数据集。 - 你使用的绝对XPath可靠性极低:即使页面是静态的,只要平台调整前端DOM结构,该路径就会失效,更推荐用元素的class、id等特征做相对定位。
可落地的解决方案
方案1:调用官方API(首推)
CoinMarketCap提供官方开放API可以直接获取结构化的历史价格数据,无需解析页面,稳定性最高。免费额度足够个人非商用场景使用,注册账号获取API密钥后即可调用,返回的JSON格式数据处理成本极低。
方案2:使用支持JS执行的爬取工具
如果必须爬取页面内容,可换用RSelenium等可以模拟浏览器运行的工具,等待页面完全渲染后再提取数据,参考代码如下:
# 提前安装RSelenium包,配置与本地浏览器版本匹配的驱动 library(RSelenium) library(rvest) library(magrittr) # 启动Chrome浏览器实例 driver <- rsDriver(browser = "chrome", chromever = "你的本地Chrome浏览器版本号") remDr <- driver$client remDr$navigate("https://coinmarketcap.com/currencies/bitcoin/historical-data/") # 等待页面完成渲染,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染后的完整页面源码 page_html <- remDr$getPageSource()[[1]] %>% read_html() # 提取表格数据,用table标签或者对应class定位比绝对XPath更稳定 price_df <- page_html %>% html_element(css = "table") %>% html_table() %>% as.data.frame() # 关闭浏览器实例和驱动 remDr$close() driver$server$stop()
方案3:直接抓取异步数据接口
打开浏览器开发者工具的「网络」面板,筛选「Fetch/XHR」类型请求,刷新页面后找到返回历史价格数据的接口,直接用httr包调用该接口获取数据,比模拟浏览器更轻量高效。
内容的提问来源于stack exchange,提问作者nostalgia
相关产品推荐
相关产品推荐

