使用rvest爬取网页返回{{article.Link}}而非真实链接如何解决
R爬取JS动态渲染页面的解决方案
问题原因
当前抓取到的{{article.Link}}是前端框架的模板占位符,真实链接由页面加载完成后执行的JavaScript脚本异步请求后端接口后填充到页面中。rvest仅支持读取初始静态HTML源码,无法执行JS渲染逻辑,因此无法获取到填充后的真实链接。
两种可行解决方法
方法1:直接请求后端数据接口(推荐,效率更高)
这种方法跳过页面渲染步骤,直接拉取后端返回的结构化JSON数据,不需要启动浏览器,速度快、资源占用低。
操作逻辑:
- 打开浏览器控制台(F12)切换到「网络」标签,筛选「Fetch/XHR」类型的请求,刷新页面后找到返回文章列表数据的接口
- 用
httr包模拟请求该接口,解析JSON后直接提取链接字段
示例代码:
library(httr) library(jsonlite) # 构造接口请求,take参数可调整单次返回的文章数量 res <- GET("https://politi.dk/api/newssearch/", query = list( query = "", t = "Doegnrapport", page = 0, take = 20 )) # 解析json响应数据 data <- fromJSON(content(res, as = "text")) # 拼接域名得到完整可访问链接 full_links <- paste0("https://politi.dk", data$results$url) print(full_links)
方法2:使用无头浏览器渲染页面后抓取
如果无法定位到数据接口,可以用支持JS执行的无头浏览器工具加载页面,等渲染完成后再用rvest抓取元素,推荐使用轻量的chromote包,无需配置复杂的Selenium环境。
示例代码:
library(chromote) library(rvest) # 启动无头浏览器 b <- ChromoteSession$new() # 加载目标页面 b$Page$navigate("https://politi.dk/doegnrapporter") # 等待页面渲染完成,等待时长可根据网络情况调整 Sys.sleep(2) # 获取渲染后的完整HTML源码 html <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value # 关闭浏览器进程 b$close() # 用rvest正常解析渲染后的源码 page <- read_html(html) t <- page %>% html_nodes("a.newsResultLink") %>% html_attr('href') full_links <- paste0("https://politi.dk", t) print(full_links)
注意事项
- 爬取时控制请求频率,避免对目标网站服务器造成过大压力
- 接口参数中的
page可以调整分页,拉取更多历史报告数据 - 如果接口触发反爬限制,可以在GET请求中添加
user-agent请求头模拟正常浏览器访问
内容的提问来源于stack exchange,提问作者Soren
相关产品推荐
相关产品推荐

