【问题标题】:How to stop execution of RCurl::getURL() if it is taking too long?如果执行时间过长,如何停止执行 RCurl::getURL()?
【发布时间】:2011-07-18 13:36:36
【问题描述】:

有没有办法告诉 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

这只会挂在我的系统上,不会进入最后一行。

编辑: 基于@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*** 

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

> getURL(u, followLocation = TRUE, .opts = list(timeout = 1, maxredirs = 2, verbose = TRUE))

谢谢你,

托尼·布雷亚尔

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

【问题讨论】:

    标签: r rcurl


    【解决方案1】:

    我相信 Web 服务器正在进入 告诉我们 URL 是暂时的 移动,然后它将我们指向一个新的 URL

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

    当我们跟随它时,它会再次将我们重定向到 .... 相同的 URL!!!

    所以超时不是问题。响应来得非常快,所以超时时间是 未超过。导致明显挂起的是我们绕着圈子转圈圈的事实。

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

    D.

    【讨论】:

      【解决方案2】:

      timeoutconnecttimeout 是 curl 选项,因此它们需要在列表中传递给 .opts 参数到 getURL。不确定你需要哪两个,但从开始

      getURL(u, followLocation = TRUE, .opts = list(timeout = 3))
      

      编辑:

      我可以重现挂起;更改缓冲输出并不能解决我的问题(在 R2.13.0 和 R2.13.1 下测试),并且无论是否使用 timeout 参数都会发生这种情况。如果您在重定向目标页面上尝试getURL,它将显示为空白。

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

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

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

      【讨论】:

      • 干杯伙伴,这更好,但我仍然没有得到我需要的东西(见 Q 中的编辑)
      • 我已经给包维护者发了电子邮件,让他知道这个问题。
      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2016-06-30
      • 2018-01-19
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多