如果花费太长时间,如何停止执行RCurl :: getURL()?

Ton*_*yal 4 r rcurl

有没有办法告诉R或RCurl包,如果它超过指定的时间段并且转到下一行代码,就放弃尝试下载网页?例如:

> library(RCurl)
> u = "http://photos.prnewswire.com/prnh/20110713/NY34814-b"
> getURL(u, followLocation = TRUE)
> print("next line") # programme does not get this far
Run Code Online (Sandbox Code Playgroud)

这将挂在我的系统上,而不是进入最后一行.

编辑:基于@Richie Cotton的答案,虽然我可以"实现我想要的",但我不明白为什么需要比预期更长的时间.例如,如果我执行以下操作,系统会挂起,直到我在RGUI中选择/取消选择"Misc >> Buffered Output"选项:

> system.time(getURL(u, followLocation = TRUE, .opts = list(timeout = 1)))
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
  Operation timed out after 1000 milliseconds with 0 out of 0 bytes received
Timing stopped at: 0.02 0.08 ***6.76*** 
Run Code Online (Sandbox Code Playgroud)

解决方案:根据@Duncan的帖子,然后看看卷曲文档,我通过使用maxredirs选项找到了解决方案,如下所示:

> getURL(u, followLocation = TRUE, .opts = list(timeout = 1, maxredirs = 2, verbose = TRUE))
Run Code Online (Sandbox Code Playgroud)

非常感谢你,

Tony Breyal

O/S: Windows 7
R version 2.13.0 (2011-04-13) Platform: x86_64-pc-mingw32/x64 (64-bit)
attached base packages: 
[1] stats     graphics  grDevices utils    
datasets  methods   base     
other attached packages: 
[1] RCurl_1.6-4.1  bitops_1.0-4.1
loaded via a namespace (and not attached): 
[1] tools_2.13.0
Run Code Online (Sandbox Code Playgroud)

Ric*_*ton 5

timeout并且connecttimeout是 curl 选项,因此它们需要在列表中传递.optsgetURL. 不确定您需要两者中的哪一个,但从

getURL(u, followLocation = TRUE, .opts = list(timeout = 3))
Run Code Online (Sandbox Code Playgroud)

编辑:

我可以重现挂起;更改缓冲输出并不能解决我的问题(在 R2.13.0 和 R2.13.1 下测试),无论有没有超时参数都会发生。如果您尝试getURL在作为重定向目标的页面上,它会显示为空白。

u2 <- "http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&page=/getStoryRemapDetails.do&prnid=20110713%252fNY34814%252db&action=details"
getURL(u2)
Run Code Online (Sandbox Code Playgroud)

如果您删除该page参数,它会将您重定向到登录页面;也许美通社在要求提供凭据方面做了一些有趣的事情。

u3 <- "http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&prnid=20110713%252fNY34814%252db&action=details"
getURL(u3)
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 5

我相信Web服务器通过告诉我们URL暂时移动然后它指向一个新的URL而陷入混乱状态

http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&page=/getStoryRemapDetails.do&prnid=20110713%252fN\Y34814%252db&action = details

当我们遵循这一点时,它会再次将我们重定向到....相同的URL!

所以超时不是问题.响应非常快,因此超时持续时间不会超过.事实上,我们绕圈子绕圈,导致明显的悬挂.

我发现这一点的方法是在.opts列表中添加verbose = TRUE然后我们看到我们和服务器之间的所有通信.

D.