如何在 R 中的 read_html 之后关闭未使用的连接

How do I close unused connections after read_html in R

我是 R 的新手,正在尝试访问 Internet 上的一些信息,但遇到似乎没有关闭的连接问题。如果有人能给我一些建议,我将不胜感激...

最初我想使用 WebChem 包,理论上它可以提供我想要的一切,但是当网页中缺少某些输出数据时,WebChem 不会 return 来自该页面的任何数据。为了解决这个问题,我从包中提取了大部分代码,但对其进行了轻微修改以满足我的需要。这工作正常,大约前 150 次使用,但现在,虽然我没有做任何更改,但当我使用命令 read_html 时,我收到警告消息“关闭未使用的连接 4 (http:.....”虽然这只是一条警告消息,但 read_html 在生成此警告后不会 return 任何内容。

我写了一个简化的代码,如下所示。这有同样的问题

完全关闭 R(或什至重新启动我的 PC)似乎没有什么不同 - 现在我第二次使用该代码时出现警告消息。我可以 运行 一次查询一个,在循环之外没有问题,但是一旦我尝试使用循环,错误就会在第二次迭代时再次发生。 我试图对代码进行矢量化处理,但它再次 return 显示了相同的错误消息。 我尝试了 showConnections(all=TRUE),但只获得了 stdin、stdout、stderr 的连接 0-2。 我已经尝试寻找关闭 html 连接的方法,但我无法将 url 定义为 con,并且 close(qurl) 和 close(ttt) 也不不工作。 (Return no applicable method for 'close' applied to an object of class "character and no applicable method for 'close' applied to an object of class "c('xml_document', 'xml_node')”的错误,分别)

有没有人知道关闭这些连接的方法,以免它们破坏我的日常工作?任何建议都将非常受欢迎。谢谢!

PS:我正在使用 R 版本 3.3.0 和 RStudio 版本 0.99.902。

CasNrs <- c("630-08-0","463-49-0","194-59-2","86-74-8","148-79-8")
tit = character()
for (i in 1:length(CasNrs)){
  CurrCasNr <- as.character(CasNrs[i])
  baseurl <- 'http://chem.sis.nlm.nih.gov/chemidplus/rn/'
  qurl <- paste0(baseurl, CurrCasNr, '?DT_START_ROW=0&DT_ROWS_PER_PAGE=50')
  ttt <- try(read_html(qurl), silent = TRUE)
  tit[i] <- xml_text(xml_find_all(ttt, "//head/title"))
}

这个问题我还没有找到好的答案。我想出的最好的解决方法是包括下面的函数,Secs = 3 或 4。我仍然不知道为什么会出现问题或如何在不造成大量延迟的情况下停止它。

CatchupPause <- function(Secs){
 Sys.sleep(Secs) #pause to let connection work
 closeAllConnections()
 gc()
}

在研究了这个主题之后,我想出了以下解决方案:

  url <- "https://website_example.com"
  url = url(url, "rb")
  html <- read_html(url)
  close(url)

# + Whatever you wanna do with the html since it's already saved!

当我试图在同一脚本中抓取多个数据集时,我 post 发现了这个问题,因为我 运行 遇到了同样的问题。脚本会逐渐变慢,我觉得这是由于连接造成的。这是一个关闭所有连接的简单循环。

for (i in seq_along(df$URLs)){function(i)
  closeAllConnections(i)
}