Azure Databricks中Selenium重复运行报MaxRetryError问题求助
问题分析与解决
错误根源
- 固定chromedriver端口和远程调试端口,首次运行后端口被占用,后续启动无法绑定新连接。
- 重复使用同一用户数据目录,导致文件锁或残留会话冲突,阻碍新实例启动。
- 可能存在Chrome进程残留,占用资源导致连接请求被拒绝。
修复步骤
1. 移除固定端口配置
不给Service指定固定port,让chromedriver自动选择可用端口;同时移除固定的--remote-debugging-port参数,避免端口冲突。
2. 使用临时用户数据目录
每次运行生成独立的临时目录,避免会话残留和文件锁问题,可借助tempfile模块实现。
3. 确保进程彻底关闭
添加异常处理逻辑,保证无论是否出错都执行driver.quit();针对Databricks环境,额外强制清理残留Chrome进程。
4. 优化等待逻辑
替换低效的time.sleep()为Selenium显式等待,提升稳定性同时节省时间。
修改后的代码示例
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import tempfile import os def scrape_dian_rut(nit): # 创建临时用户数据目录,自动清理 with tempfile.TemporaryDirectory() as temp_dir: options = webdriver.ChromeOptions() options.binary_location = "/tmp/chrome/latest/chrome-linux/chrome" options.add_argument('headless=new') # 新版headless模式兼容性更好 options.add_argument('--disable-infobars') options.add_argument('--disable-dev-shm-usage') options.add_argument('--no-sandbox') options.add_argument(f'--user-data-dir={temp_dir}') prefs = { "download.default_directory": temp_dir, "download.prompt_for_download": False } options.add_experimental_option("prefs", prefs) # 不指定固定端口,让chromedriver自动分配可用端口 s = Service('/tmp/chrome/latest/chromedriver_linux64/chromedriver') driver = None try: driver = webdriver.Chrome(service=s, options=options) driver.implicitly_wait(20) driver.get('https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces') # 显式等待输入框可点击 nit_input = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit")) ) nit_input.click() nit_input.send_keys(nit) # 等待并点击搜索按钮 search_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:btnBuscar")) ) search_btn.click() # 等待结果加载并提取数据 primer_apellido = WebDriverWait(driver, 20).until( EC.visibility_of_element_located((By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerApellido")) ).text segundo_apellido = driver.find_element(By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:segundoApellido").text primer_nombre = driver.find_element(By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerNombre").text otros_nombres = driver.find_element(By.ID, "vistaConsultaEstadoRUT:formConsultaEstadoRUT:otrosNombres").text print(f"{primer_apellido} {segundo_apellido} {primer_nombre} {otros_nombres}") return f"{primer_apellido} {segundo_apellido} {primer_nombre} {otros_nombres}" finally: # 确保driver正常关闭 if driver: driver.quit() # 清理可能残留的Chrome进程 os.system("pkill -f chrome") # 重复运行n次示例 n = 5 target_nit = '123456789' for _ in range(n): scrape_dian_rut(target_nit) time.sleep(2) # 添加间隔避免目标网站反爬限制
额外注意事项
- 确保chromedriver版本与Chrome版本完全匹配(当前Chrome 119对应chromedriver 119.x)。
- 确认Databricks环境下
/tmp/chrome路径下的Chrome和chromedriver具备可执行权限。 - 若目标网站有反爬机制,需根据情况调整请求间隔,避免被封禁。
内容的提问来源于stack exchange,提问作者Sebastian Rivera Muñoz
相关产品推荐
相关产品推荐

