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

如何解决印度知识产权局网站带验证码链式爬取及Excel导出报错问题

问题分析与修复方案

核心错误原因

你的代码抛出NameError: name 'driver' is not defined,根源是:

  • Chrome驱动的初始化代码被完全注释,没有创建driver实例
  • wait = WebDriverWait(driver, 15)写在driver实例化之前,此时driver变量还未定义

分步修复

1. 恢复并修正驱动初始化代码

取消注释驱动配置代码,替换为你本地ChromeDriver的实际路径,同时把wait的定义移到driver实例化之后:

import csv
import json
from time import sleep, time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException


def save_to_csv(data: list) -> None:
    with open(file='ipindiaservices.csv', mode='a', encoding="utf-8") as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerow([*data])

# 保留其他函数不变

# ---- 修复驱动初始化部分 ----
options = webdriver.ChromeOptions()
# 调试阶段建议关闭无头模式,方便观察页面
# options.add_argument('--headless')
options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = {"performance": "ALL"}
# 替换为你的ChromeDriver实际路径,Windows系统需加.exe后缀
service = Service(executable_path="./chromedriver.exe")
driver = webdriver.Chrome(service=service, options=options, desired_capabilities=capabilities)
wait = WebDriverWait(driver, 15)  # 必须在driver实例化后定义

# 后续代码保持不变

2. 修复验证码函数的递归无返回值问题

当前get_captcha_text递归调用时没有返回值,会导致captcha_text为None,修改后确保递归能返回结果:

def get_captcha_text(driver: WebDriver, timeout: float) -> str:
    driver.execute_script(
        """
        document.querySelector('img[title="Captcha  Audio"]').click()
        """
    )
    sleep(timeout)
    logs = driver.get_log('performance')
    responses = [get_network_data(log, driver) for log in logs if get_network_data(log, driver)]
    if responses:
        return json.loads(responses[0]['body'])['CaptchaImageText']
    else:
        return get_captcha_text(driver, timeout)  # 添加return,确保递归返回值

3. 优化CSV写入逻辑(可选)

当前代码仅追加数据,没有写入表头,建议在脚本启动时先写入表头,避免导出的Excel无字段标识:

# 在驱动初始化之前添加表头写入
with open(file='ipindiaservices.csv', mode='w', encoding="utf-8") as f:
    writer = csv.writer(f, lineterminator='\n')
    # 根据页面实际字段调整表头内容
    writer.writerow(["申请号", "申请标题", "申请日期", "申请状态", "申请人信息"])

4. 增加验证码重试上限(可选)

避免无限递归获取验证码,添加最大重试次数限制:

def get_captcha_text(driver: WebDriver, timeout: float, max_retries=3) -> str:
    driver.execute_script(
        """
        document.querySelector('img[title="Captcha  Audio"]').click()
        """
    )
    sleep(timeout)
    logs = driver.get_log('performance')
    responses = [get_network_data(log, driver) for log in logs if get_network_data(log, driver)]
    if responses:
        return json.loads(responses[0]['body'])['CaptchaImageText']
    elif max_retries > 0:
        print("验证码获取失败,重试中...")
        return get_captcha_text(driver, timeout, max_retries-1)
    else:
        raise RuntimeError("验证码多次获取失败,终止脚本")

其他注意事项

  • 确保Chrome浏览器版本与ChromeDriver版本完全匹配,否则会出现驱动兼容性错误
  • 网站存在反爬机制,建议调整sleep时长,避免过快触发限制
  • 若音频验证码接口变更,需同步修改get_network_data中的接口匹配逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:55:14