RSelenium:服务器信号端口已被占用

28

我在使用RSelenium中的以下代码来打开浏览器。但是,即使我关闭了浏览器,或者通过运行remDr$close()关闭了处理程序,端口仍然被占用。我必须去终端手动杀死进程,以便相同的端口变为可用。是否有任何自动化方式,让RSelenium在完成网页爬取后将端口释放?

这是我的代码:

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

感谢

7个回答

26

该过程由两个部分组成:一个服务器(Selenium 服务器)和一个客户端(您启动的浏览器)。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()

5
你好。我尝试了这两个方法多次,但都没有成功。浏览器关闭了,但是当我尝试重新启动 rD 对象时,总是会出现端口 4567 已被占用的错误。只有完全退出 R 会话才能释放端口。 - Guy Manova
1
我和@GuyManova有相同的问题。 - syre
1
在这里提供我的建议。似乎该解决方案不适用于更新的Rselenium软件包。我使用了@Seb_ISU在此线程中推荐的解决方案,该解决方案可以在以下链接中找到:https://github.com/ropensci/RSelenium/issues/228 - Bogdan

21

直到最近我才遇到问题。对我有用的解决方案是使用上述方法,并根据此线程中的解决方案,在RStudio内添加一行以杀死Java实例。

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

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

非常感谢您。我已经处理了这个烦人的问题好几个月了。 - StatsStudent

7

该命令:

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

虽然我很希望能够有一个有针对性的杀进程方法,但是上述方法并没有针对孤立的Java进程——它对我没有用。 - Kim
你想要杀掉一个特定的子进程吗? - Yugesh

6

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

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

3

对我来说行之有效的方法是根本不调用stop,而只调用close。

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

编辑:算了,这个方法上周用了好几次都可以,但现在再试就不行了。


0
假设问题出现在清理RStudio环境之后,我发现最简单的解决方案是进行垃圾回收:
gc()

0

我尝试了所有类似脚本的版本:

   driver = rsDriver(browser = c("firefox"))
   remDr <- driver[["client"]]

...,有时候会开始出现以下错误:

    Error in wdman::selenium(port = port, verbose = verbose, version = version, 
: Selenium server signals port = 4567 is already in use.

对于关闭端口4567,无论是重新启动浏览器和RStudio,还是其他建议都没有起作用,除非指定一个不同的端口。

driver = rsDriver(browser = c("firefox"), verbose = FALSE, port = 4444L)
remDr <- driver[["client"]]

端口列表(例如4445L、4446L、4447L等)同样有效, 或者按下Ctrl+Shift+F10重新加载会话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接