如何用BeautifulSoup抓取reCAPTCHA验证任务文本?
抓取reCAPTCHA验证任务文本的方法
你需要抓取reCAPTCHA验证弹窗里的任务指令文本(比如要求选择所有“汽车”时的对应内容),目标元素是<strong style="font-size: 22px;">cars</strong>。你的现有代码无法获取到该内容,核心问题是没有切换到reCAPTCHA弹窗所在的iframe——验证弹窗的内容嵌入在独立iframe中,直接获取主页面的page_source拿不到里面的元素。
解决思路
- 点击初始reCAPTCHA按钮后,定位并切换到弹窗的iframe
- 等待任务文本元素加载完成
- 可通过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
相关产品推荐
相关产品推荐

