You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R的jsonlite或rvest爬取SSRN超过50条数据?

SSRN 爬取前200条数据的解决方案

问题分析

SSRN的公开API默认每页返回50条数据,要获取前200条,需通过分页参数控制请求,循环获取多页数据后合并即可。


方案一:使用jsonlite结合API分页参数

通过API的page(页码)和pageSize(每页条数)参数实现分页请求,代码如下:

library(jsonlite)

# 配置参数
target_total <- 200  # 目标获取条数
per_page <- 50       # 每页请求条数(API默认上限为50,无需调整)
total_pages <- ceiling(target_total / per_page)  # 计算需要请求的页数

# 初始化空数据框存储结果
all_records <- data.frame()

# 循环请求每一页
for (page_num in 1:total_pages) {
  # 构造带分页参数的API链接
  api_url <- paste0("https://api.ssrn.com/content/v1/bindings/204/papers?page=", page_num, "&pageSize=", per_page)
  
  # 请求并解析JSON数据
  page_data <- fromJSON(api_url) %>% as.data.frame()
  
  # 合并到总数据框
  all_records <- rbind(all_records, page_data)
  
  # 添加1秒延迟,避免触发反爬限制
  Sys.sleep(1)
}

# 确保只保留前200条
all_records <- all_records[1:target_total, ]

# 提取需要的字段(示例,根据实际返回结构调整)
final_data <- all_records %>% 
  select(papers.title, papers.authors, papers.url)

关键说明

  • 必须添加page和pageSize参数,这是API分页的核心控制项
  • 添加Sys.sleep(1)是为了降低请求频率,避免被SSRN的反爬机制拦截
  • 实际字段名需根据API返回的JSON结构调整,可通过str(page_data)查看数据层级

方案二:结合httr设置请求头(解决API限制)

如果直接用fromJSON请求被限制,可通过httr包设置浏览器UA伪装,提升请求成功率:

library(jsonlite)
library(httr)

target_total <- 200
per_page <- 50
total_pages <- ceiling(target_total / per_page)
all_records <- data.frame()

for (page_num in 1:total_pages) {
  api_url <- paste0("https://api.ssrn.com/content/v1/bindings/204/papers?page=", page_num, "&pageSize=", per_page)
  
  # 模拟浏览器请求头
  response <- GET(
    api_url,
    add_headers(
      "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    )
  )
  
  # 解析响应内容
  json_content <- content(response, "text") %>% fromJSON()
  page_data <- as.data.frame(json_content$papers)  # 假设数据嵌套在papers字段下
  
  all_records <- rbind(all_records, page_data)
  Sys.sleep(1)
}

all_records <- all_records[1:target_total, ]

方案三:恢复rvest爬取网页(针对原方法失效)

如果API仍有问题,可重新分析SSRN网页结构,用rvest结合分页爬取:

library(rvest)

target_total <- 200
per_page <- 50
total_pages <- ceiling(target_total / per_page)
all_records <- data.frame()

for (page_num in 1:total_pages) {
  # 构造分页网页链接
  web_url <- paste0("https://www.ssrn.com/index.cfm/en/arn/?page=", page_num, "&sort=0")
  
  # 模拟浏览器请求网页
  page_html <- read_html(
    web_url,
    user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
  )
  
  # 提取数据(需根据当前网页结构调整选择器,以下为示例)
  titles <- page_html %>% html_elements(".paper-title a") %>% html_text(trim = TRUE)
  authors <- page_html %>% html_elements(".paper-authors") %>% html_text(trim = TRUE)
  paper_urls <- page_html %>% html_elements(".paper-title a") %>% html_attr("href") %>% paste0("https://www.ssrn.com", .)
  
  # 组合数据框
  page_data <- data.frame(
    title = titles,
    author = authors,
    url = paper_urls
  )
  
  all_records <- rbind(all_records, page_data)
  Sys.sleep(1)
}

all_records <- all_records[1:target_total, ]

关键说明

  • 网页选择器需用浏览器开发者工具重新确认(按F12查看元素类名),因为SSRN可能更新了页面结构
  • 同样需要添加延迟和UA伪装,避免被反爬拦截

内容的提问来源于stack exchange,提问作者Jochen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:05:18