Python Selenium+Geckodriver无头模式远程服务器启动超时求助
问题:Selenium+Firefox无头模式在远程服务器启动超时
我用Python编写了基于Selenium的程序,本地运行正常,但部署到配置无头模式的远程服务器后出现启动问题。
驱动配置代码
# necessary imports from time import sleep from selenium.webdriver.firefox.service import Service from seleniumwire import webdriver # end imports def configure_firefox_driver_with_proxy(proxy_host=None, proxy_port=None): print("Point 1") options = webdriver.FirefoxOptions() print("Point 2") options.add_argument("--headless") print("Point 3") options.binary_location = '/usr/bin/firefox' print("Point 4") driver_path = '/root/geckodriver/geckodriver' print("Point 5") service = Service(driver_path) print("Point 6") service.log_path = '/root/[my folder]/geckodriver.log' print("Point 7") if not proxy_host or not proxy_port: print("Point 8") return webdriver.Firefox( options=options, service=service ) seleniumwire_options = { 'proxy': { 'http': f'socks5://{proxy_host}:{proxy_port}', 'https': f'socks5://{proxy_host}:{proxy_port}', 'no_proxy': 'localhost,127.0.0.1', 'proxy_type': 'manual' } } return webdriver.Firefox( service=service, options=options, seleniumwire_options=seleniumwire_options )
测试代码
def geckotest(): driver = configure_firefox_driver_with_proxy() print("Point 9") driver.get([some site]) print("Point 10") sleep(3) print("Point 11") driver.quit()
问题现象
程序能正常执行到Point 8,但在执行return webdriver.Firefox(options=options, service=service)时出现长时间卡顿,最终抛出错误:
urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='localhost', port=54001): Read timed out. (read timeout=120)
补充信息:
- 指定目录未生成geckodriver日志
- Selenium版本为4.31.0
- 单独启动geckodriver可正常监听4444端口
解决建议
- 检查版本兼容性:确认服务器上Firefox版本与Selenium 4.31.0兼容(官方要求Firefox 115+),版本不匹配则升级或降级Firefox/geckodriver。
- 完善无头模式参数:在
options中添加以下参数,适配服务器环境:options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-gpu") options.add_argument("--window-size=1920,1080")--no-sandbox用于绕过Linux环境的沙箱限制,--disable-dev-shm-usage解决临时空间不足问题。 - 修复日志生成问题:给Service添加日志级别,并检查目录权限:
确认service.log_level = 'DEBUG'/root/[my folder]目录有写入权限,若权限不足可更换为/tmp/geckodriver.log这类公共可写路径。 - 排查SeleniumWire冲突:暂时替换为原生Selenium的webdriver测试,将
from seleniumwire import webdriver改为from selenium import webdriver,验证是否是SeleniumWire导致的启动异常。 - 延长启动超时时间:初始化驱动时增加
timeout参数,给足够时间完成启动:return webdriver.Firefox( options=options, service=service, timeout=300 # 延长至5分钟 ) - 检查端口与防火墙:确认服务器本地防火墙未拦截Selenium随机使用的端口(如54001),同时排查是否有其他进程占用相关端口。
内容的提问来源于stack exchange,提问作者Donna Lizard
相关产品推荐
相关产品推荐

