如何通过Python+Selenium获取Network下Fetch/XHR的Preview内验证码
问题
我需要编写Python代码实现以下功能:
- 访问网站
https://tmrsearch.ipindia.gov.in/eregister/ - 点击左侧第一个按钮“Trade Mark Applications/Registered Mark”,勾选National/IRDI Number复选框进入目标页面
- 点击验证码下方的音频按钮后,抓取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监听网络请求,步骤如下:
- 配置Chrome DevTools启用网络监听,过滤Fetch/XHR类型请求
- 切换到验证码所在的frame,点击音频按钮触发目标请求
- 捕获对应请求的响应内容,提取验证码
完整代码如下:
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
相关产品推荐
相关产品推荐

