
本文介绍如何绕过前端渲染限制,直接调用 nber 官网的 api 接口,使用 r 快速、稳定地批量提取第一页 50 篇工作论文标题所对应的完整详情页 url。
本文介绍如何绕过前端渲染限制,直接调用 nber 官网的 api 接口,使用 r 快速、稳定地批量提取第一页 50 篇工作论文标题所对应的完整详情页 url。
NBER(美国国家经济研究局)官网的工作论文列表页(如 https://www.nber.org/papers?page=1&perPage=50)采用 JavaScript 动态加载内容:页面初始 HTML 中并不包含论文标题的 标签,而是通过 XHR 请求一个 JSON 接口,再由前端 JS 渲染出超链接。因此,若使用传统 HTML 解析方法(如 rvest::html_nodes("a")),将无法捕获这些链接——它们根本不存在于原始响应中。
最优解是直连其后端 API。通过浏览器开发者工具(F12 → Network → Filter “fetch/XHR”)可发现,页面实际请求的是如下 JSON 接口:
https://www.nber.org/api/v1/working_page_listing/contentType/working_paper/_/_/search?page=1&perPage=50&sortBy=public_date
该接口返回结构化数据,其中每篇论文的 url 字段即为相对路径(如 /papers/w31388),拼接域名即可获得完整 URL。
以下是完整的、可复现的 R 实现(兼容 tidyverse 风格管道):
library(httr)
library(jsonlite)
# 构建并请求 API URL
api_url %
paste0("page=1&perPage=50&sortBy=public_date")
response %
getElement("results") %>%
sapply(function(x) x$url, USE.NAMES = FALSE)
# 转为绝对 URL
urls_absolute <p>✅ <strong>优势说明</strong>: </p>
- ✅ 高效稳定:跳过 HTML 解析与 CSS 选择器维护,避免因网页结构调整导致脚本失效;
- ✅ 无渲染依赖:不需 RSelenium 或 chromote 启动浏览器,资源开销极低;
- ✅ 可扩展性强:只需修改 page= 参数即可获取多页数据(注意遵守 robots.txt 及合理请求频率)。
⚠️ 注意事项:
- NBER 的 API 未公开文档,URL 结构可能随网站升级调整。建议首次使用时手动验证接口可用性(在浏览器中打开上述 API 地址,确认返回有效 JSON);
- 响应中 results 为数组,每项含 url、title、author、public_date 等字段,可按需扩展提取(例如同时保存标题与链接);
- 若需抓取全部论文(非仅第一页),请循环构造 page=1, page=2, … 并合并结果,但务必添加 Sys.sleep(1) 避免高频请求;
- 遵守 NBER robots.txt,当前允许抓取 /api/ 路径,但仍建议加入 User-Agent 标识(可通过 add_headers("User-Agent" = "MyRScraper/1.0") 设置)。
总结:面对动态渲染型学术网站,优先逆向分析网络请求而非硬啃 HTML,是 R 网络爬虫实践中的关键思维跃迁。本方案以最小代码量达成高可靠性目标,是生产环境下的推荐范式。










