Ubuntu 20.04无GUI环境Selenium Geckodriver多次运行后报Connection refused错误
问题根因
- 代码逻辑错误:driver初始化完成后再修改profile配置不会生效,还会导致临时配置文件无法正常清理,/tmp目录下残留大量
rust_mozprofile开头的临时文件夹,占用系统资源 - 进程未正常回收:脚本运行异常时
driver.quit()没有被执行,后台残留大量僵尸Firefox、geckodriver进程,占满可用端口,新启动的服务无法绑定端口就会抛出Connection refused错误 - 重复安装扩展:同时使用
install_addon临时安装扩展和向profile写入扩展的逻辑,二者冲突导致Firefox退出时资源释放异常
修复方案
1. 修正代码逻辑
核心调整点:提前配置profile到driver初始化之前,新增try-finally块强制回收进程,去掉重复的扩展安装逻辑,修改后代码如下:
from selenium import webdriver from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver import FirefoxProfile import time import os # 提前配置Firefox profile,初始化driver前完成所有参数设置 profile = FirefoxProfile() extension_path = "/root/my_simple_extension.xpi" profile.add_extension(extension_path) profile.set_preference("security.fileuri.strict_origin_policy", False) profile.update_preferences() ff_options = FirefoxOptions() user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ff/85.0.4183.83 Safari/537.36" ff_options.add_argument('-headless') ff_options.add_argument(f'user-agent={user_agent}') ff_options.add_argument('--disable-dev-shm-usage') ff_options.add_argument('--no-sandbox') ff_options.add_argument("--window-size=1920,1080") ff_options.add_argument('--ignore-certificate-errors') ff_options.add_argument('--allow-running-insecure-content') ff_options.add_argument("--proxy-server='direct://'") ff_options.add_argument("--proxy-bypass-list=*") ff_options.add_argument("--start-maximized") ff_options.add_argument('--disable-gpu') ff_options.add_argument('--disable-setuid-sandbox') driver = None try: # 初始化driver时直接传入提前配置好的profile driver = webdriver.Firefox( executable_path='/usr/local/share/geckodriver', options=ff_options, firefox_profile=profile ) # 已经通过profile预装了扩展,无需重复调用install_addon driver.get("about:debugging#/runtime/this-firefox") time.sleep(1) parent1 = driver.find_element_by_xpath('(//div[@class="fieldpair"])[position()=3]') uuid = parent1.text.splitlines()[1] driver.get(f'moz-extension://{uuid}/home.html') time.sleep(1) print(driver.page_source) finally: # 无论脚本是否异常,都强制回收资源 if driver: try: driver.quit() except: pass # 兜底杀残留进程、清临时文件 os.system("pkill -f firefox > /dev/null 2>&1") os.system("pkill -f geckodriver > /dev/null 2>&1") os.system("rm -rf /tmp/rust_mozprofile* > /dev/null 2>&1")
2. 环境优化配置
- 确认geckodriver版本和当前安装的Firefox版本匹配,版本不兼容会大幅提升进程残留概率
- 如需高频率运行脚本,可开启内核端口复用参数,执行命令:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse - 可添加定时任务,每小时清理一次/tmp下的临时Firefox配置文件和残留进程,避免资源耗尽
内容的提问来源于stack exchange,提问作者Ernestas
相关产品推荐
相关产品推荐

