基于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,用这些方案:
- 切换到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) - 用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() - 容器化部署:把脚本和浏览器打包成Docker镜像,用容器编排工具(比如Docker Compose)配置自动重启,就算程序崩了也能自动拉起。
- 轻量方案(如果不需要JS渲染):如果目标页面是静态的,直接用
requests+BeautifulSoup,资源占用极低,稳定性几乎100%,完全不用考虑浏览器崩溃的问题。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

