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

SeleniumBase脚本间歇性故障排查(页面结构未变更)

Servipag爬虫间歇性故障排查

问题背景

我使用Selenium编写脚本从Servipag网站爬取服务读数数据,脚本在出错时最多重试5次。页面结构未发生变化,该函数此前运行稳定,但现在出现间歇性故障,经常无法定位元素或意外超时。

脚本代码

def scrape_servipag_service_reading(service_type, company, identifier, companyType, propertyId):
    max_attempts = 5
    for attempt in range(1, max_attempts + 1):
        driver = None
        try:
            # Access the page
            driver = Driver(uc=True, headless=True)
            driver.get(f"https://portal.servipag.com/paymentexpress/category/{service_type}")
            wait = WebDriverWait(driver, 30)

            # Select company and enter identifier
            select_element = wait.until(EC.presence_of_element_located((By.ID, "card-lib-selectCompany-change")))
            Select(select_element).select_by_visible_text(company)
            input_element = wait.until(EC.presence_of_element_located((By.ID, "card-lib-identifier-change")))
            input_element.send_keys(identifier)
            
            # Click button and wait for results
            button_element = wait.until(EC.element_to_be_clickable((By.ID, "card-lib-btnContinue-click")))
            button_element.click()

            # Fetch results or detect no-debt message
            result_elements = wait.until(EC.presence_of_all_elements_located(
                (By.CSS_SELECTOR, "div.form-control.border-primary.d-flex.justify-content-end.align-items-center")))

            # Processing results here...

        except TimeoutException as e:
            logger.error(f"TimeoutException on attempt {attempt}: {e}")

        except NoSuchElementException as e:
            logger.error(f"NoSuchElementException on attempt {attempt}: {e}")

        finally:
            if driver:
                driver.quit()

    return None

scrape_servipag_service_reading('agua', 'Aguas Andinas', '2803495-4','agua','asdadsad')

环境信息

  • 使用带uc=True、headless=True参数的SeleniumBase Driver
  • 采用Python的logging模块进行错误追踪
  • 函数运行在网络稳定的Windows服务器上

核心问题

  1. Selenium或SeleniumBase是否存在已知问题会导致元素检测出现间歇性故障?
  2. 针对有时加载耗时较长的页面元素,有哪些特定技术可提升可靠性?
  3. 这些间歇性问题是否与网站服务器或响应时间有关?有哪些更好的处理方式?

问题解答

1. Selenium/SeleniumBase的已知问题

有几种常见情况会导致这类间歇性故障:

  • Headless模式差异:Headless Chrome和普通浏览器的渲染逻辑存在细微差别,部分网站会针对无头模式做反爬拦截,或者元素渲染时机不同,导致偶发定位失败。SeleniumBase的uc=True虽能绕过大部分反爬,但仍可能存在同步渲染问题。
  • 等待条件局限性:presence_of_element_located仅确认元素存在于DOM中,但元素可能未完全渲染至可交互状态,后续操作(如下拉选择)就会失败。
  • 版本不兼容:若浏览器自动更新但Driver版本未同步,会出现浏览器与Driver的通信异常,引发偶发的元素定位故障。

2. 提升元素定位可靠性的技术

  • 替换等待条件:
    • 对需要交互的元素(下拉框、输入框),用element_to_be_clickable或visibility_of_element_located替代presence_of_element_located,确保元素可见且可交互。
    • 针对动态内容,使用text_to_be_present_in_element等更具体的条件,确认元素内容加载完成。
  • 单元素重试逻辑:在单个元素定位操作外包裹try-except,单次失败后重试2-3次再抛出异常,避免因单次波动导致整个流程失败。
  • 优化Driver配置:
    • 禁用浏览器缓存:driver.execute_cdp_cmd('Network.clearBrowserCache', {}),避免旧缓存干扰页面加载。
    • 设置页面加载超时:driver.set_page_load_timeout(60),给页面足够的加载时间。
  • 使用稳定定位器:若ID存在动态生成风险,结合多属性编写CSS选择器或XPath,例如By.CSS_SELECTOR, "select[id='card-lib-selectCompany-change'][data-type='company']",提升定位容错性。

3. 网站服务器相关问题及处理方式

这类间歇性故障大概率和网站服务器的响应波动有关:

  • 服务器限流/动态渲染延迟:网站高负载时会延迟返回内容,或对频繁请求做动态限流,导致元素加载超时。
  • 对应处理方式:
    • 添加随机延迟:在页面跳转、元素操作之间加入1-3秒的随机等待,模拟人类操作节奏,降低被限流的概率。
    • 分步重试:针对单个失败步骤(如下拉框选择)单独重试,无需重新加载整个页面,减少资源消耗。
    • 验证页面加载状态:在driver.get后,通过driver.execute_script("return document.readyState")确认页面完全加载(返回complete)后再执行后续操作。
    • 临时关闭无头模式:测试关闭headless=True后故障是否消失,排查是否是无头模式的反爬拦截导致问题。

内容的提问来源于stack exchange,提问作者Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:45:54