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

如何用BeautifulSoup抓取reCAPTCHA验证任务文本?

抓取reCAPTCHA验证任务文本的方法

你需要抓取reCAPTCHA验证弹窗里的任务指令文本(比如要求选择所有“汽车”时的对应内容),目标元素是<strong style="font-size: 22px;">cars</strong>。你的现有代码无法获取到该内容,核心问题是没有切换到reCAPTCHA弹窗所在的iframe——验证弹窗的内容嵌入在独立iframe中,直接获取主页面的page_source拿不到里面的元素。

解决思路

  1. 点击初始reCAPTCHA按钮后,定位并切换到弹窗的iframe
  2. 等待任务文本元素加载完成
  3. 可通过Selenium直接定位元素获取文本,或切换iframe后用BeautifulSoup解析

修改后的代码示例

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
from bs4 import BeautifulSoup
import time

driver = webdriver.Chrome(path)
captcha_url = 'https://www.google.com/recaptcha/api2/demo'
driver.get(captcha_url)

# 点击初始reCAPTCHA按钮
wait = WebDriverWait(driver, 20)
initial_captcha = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="recaptcha-demo"]/div/div/iframe')))
initial_captcha.click()
time.sleep(2)

# 切换到验证弹窗的iframe(用src包含特定字符串的定位方式更稳定)
captcha_iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src*="recaptcha/api2/bframe"]')))
driver.switch_to.frame(captcha_iframe)

# 方法1:用Selenium直接获取任务文本
task_text = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'strong[style="font-size: 22px;"]'))).text
print("任务文本:", task_text)

# 方法2:切换iframe后用BeautifulSoup解析
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")
task_strong = soup.find('strong', style="font-size: 22px;")
if task_strong:
    print("任务文本(BeautifulSoup):", task_strong.get_text())

# 切回主页面(后续需操作主页面时使用)
driver.switch_to.default_content()

关键注意点

  • reCAPTCHA的iframe会动态生成,用src*="recaptcha/api2/bframe"这种模糊匹配的CSS选择器比固定ID更可靠
  • 优先用WebDriverWait显式等待元素加载,减少固定time.sleep的使用,提升代码稳定性
  • reCAPTCHA有反爬机制,频繁自动化操作可能触发更严格的验证,甚至封禁IP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:32:40