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

API页面爬取遇403错误:代码无法访问但浏览器可正常打开

解决API爬取403 Forbidden错误的方案

问题分析

403错误是服务器拒绝请求的典型表现,核心原因是直接用readLines()、GET()等方法发送的请求未携带浏览器标识——服务器会校验请求的合法性,无标识的请求会被判定为非客户端请求拦截。而浏览器访问时会自动携带这些标识,所以能正常获取数据。

具体解决方法

1. 模拟浏览器请求头

使用httr包的GET()方法,手动添加浏览器的User-Agent标识,伪装成正常浏览器请求:

library(httr)

# 替换为你当前浏览器的User-Agent(可在浏览器开发者工具的网络请求中查看)
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"

# 发送带请求头的请求
response <- GET("https://api.mtgstocks.com/prints/11521/prices", 
                add_headers(`User-Agent` = user_agent))

# 解析返回的JSON数据
json_data <- content(response, "parsed")

2. 批量编号遍历的优化写法

封装成函数批量处理,同时增加错误处理逻辑:

get_price_data <- function(print_id, user_agent) {
  url <- paste0("https://api.mtgstocks.com/prints/", print_id, "/prices")
  response <- GET(url, add_headers(`User-Agent` = user_agent))
  
  # 处理请求失败的情况
  if (http_status(response)$category != "Success") {
    warning(paste("ID", print_id, "请求失败:", http_status(response)$message))
    return(NULL)
  }
  
  content(response, "parsed")
}

# 批量处理示例
print_ids <- c(11521, 11522, 11523)
all_data <- lapply(print_ids, get_price_data, user_agent = user_agent)
# 过滤请求失败的空结果
all_data <- Filter(Negate(is.null), all_data)

3. 避坑提示

  • 不要高频发送请求,建议在请求间添加Sys.sleep(1)间隔1秒,避免触发反爬机制
  • User-Agent尽量用当前浏览器的真实标识,不要用过于通用或老旧的标识
  • 如果仍报错,可在浏览器开发者工具中查看正常请求的完整头信息,补充Referer等其他必要请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:52:44