You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:47:08