R语言使用taskscheduleR实现Selenium爬虫定时任务运行后冻结求助
问题原因与解决方案
进程说明
你观察到的Java (TM) Platform SE Binary和Open JDK Platform Binary是Selenium运行时启动的Java虚拟机进程,用于承载Selenium服务、处理和浏览器驱动的交互逻辑。脚本执行结束后如果没有正常关闭Selenium会话,这些进程会残留在后台占用端口和内存,导致下一次定时任务启动时无法初始化新的Selenium会话,直接出现冻结问题。
修复方案
脚本末尾添加强制清理逻辑
无论脚本执行成功还是报错,都要主动销毁Selenium会话并清理残留进程,示例代码如下(基于RSelenium包,其他封装包逻辑同理):# 业务逻辑执行结束后执行以下代码 # 关闭当前浏览器窗口 remDr$close() # 销毁整个Selenium会话 remDr$quit() # 强制杀死所有残留Java进程 shell("taskkill /f /im java.exe /t", ignore.stderr = TRUE) # 根据你使用的浏览器,对应杀死驱动进程,Chrome用以下代码 shell("taskkill /f /im chromedriver.exe /t", ignore.stderr = TRUE) # Firefox替换为geckodriver.exe,Edge替换为msedgedriver.exe你也可以把上述清理逻辑放到
tryCatch的finally块中,保证脚本报错时也能执行清理。脚本开头添加预清理逻辑
每次运行脚本前先清理上一次可能残留的进程,避免影响本次运行:# 脚本第一部分先执行清理 shell("taskkill /f /im java.exe /t", ignore.stderr = TRUE) shell("taskkill /f /im chromedriver.exe /t", ignore.stderr = TRUE)调整定时任务配置避免并行冲突
创建任务时添加multipleinstances参数,禁止任务并行执行,避免进程冲突:library(taskscheduleR) x = "C:/Users/STEFANO MARIA/Desktop/Beatiful Data.R" taskscheduler_create( taskname = "MyBeatifulScript", rscript = x, schedule = "MINUTE", starttime ="16:30", modifier = 5, # 上一次任务未跑完时,不启动新任务,也可以换成"STOP_EXISTING"直接终止旧任务跑新的 multipleinstances = "IGNORE_NEW" )你当前代码中的
taskscheduler_delete(taskname = "MyEspriScript")属于多余调试代码,正式使用时需要删除,避免误操作。优化Selenium启动参数
建议开启无头模式运行,减少资源占用的同时降低进程残留概率:# 初始化浏览器时添加无头参数,Chrome示例 eCaps <- list(chromeOptions = list( args = c('--headless=new', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage') )) remDr <- remoteDriver(extraCapabilities = eCaps)
内容的提问来源于stack exchange,提问作者Stefano Maria De Francesco
相关产品推荐
相关产品推荐

