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

如何通过Python+Selenium获取Network下Fetch/XHR的Preview内验证码

问题

我需要编写Python代码实现以下功能:

  1. 访问网站https://tmrsearch.ipindia.gov.in/eregister/
  2. 点击左侧第一个按钮“Trade Mark Applications/Registered Mark”,勾选National/IRDI Number复选框进入目标页面
  3. 点击验证码下方的音频按钮后,抓取Network面板中Fetch/XHR请求返回的Preview里的验证码内容,并打印到控制台

我已经完成了导航到目标页面的代码,现在需要补充抓取验证码的部分:

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

driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://tmrsearch.ipindia.gov.in/eregister/")
wait = WebDriverWait(driver, 10)

# switch into the frame context
wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "eregoptions")))

# click on the targeted element
wait.until(EC.element_to_be_clickable((By.ID, "btnviewdetails"))).click()

# come out of frame
driver.switch_to.default_content()
time.sleep(10)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "showframe")))

# click on the targeted element
wait.until(EC.element_to_be_clickable((By.ID, "rdb_0"))).click()

# come out of frame
driver.switch_to.default_content()
time.sleep(10)

解决方案

要抓取Fetch/XHR请求返回的验证码,需借助Selenium的Chrome DevTools监听网络请求,步骤如下:

  1. 配置Chrome DevTools启用网络监听,过滤Fetch/XHR类型请求
  2. 切换到验证码所在的frame,点击音频按钮触发目标请求
  3. 捕获对应请求的响应内容,提取验证码

完整代码如下:

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://tmrsearch.ipindia.gov.in/eregister/")
wait = WebDriverWait(driver, 10)

# 导航到目标页面
wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "eregoptions")))
wait.until(EC.element_to_be_clickable((By.ID, "btnviewdetails"))).click()
driver.switch_to.default_content()
time.sleep(2)

wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, "showframe")))
wait.until(EC.element_to_be_clickable((By.ID, "rdb_0"))).click()
# 切换到包含验证码的子frame
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe")))

# 启用Chrome DevTools网络监听
driver.execute_cdp_cmd('Network.enable', {})

captured_code = None
def capture_response(event):
    global captured_code
    # 根据请求URL特征定位验证码音频请求(可根据实际抓包结果调整)
    if 'CaptchaAudio.ashx' in event['params']['request']['url']:
        # 获取请求响应体
        response = driver.execute_cdp_cmd('Network.getResponseBody', {
            'requestId': event['params']['requestId']
        })
        captured_code = response['body']

# 添加响应监听事件
driver.add_cdp_listener('Network.responseReceived', capture_response)

# 点击音频按钮触发请求
wait.until(EC.element_to_be_clickable((By.ID, "imgAudio"))).click()
# 等待请求完成
time.sleep(3)

# 打印验证码
if captured_code:
    print(f"验证码:{captured_code}")
else:
    print("未捕获到验证码请求")

# 清理监听资源
driver.remove_cdp_listener('Network.responseReceived', capture_response)
driver.execute_cdp_cmd('Network.disable', {})
driver.quit()

关键说明

  • 网络监听配置:通过Network.enable开启网络监控,Network.responseReceived事件捕获所有响应
  • 请求筛选:通过URL中的CaptchaAudio.ashx特征定位验证码请求,需根据实际抓包结果调整匹配规则
  • 响应解析:使用Network.getResponseBody获取请求的响应内容,直接提取验证码文本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:40:59