使用httr请求老旧网站出现curl数据接收失败问题求助
解决httr::GET大文件接收失败的方案
我之前处理过类似的httr请求问题,结合你描述的场景——临界265KB、write_disk能完整保存但请求报错,大概率是传输环节的参数或请求头兼容性问题,给你几个可行的解决方向:
1. 延长请求超时时间
默认超时时间可能不足以完成大文件的传输:虽然write_disk是流式写入不会中断,但httr上层逻辑会因为超时判定请求失败。可以通过timeout()参数延长超时:
GET( "mock-url", user_agent("Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"), timeout(60) # 设置为60秒,可根据实际文件大小调整 )
2. 增大curl缓冲区大小
curl默认缓冲区大小可能刚好卡在265KB左右,当响应超过这个阈值时会触发接收失败。可以通过config()调整curl的缓冲区参数:
GET( "mock-url", user_agent("Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"), config(curlopts = list(CURLOPT_BUFFERSIZE = 524288)) # 设置为512KB,大于临界值 )
3. 补充兼容性请求头
旧版本网页可能对请求头的完整性要求更高,新版本网页已经做了兼容优化。可以添加几个浏览器常用的请求头模拟真实访问:
GET( "mock-url", user_agent("Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"), add_headers( "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding" = "gzip, deflate, br", "Connection" = "keep-alive" ) )
其中Accept-Encoding如果缺失,服务器可能不会采用压缩传输,导致响应体积过大触发接收问题;Connection: keep-alive可以维持长连接,避免传输中途中断。
4. 显式启用流式传输选项
既然write_disk能正常写入,说明流式传输是可行的,可以通过curl参数强制启用流式处理,绕过缓冲区限制:
GET( "mock-url", user_agent("Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"), config(curlopts = list( CURLOPT_HTTP_TRANSFER_DECODING = 1, CURLOPT_FOLLOWLOCATION = TRUE # 确保处理可能存在的重定向 )) )
你可以先尝试调整超时和缓冲区大小,这两个是最常见的触发因素;如果无效再补充请求头。另外,因为新版本网页无此问题,也可以对比新旧网页的请求头差异,把旧请求的头调整成和新网页一致,兼容性会更好。
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

