
本文介绍如何绕过前端渲染,直接调用 nber 官网的 api 接口,使用 r 快速、稳定地批量获取第一页 50 篇工作论文标题所指向的完整详情页 url。
本文介绍如何绕过前端渲染,直接调用 nber 官网的 api 接口,使用 r 快速、稳定地批量获取第一页 50 篇工作论文标题所指向的完整详情页 url。
NBER(美国国家经济研究局)官网(https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17)采用现代前端架构:论文列表页并非静态 HTML,而是通过 JavaScript 发起 XHR 请求,动态加载 JSON 数据并渲染 DOM。这意味着,若直接使用 rvest 对页面 HTML 进行解析(如定位 <a> 标签),将无法获取真实链接——因为初始 HTML 中仅含占位结构,实际链接藏于异步响应中。
最优解是跳过 HTML 解析,直连其后端 API。通过浏览器开发者工具(Network → XHR)可捕获该请求,其 URL 模式为:
https://www.nber.org/api/v1/working_page_listing/contentType/working_paper/_/_/search?page=1&perPage=50&sortBy=public_date
该接口返回标准 JSON,其中 results 数组每项包含论文元数据,url 字段即为相对路径(如 /papers/w31388),拼接基础域名即可获得完整链接。
以下为完整、可复现的 R 实现(基于 httr2 风格管道写法,兼容 R 4.1+):
library(httr2)
# 构建 API 请求 URL
api_url <- "https://www.nber.org/api/v1/working_page_listing/contentType/working_paper/_/_/search" |>
paste0("?page=1&perPage=50&sortBy=public_date")
# 发送 GET 请求并解析 JSON 响应
response <- request(api_url) |>
req_perform() |>
resp_body_json()
# 提取所有相对链接
relative_urls <- response$results$url
# 转为绝对 URL
full_urls <- paste0("https://www.nber.org", relative_urls)
# 查看前 5 条结果
head(full_urls, 5)
# [1] "https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17/w31388"
# [2] "https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17/w31424"
# [3] "https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17/w31482"
# [4] "https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17/w31477"
# [5] "https://www.php.cn/link/b6dcaa50f9f37b62c29647512dcf7c17/w31478"✅ 优势说明:
- 高效稳定:避免依赖 CSS 选择器或 DOM 结构,不受前端更新影响;
- 零渲染开销:不需 RSelenium 或 chromote 启动浏览器,资源占用低;
- 精准可靠:url 字段专指论文详情页,天然过滤作者名、机构等无关链接。
⚠️ 注意事项:
- 返回顺序与网页视觉顺序不一致(API 默认按发布时间排序,但字段名 public_date 可能存在语义偏差,建议以 response$results$public_date 实际值为准);
- 若需多页数据,只需循环修改 page 参数(如 page=2, page=3);
- 遵守 robots.txt 及网站 Terms of Use,建议添加请求间隔(如 Sys.sleep(1));
- 如遇 429 Too Many Requests,可添加 req_headers("User-Agent" = "R-httr2") 模拟常规浏览器请求头。
掌握此方法后,你不仅能抓取 NBER 论文链接,更能举一反三:面对任何 AJAX 驱动的网站,优先检查 Network 面板中的 XHR/Fetch 请求,往往能发现更简洁、健壮的数据获取路径。

















