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

基于Python-Selenium长期运行网页访问程序的稳定性与优化咨询

关于长期运行Web自动化脚本的稳定性问题

兄弟,先给你拍板:你当前基于IE Driver的方案几乎不可能稳定跑满2个月,IE本身已经是被微软淘汰的浏览器,配套驱动的维护早就停滞了,长期运行里内存泄漏、页面卡死、会话中断这类问题大概率会把程序搞崩。

一、现有方案必然崩溃的核心原因

  • IE Driver本身的硬伤:微软停止维护后,驱动的bug和内存泄漏问题根本没人修复,跑久了浏览器进程会疯狂吃内存,最后直接无响应。
  • 现代网页兼容性差:IE对新的JS语法、CSS特性支持拉胯,很多页面加载到一半就卡住,直接导致脚本停摆。
  • 无异常防护:你现在的代码完全没处理网络波动、页面超时这类情况,随便一个网络中断就能让程序直接抛出异常终止。

二、要救现有方案,必须加这些防护机制

如果实在要基于IE硬扛(真心不推荐),至少得做这些检查和优化:

  • 异常捕获+重试+重启:把每个URL的访问逻辑用try-except包裹,遇到异常先重试,多次失败就重启Driver:
    from selenium.common.exceptions import WebDriverException, TimeoutException
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    
    max_retries = 3
    for url in url_list:
        success = False
        for attempt in range(max_retries):
            try:
                driver.get(url)
                # 等待页面加载完成(换成你目标页面的标志性元素更靠谱)
                WebDriverWait(driver, 60).until(EC.presence_of_element_located(("tag name", "body")))
                time.sleep(30)
                success = True
                break
            except (WebDriverException, TimeoutException) as e:
                print(f"访问{url}失败,第{attempt+1}次重试:{str(e)}")
                if attempt == max_retries - 1:
                    print("多次重试失败,重启Driver")
                    driver.quit()
                    driver = webdriver.Ie("e:\\IEDriver\\IEDriverServer.exe")
    
  • 内存监控+主动重启:用psutil定期检查浏览器进程的内存占用,超过阈值就重启Driver,避免内存泄漏堆死程序:
    import psutil
    
    def check_and_restart_driver(driver, max_memory_mb=500):
        pid = driver.service.process.pid
        process = psutil.Process(pid)
        memory_usage = process.memory_info().rss / (1024 * 1024)
        if memory_usage > max_memory_mb:
            print(f"浏览器内存炸了({memory_usage:.2f}MB),重启Driver")
            driver.quit()
            return webdriver.Ie("e:\\IEDriver\\IEDriverServer.exe")
        return driver
    
    # 在循环里定期调用
    driver = check_and_restart_driver(driver)
    
  • 日志记录:把每个URL的访问时间、结果、异常信息都记下来,出问题了好排查:
    import logging
    logging.basicConfig(filename='web_auto.log', level=logging.INFO, format='%(asctime)s - %(message)s')
    
    # 访问成功/失败时记录
    logging.info(f"成功访问:{url}")
    logging.error(f"访问失败:{url},错误:{str(e)}")
    
  • 定期主动重启:不管有没有异常,每访问N个URL就重启一次Driver,把潜在的内存问题扼杀在摇篮里:
    url_count = 0
    restart_interval = 50  # 每访问50个URL重启一次
    for url in url_list:
        url_count +=1
        # ... 访问逻辑 ...
        if url_count % restart_interval == 0:
            print("到重启阈值了,刷新Driver")
            driver.quit()
            driver = webdriver.Ie("e:\\IEDriver\\IEDriverServer.exe")
    

三、更靠谱的长期运行方案

强烈建议直接换掉IE,用这些方案:

  1. 切换到Chrome/Firefox Driver:这俩浏览器的驱动一直在维护,稳定性拉满,还支持无头模式,资源占用低很多:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")  # 无头模式,不用开浏览器窗口
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--no-sandbox")
    driver = webdriver.Chrome(options=chrome_options)
    
  2. 用Playwright替代Selenium:微软开源的新一代自动化工具,内置自动等待、重试机制,稳定性比Selenium高一大截,还支持多浏览器:
    from playwright.sync_api import sync_playwright
    import time
    
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        for url in url_list:
            try:
                page.goto(url, timeout=60000)
                time.sleep(30)
            except Exception as e:
                print(f"访问{url}失败:{str(e)}")
                page.reload()
        browser.close()
    
  3. 容器化部署:把脚本和浏览器打包成Docker镜像,用容器编排工具(比如Docker Compose)配置自动重启,就算程序崩了也能自动拉起。
  4. 轻量方案(如果不需要JS渲染):如果目标页面是静态的,直接用requests+BeautifulSoup,资源占用极低,稳定性几乎100%,完全不用考虑浏览器崩溃的问题。

内容的提问来源于stack exchange,提问作者Pranav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:39