使用R语言rvest爬取Moodys Local表格返回空值,节点获取失败求助
解决Moodys Local网站动态内容爬取问题
你遇到的核心问题是:Moodys Local的页面内容由JavaScript动态渲染生成。直接用read_html()获取的只是服务器返回的静态HTML骨架,里面并没有实际渲染后的页面内容(包括h1标题、表格数据),所以无论使用什么CSS选择器都无法找到目标元素。
以下是两种可行的解决方案:
方案1:用RSelenium模拟浏览器渲染页面
RSelenium可以模拟真实浏览器加载页面、执行JavaScript,从而获取完整的渲染内容,步骤如下:
- 安装并加载依赖包:
install.packages("RSelenium") library(RSelenium) library(rvest) library(dplyr)
- 启动浏览器驱动(以Chrome为例,需确保Chrome版本与chromedriver版本匹配):
driver <- rsDriver(browser = "chrome", port = 4567L) remote_driver <- driver[["client"]]
- 访问目标页面并等待内容加载:
remote_driver$navigate("https://www.moodyslocal.com/country/pe/ratings/insurance") # 根据网络情况调整等待时间,确保页面完全渲染 Sys.sleep(5)
- 获取渲染后的页面源码并解析:
page_source <- remote_driver$getPageSource()[[1]] page <- read_html(page_source) # 现在可以正常提取元素 headers <- page %>% html_nodes('.tabledata-cell') %>% html_text() h1_text <- page %>% html_nodes('h1') %>% html_text() # 提取表格数据 insurance_table <- page %>% html_table(fill = TRUE) %>% .[[1]]
- 关闭浏览器和驱动:
remote_driver$close() driver[["server"]]$stop()
方案2:直接调用网站API接口(更高效)
通过浏览器开发者工具(F12)追踪网络请求,可以找到页面加载表格数据的API接口,直接请求API获取结构化数据,无需模拟浏览器:
打开目标页面,按下F12进入开发者工具,切换到「网络」标签,刷新页面后筛选「XHR」请求,找到加载评级数据的API接口(例如类似
https://www.moodyslocal.com/api/ratings/insurance?country=pe的地址,需自行确认实际接口)。用
httr请求API并解析JSON:
library(httr) library(jsonlite) # 替换为实际找到的API地址 api_url <- "https://www.moodyslocal.com/api/ratings/insurance?country=pe" # 设置请求头模拟浏览器,避免被反爬拦截 request_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) response <- GET(api_url, request_headers) raw_data <- fromJSON(content(response, "text")) # 将JSON数据转换为data.frame格式 insurance_data <- as.data.frame(raw_data)
注意事项
- 使用RSelenium时,需确保本地安装了对应浏览器的驱动程序,且版本与浏览器一致。
- API接口可能会随网站更新变化,需定期检查;部分API可能需要携带特定Cookie或请求头,可从开发者工具的请求详情中复制。
- 爬取数据前请遵守网站的
robots.txt和使用条款,避免触发反爬机制。
内容的提问来源于stack exchange,提问作者Eduardo Reyes
相关产品推荐
相关产品推荐

