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服务器上
核心问题
- Selenium或SeleniumBase是否存在已知问题会导致元素检测出现间歇性故障?
- 针对有时加载耗时较长的页面元素,有哪些特定技术可提升可靠性?
- 这些间歇性问题是否与网站服务器或响应时间有关?有哪些更好的处理方式?
问题解答
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
相关产品推荐
相关产品推荐

