使用jsonlite::fromJSON调用爬虫API时如何指定User-Agent解决429错误
解决R调用Helium API返回429错误的方案
错误原因
- 你当前使用
jsonlite::fromJSON直接传URL发起请求时,没有主动指定符合要求的User-Agent头,全局HTTPUserAgent配置不会被fromJSON的内置请求逻辑读取,不生效 - 官方要求User-Agent必须为带你的应用标识的自定义值,直接复制通用浏览器UA也会被接口拦截
- 循环请求时的频率如果不符合接口限制,也会触发429限流
修复方案
建议使用httr包自定义请求头发起调用,再将返回内容传给jsonlite解析,修改后的可运行代码如下:
# 先安装依赖包(已安装可跳过) # install.packages(c("httr", "jsonlite", "anytime")) library(jsonlite) library(httr) library(anytime) # 自定义符合要求的User-Agent,替换成你自己的应用信息即可 CUSTOM_UA <- "your-app-name/1.0 (your-contact-info)" blocks_api <- 'https://api.helium.io/v1/blocks' # 封装统一的请求函数,自动加UA、处理429重试 helium_api_get <- function(url) { resp <- GET(url, user_agent(CUSTOM_UA)) # 遇到429就等待3秒重试 if (status_code(resp) == 429) { Sys.sleep(3) resp <- GET(url, user_agent(CUSTOM_UA)) } stop_for_status(resp) return(fromJSON(content(resp, "text", encoding = "UTF-8"))) } # 后续接口调用全部用封装好的函数 blocks <- helium_api_get(blocks_api) endTime <- Sys.Date() blockMax_api <- paste0(blocks_api,"/height","/?max_time=",endTime) blockMax_ep <- helium_api_get(blockMax_api) blockMax <- max(blockMax_ep$data$height) startTime <- Sys.Date() - 1 blockMin_api <- paste0(blocks_api,"/height","/?max_time=",startTime) blockMin_ep <- helium_api_get(blockMin_api) blockMin <- blockMin_ep$data$height period_blocks <- blockMax - blockMin blockTimes <- data.frame() oraclePrice <- 'https://api.helium.io/v1/oracle/prices' for(i in blockMin:blockMax){ block_n <- helium_api_get(paste0(blocks_api,"/",i)) block_n <- as.data.frame(block_n) block_n$data.time <- anytime(block_n$data.time) block_n <- block_n[,c(2,5,6)] oracleBlockPrice <- helium_api_get(paste0(oraclePrice,"/",i)) block_n$HNTprice <- oracleBlockPrice$data$price / 100000000 blockTimes <- rbind(blockTimes,block_n) Sys.sleep(1.5) # 适当延长间隔避免触发限流 }
注意事项
- User-Agent请替换为你自己的应用名称+联系方式,不要使用公共浏览器UA,符合官方接口要求
- 如果依然触发429,可以继续调大
Sys.sleep的等待时长,或者在429重试逻辑里增加等待时间
内容的提问来源于stack exchange,提问作者dreamweaver
相关产品推荐
相关产品推荐

