如何用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
相关产品推荐
相关产品推荐

