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

使用R语言rvest、curl爬虫遇重定向次数超限错误的解决咨询

解决R语言爬取中「Number of redirects hit maximum amount」错误

嗨,我来帮你拆解这个问题——我之前用rvest和curl做批量爬取的时候也碰到过一模一样的报错,那种爬到一半突然中断的烦躁感太懂了😅

这个错误到底是什么意思?

直白点说,就是你的请求在访问目标网站时,要么陷入了无限重定向循环,要么重定向的次数超过了curl默认的上限。

举两个常见场景:

  • 循环重定向:你请求页面A,服务器返回让你去页面B;你请求B,它又让你回A,来回兜圈子,curl数到默认的10次重定向后就直接罢工了。
  • 重定向链条过长:有些网站的跳转链路本来就长(比如从域名跳转→地区选择→语言切换→最终页面),超过了curl默认的10次限制,也会触发这个错误。

可行的解决办法

1. 调高curl的最大重定向次数

最简单的办法就是把默认的最大重定向次数调大,比如从10改成20甚至30,给足够的跳转空间:

library(rvest)
library(curl)

# 创建自定义handle,设置最大重定向次数为20
custom_handle <- new_handle(followlocation = TRUE, maxredirs = 20)
# 使用这个handle发起请求
target_page <- read_html(curl_fetch_memory("你的目标URL", handle = custom_handle))

如果是用rvest的html_session来维持会话(比如爬取需要登录的网站),也可以把这个handle传进去:

session <- html_session("你的目标URL", handle = custom_handle)

2. 排查重定向循环问题

有时候不是次数不够,而是真的陷入循环了。这时候可以开启curl的 verbose 模式,看看跳转链条到底是怎么走的:

debug_handle <- new_handle(followlocation = TRUE, verbose = TRUE)
curl_fetch_memory("你的目标URL", handle = debug_handle)

运行后控制台会输出每一步的请求地址、响应状态码,你一眼就能看到是不是在A→B→A之间反复横跳。如果是这种情况,大概率是请求头(比如Cookie、User-Agent)不对,服务器识别到你是爬虫,就一直把你往循环里引。

3. 完善请求头信息

我之前碰到过一次,就是因为用了curl默认的User-Agent,被网站反复重定向到人机验证页,加了浏览器风格的请求头之后就正常了。你可以试试加上这些参数:

browser_handle <- new_handle(
  followlocation = TRUE,
  maxredirs = 20,
  # 模拟Chrome浏览器的User-Agent
  useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
  # 加上Accept头,更贴近真实浏览器请求
  accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
)
target_page <- read_html(curl_fetch_memory("你的目标URL", handle = browser_handle))

如果目标网站需要登录,别忘了把登录后的Cookie也加到handle里,不然会一直被重定向到登录页面。

4. 手动处理重定向

要是自动跟随重定向总是出问题,你可以关闭自动跳转,手动处理每一步的重定向:

no_redirect_handle <- new_handle(followlocation = FALSE)
initial_response <- curl_fetch_memory("你的目标URL", handle = no_redirect_handle)

# 检查响应状态码,3xx开头的都是重定向
if (initial_response$status_code >= 300 && initial_response$status_code < 400) {
  # 从响应头里拿到重定向的目标URL
  redirect_url <- curl::parse_headers(initial_response$headers)[["location"]]
  # 手动请求这个最终URL
  target_page <- read_html(redirect_url)
}

这种方式适合你能明确控制跳转路径的场景,避免自动跟随带来的意外循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:46:12