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

Selenium驱动遇验证码无法关闭的代码错误排查请求

问题排查与修复方案

核心问题分析

  • 驱动关闭不彻底:driver.close()仅关闭当前窗口,驱动进程仍在后台运行,导致资源占用和卡顿,需用driver.quit()彻底终止驱动服务。
  • 等待时间过长:implicitly_wait(300)设置了5分钟等待,遇到验证码时会耗尽等待时长才判定元素不存在,直接引发卡顿。
  • 关闭驱动后未终止循环:关闭驱动后继续执行循环,尝试用已失效的驱动请求页面,引发无响应或异常。
  • 文件操作未释放资源:直接调用codecs.open未配合with语句,可能造成文件句柄泄漏。
  • 无限循环无终止条件:while True会持续运行,即使所有ID处理完成也不会停止。

修改后的代码

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import codecs

# 检查元素是否存在,改用显式等待快速判断
def find_element(driver, target_id='restab') -> int:
    try:
        # 10秒内等待元素出现,超时则判定不存在
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, target_id))
        )
        return 1
    except:
        return 0

# 下载页面并处理驱动逻辑
def data_fill(id_list, driver) -> int:
    for idx, id in enumerate(id_list):
        author_page = f"https://www.elibrary.ru/author_profile_new_titles.asp?id={id}"
        driver.get(author_page)
        result = find_element(driver)
        if result == 0:
            # 彻底终止驱动进程
            driver.quit()
            # 返回当前处理到的索引,方便后续断点续传
            return idx
        else:
            file_path = os.path.join("/Users/dariagerashchenko/PycharmProjects/python_practice/hist", f"j_profile{id}.html")
            # 用with语句自动管理文件句柄,避免泄漏
            with codecs.open(file_path, "w", "utf-8") as f:
                f.write(driver.page_source)
    # 所有ID处理完成,关闭驱动并返回-1标记
    driver.quit()
    return -1

# 主执行逻辑
k = 0
processed_idx = 0  # 记录已处理的ID索引,避免重复操作
total_ids = len(id_list)

while processed_idx < total_ids:
    if k % 5 == 0:
        proxy_list = get_proxies()
    k += 1
    driver = get_best_driver(driver_path=driver_path, proxy_list=proxy_list)
    if driver is None:
        continue
    # 传入未处理的ID子集
    current_result = data_fill(id_list=id_list[processed_idx:], driver=driver)
    if current_result == -1:
        print("所有数据已收集完成。")
        break
    else:
        processed_idx += current_result
        print(f"当前已处理到第 {processed_idx} 个ID,更换代理继续...")

关键修改说明

  • 显式等待替代隐式等待:设置10秒超时,快速判断元素是否存在,避免长时间等待卡顿。
  • driver.quit()替代driver.close():彻底终止驱动进程,释放系统资源,解决卡顿问题。
  • 新增断点续传逻辑:记录已处理ID的索引,处理中断后可从断点继续,无需重复下载。
  • 文件句柄自动管理:用with语句自动关闭文件,避免资源泄漏。
  • 循环终止条件:当所有ID处理完成后自动退出循环,避免无限运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:31