在R中获取浏览器跳转后的目标URL,解决爬取404错误问题
获取R中重定向后的目标URL解决方案
你碰到的是服务器端重定向的问题——那些recaplink.php链接会在服务器层面跳转到真实的赛事回顾页面,但rvest::read_html()默认不会自动跟进这类重定向,所以才会返回404错误,而浏览器会自动处理跳转,因此能正常加载目标页面。
要在R里获取跳转后的最终URL,我们可以用httr包来发送带重定向跟进的请求,然后从响应里提取最终地址。下面是具体的实现步骤:
1. 加载所需包
除了你已经在用的tidyverse和rvest,还需要httr来处理HTTP请求的重定向逻辑:
library(tidyverse) library(rvest) library(httr)
2. 定义获取最终URL的函数
写一个简单的函数,发送GET请求并开启重定向跟进,然后从响应对象中提取最终的URL:
get_final_redirect_url <- function(initial_url) { # 发送GET请求,开启重定向跟进 response <- GET(initial_url, followlocation = TRUE) # 从响应中提取跳转后的最终URL response$url }
3. 测试单个链接
用你提到的第200个链接测试一下,验证是否能拿到正确的目标URL:
test_link <- "http://www.uscho.com/recaplink.php?gid=1_970_20172018" get_final_redirect_url(test_link) # 输出应该为:https://www.uscho.com/recaps/?p=171810970
4. 批量处理所有链接
用purrr::map_chr()批量处理你的link_list,一次性得到所有跳转后的目标URL:
final_link_list <- map_chr(link_list, get_final_redirect_url)
可选:添加请求延迟(避免被封禁)
如果担心短时间内发送大量请求被网站限制,可以给函数加个延迟,用purrr::slowly()实现每次请求间隔1秒:
# 创建带延迟的函数版本 get_final_url_slow <- slowly(get_final_redirect_url, rate = rate_delay(1)) final_link_list <- map_chr(link_list, get_final_url_slow)
之后你就可以用final_link_list里的URL调用read_html()获取赛事数据,不会再遇到404错误了。
内容的提问来源于stack exchange,提问作者Evan O.
相关产品推荐
相关产品推荐

