RSelenium:服务器信号端口已在使用中

时间:2017-05-16 02:16:41

标签: r rselenium

我在RSelenium中使用以下代码打开浏览器。关闭浏览器,甚至通过运行remDr $ close()关闭处理程序后,该端口仍在使用中。我必须去终端并手动终止进程,以便相同的端口可用。是否有任何自动化方式使得RSelenium在完成抓取后使端口自由?

所以这是我的代码:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()

由于

5 个答案:

答案 0 :(得分:11)

该过程由服务器(Selenium Server)和客户端两部分组成 (您启动的浏览器)。 remoteDriver类的close方法关闭客户端(浏览器)。完成后还需要停止服务器。

完成后停止服务器:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()

现在要么明确停止服务器:

rD$server$stop()

或者如果rD对象被删除,服务器将在垃圾回收时停止:

library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()
rm(rD)
gc()

答案 1 :(得分:11)

直到最近我才有问题。对我有用的是使用上面的解决方案以及该thread中的解决方案,添加一行内容以杀死RStudio内部的Java实例。

remDr$close()
driver$server$stop()
rm(driver, remDr)
gc()

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

答案 2 :(得分:4)

命令:

system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

将释放所有端口。

如果要释放特定端口,可以执行以下操作:

#获取您启动的进程的PID

pid <- driver$server$process$get_pid()

#在以下命令中粘贴此PID(也会杀死所有子进程,也将关闭浏览器)

system(paste0("Taskkill /F /T" ," /PID ", pid))

答案 3 :(得分:2)

对我有用的是根本不叫停,而只叫关闭。

rD <- rsDriver(port = 4444L)
remDr <- rD[["client"]]
remDr$close()
rm(rD)
gc()

编辑:没关系-上周该方法工作了好几次,然后再没有起作用。

答案 4 :(得分:2)

避免此问题的一种方法是使用free_port()查找空闲端口(而不是手动指定)

library(netstat)
rsDriver(verbose = FALSE,port=free_port())