我在使用RSelenium中的以下代码来打开浏览器。但是,即使我关闭了浏览器,或者通过运行remDr$close()关闭了处理程序,端口仍然被占用。我必须去终端手动杀死进程,以便相同的端口变为可用。是否有任何自动化方式,让RSelenium在完成网页爬取后将端口释放?
这是我的代码:
library(RSelenium)
rD <- rsDriver(verbose = FALSE,port=4444L)
remDr <- rD$client
remDr$close()
感谢
该过程由两个部分组成:一个服务器(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()
直到最近我才遇到问题。对我有用的解决方案是使用上述方法,并根据此线程中的解决方案,在RStudio内添加一行以杀死Java实例。
remDr$close()
rD$server$stop()
rm(rD, remDr)
gc()
system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)
该命令:
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))
避免这个问题的一种方法是使用free_port()
来查找空闲端口(而不是手动指定)。
library(netstat)
rsDriver(verbose = FALSE, port=free_port())
对我来说行之有效的方法是根本不调用stop,而只调用close。
rD <- rsDriver(port = 4444L)
remDr <- rD[["client"]]
remDr$close()
rm(rD)
gc()
编辑:算了,这个方法上周用了好几次都可以,但现在再试就不行了。
gc()
我尝试了所有类似脚本的版本:
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
重新加载会话。