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

