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

