You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:15:03