【问题标题】:getURL (from RCurl package) doesn't work in a loopgetURL(来自 RCurl 包)在循环中不起作用
【发布时间】:2013-05-02 12:58:52
【问题描述】:

我有一个名为 URLlist 的 URL 列表,我遍历它以获取每个 URL 的源代码:

for (k in 1:length(URLlist)){
    temp = getURL(URLlist[k])
}

问题是一些随机 URL,代码卡住,我收到错误消息:

Error in function (type, msg, asError = TRUE)  : 
    transfer closed with outstanding read data remaining

但是当我尝试使用有问题的 URL 的 getURL 函数时,而不是在循环中,它完美地工作。

有什么帮助吗?非常感谢你

【问题讨论】:

  • 它在我的系统上运行没有问题。您要下载什么样的 URL?
  • 在我的机器上也能正常工作。 URLlist 长什么样子?
  • 你尝试了多少个网址?我正在从 yahoo Finance 检索 URL,所以我认为如果来自服务器,问题就不会出现。我的 URLlist 真的很基本 "url1.com" "url2.com" ...
  • 下载多少个网址?而且我真的认为有一个使用的 URL 的精确示例会有所帮助。
  • 所有的 URL 都是这样的:ichart.finance.yahoo.com/… 我想下载大约一百个,但它随机卡住,有时在第 10 个之前,有时几乎在列表的末尾跨度>

标签: r rcurl


【解决方案1】:

如果没有更多信息,很难确定,但可能只是请求发送得太快,在这种情况下,在请求之间暂停可能会有所帮助:

for (k in 1:length (URLlist)) {
    temp = getURL (URLlist[k])
    Sys.sleep (0.2) 
}

我假设您的实际代码在循环的每次迭代中重写之前对“temp”进行了一些操作,并且无论它做什么都非常快。

您还可以尝试构建一些错误处理,这样一个问题就不会杀死整个事情。这是一个粗略的示例,它在放弃之前在每个 URL 上尝试两次:

for (url in URLlist) {
    temp = try (getURL (url))
    if (class (temp) == "try-error") {
        temp = try (getURL (url))
        if (class (temp) == "try-error")
            temp = paste ("error accessing", url)
        }    
    Sys.sleep(0.2) 
}

【讨论】:

  • 因为你不使用k 除了索引URLlist,我建议:for (url in URLlist) { }
  • 完成!虽然索引变量可能会很好地对下载的数据做任何有用的事情......
  • 如果您要使用结果填充列表,lapply 将是合适的。
  • 我和你在一起。我试图避免过多地摆弄循环的实现,以便专注于让下载工作的原始问题。特别是因为虽然看起来很可能 OP 正在填充一个列表,但它并不是 100% 清楚的。
  • 我遇到了同样的(似乎很少见)问题,错误处理对我有用(但不是睡眠本身)。关于如何在放弃之前自动尝试最大次数的任何建议?超过 2 次尝试嵌套开始变得混乱......
猜你喜欢
  • 2021-08-20
  • 2014-10-17
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多