Python多进程结合Docker Selenium Grid请求超时无法执行问题求助
看起来你遇到了Selenium Grid搭配多进程时的请求超时难题,我来给你梳理几个实用的排查方向和修复方案:
先确认Docker Selenium Grid的运行状态
首先用docker ps命令检查Grid Hub和Chrome Node的容器是否正常启动、没有意外退出。接着可以访问Grid的控制台页面(新版是http://127.0.0.1:4444/ui,旧版是http://127.0.0.1:4444/grid/console),看看Node是否成功注册到Hub上,有没有空闲的会话槽位。如果Node没注册上,Hub接收到请求后找不到执行节点,自然会超时等待。修正Remote Driver的初始化细节
你的代码里有两个小问题可能导致流程卡住:webdriver.Remote的command_executor地址缺少/wd/hub路径,标准Selenium Grid配置下需要这个路径,改成http://127.0.0.1:4444/wd/hub试试;driver.page_source是属性不是方法,你写成driver.page_source()会直接报错,应该改成html = driver.page_source。
多进程环境下的Driver管理注意事项
多进程中直接在函数里初始化Driver要注意,尽量避免在主进程中提前创建相关配置对象,把Driver的初始化放到每个进程的独立执行逻辑里,减少进程间的资源冲突。另外keep_alive=False在多进程场景下可能导致连接不稳定,你可以先去掉这个参数试试。检查Docker网络配置
如果你的Python程序在宿主机运行,要确认Grid容器的4444端口是否正确映射到宿主机,可以用curl http://127.0.0.1:4444/wd/hub/status测试连接,看能不能正常返回Grid的状态JSON。如果程序也在Docker容器内,那不能用127.0.0.1访问Grid,应该用docker-compose里Hub的服务名,比如http://selenium-hub:4444/wd/hub。优化无头模式的参数配置
容器环境下的Chrome无头模式需要额外参数来避免权限或资源问题,建议补充这些参数:driveroptions = webdriver.ChromeOptions() driveroptions.add_argument('--headless=new') # 新版无头模式更稳定 driveroptions.add_argument('--no-sandbox') driveroptions.add_argument('--disable-dev-shm-usage')
这里给你修正后的示例代码,加上了异常处理避免进程卡死:
def get_discounts(self) -> list: discounts = [] try: driveroptions = webdriver.ChromeOptions() driveroptions.add_argument('--headless=new') driveroptions.add_argument('--no-sandbox') driveroptions.add_argument('--disable-dev-shm-usage') # 修正command_executor路径 driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', options=driveroptions ) driver.get(self.current_url) html = driver.page_source # 修正为属性调用 # 这里可以添加你的HTML解析逻辑,提取折扣信息 # discounts = 你的解析结果 except Exception as e: print(f"请求过程出错: {str(e)}") finally: # 确保Driver无论如何都能退出 if 'driver' in locals(): driver.quit() return discounts
备注:内容来源于stack exchange,提问作者Cardinell

