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

时间:2016-06-15 15:22:52

标签: r rvest webchem

我是R的新手,我正在尝试访问互联网上的一些信息,但我遇到了似乎没有关闭的连接问题。如果有人在这里给我一些建议,我将非常感激...

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

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

完全关闭R(甚至重启我的电脑)似乎没有什么区别 - 第二次使用代码时会出现警告信息。我可以一次一个地运行查询,在循环之外没有问题,但是一旦我尝试使用循环,错误就会在第二次迭代时再次发生。 我试图矢量化代码,并再次返回相同的错误消息。 我尝试了showConnections(all = TRUE),但只有stdin,stdout,stderr的连接0-2。 我试图找到关闭html连接的方法,但是我不能将url定义为con,而close(qurl)和close(ttt)也不起作用。 (返回应用于类“字符”对象的'close'没有适用方法的错误,并且没有适用于'c('xml_document','xml_node')类对象的'close'的适用方法“,分别为

有人知道关闭这些连接的方法,这样他们就不会破坏我的日常工作吗?任何建议都会非常受欢迎。谢谢!

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"))
}

2 个答案:

答案 0 :(得分:2)

研究了该主题之后,我提出了以下解决方案:

  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!

答案 1 :(得分:1)

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

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