R语言download.file()爬取网页返回403 Forbidden错误如何解决
问题根因
返回403 Forbidden是站点反爬策略拦截导致:R内置的download.file()默认发起请求时,携带的User-Agent会明确标识请求来自R脚本,和真实浏览器的请求特征不匹配,站点识别到非人工访问就会直接拒绝响应。手动通过浏览器访问无异常,正是因为浏览器会自动携带普通用户的合法请求头,不会被判定为爬虫。
解决方法
- 优先使用支持自定义请求头的请求库,模拟真实浏览器特征绕过拦截
不要用默认的download.file(),换用httr包自定义请求头,示例代码如下:
如果仅加User-Agent仍被拦截,可以补充更多常规浏览器请求头,进一步降低被识别为爬虫的概率:# 首次使用先安装依赖 install.packages(c("httr", "rvest")) library(httr) library(rvest) target_url <- 'https://www.punters.com.au/form-guide/' # 携带普通Chrome浏览器的User-Agent发起请求 resp <- GET( target_url, user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") ) # 验证返回状态,返回200即请求成功 print(status_code(resp)) # 解析网页内容 page_html <- content(resp, as = "parsed")resp <- GET( target_url, add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", `Accept` = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", `Accept-Language` = "zh-CN,zh;q=0.9,en;q=0.8", `Referer` = "https://www.punters.com.au/" ) ) - 控制请求频率
如果上述配置后仍偶发403,是因为站点对短时间高频请求做了拦截,在两次请求之间增加1-3秒的随机等待即可,不要连续批量发起请求:Sys.sleep(sample(1:3, 1))
注意事项
- 爬取前请确认站点的访问规则,仅爬取公开可访问的内容,不要对站点服务器造成不必要的流量压力
- 不要将爬取到的内容用于未经授权的商业用途
内容的提问来源于stack exchange,提问作者Bazza
相关产品推荐
相关产品推荐

