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

如何用2Captcha+Python Selenium/Scrapy调用回调函数破解Recaptcha V2

问题描述

我需要爬取mobile.de的车辆搜索页面,访问搜索结果前必须完成带回调函数的Recaptcha V2验证。通过2captcha服务已成功获取验证token,在Chrome开发者工具控制台中能正常调用以下回调函数完成验证:

window[___grecaptcha_cfg.clients[0].o.o.callback]('captcha_token')

或

verifyAkReCaptcha('captcha_token')

但使用Python Selenium的driver.execute_script()方法调用这些函数时却报错,甚至执行页面滚动这类标准JS操作也失败,推测目标网站通过反爬机制阻止了自动化工具执行JS。现需解决:获取2captcha的token后,如何成功调用回调函数完成验证?

补充信息:

  • 支持使用的自动化框架:Python Selenium或Scrapy
  • 报错内容:提示___grecaptcha_cfg is not defined和verifyAkReCaptcha is not defined
  • 当前使用的Python代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from twocaptcha import TwoCaptcha
from dotenv import load_dotenv
import os

# Load environment variables
load_dotenv()

# Instantiate a solver object
solver = TwoCaptcha(os.getenv("CAPTCHA_API_KEY"))
sitekey = "6Lfwdy4UAAAAAGDE3YfNHIT98j8R1BW1yIn7j8Ka"
url = "https://suchen.mobile.de/fahrzeuge/search.html?dam=0&isSearchRequest=true&ms=8600%3B51%3B%3B&ref=quickSearch&sb=rel&vc=Car"

# Set chrome options
chrome_options = Options()
chrome_options.add_argument('start-maximized') # Required for a maximized Viewport
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation'])
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en,en_US'})

# Instantiate a browser object and navigate to the URL
driver = webdriver.Chrome(chrome_options=chrome_options)

driver.get(url)

driver.maximize_window()

def solve(sitekey, url):
    try:
        result = solver.recaptcha(sitekey=sitekey, url=url)
    except Exception as e:
        exit(e)

    return result.get('code')

captcha_key = solve(sitekey=sitekey, url=url)
print(captcha_key)

# driver.execute_script(f"window[___grecaptcha_cfg.clients[0].o.o.callback]('{captcha_key}')") # This step fails in Python but runs successfully in the console
# driver.execute_script(f"verifyAkReCaptcha('{captcha_key}')") # This step fails in Python but runs successfully in the console
解决方案

1. 强化Selenium反检测配置

目标网站大概率通过navigator.webdriver等浏览器特征识别自动化工具,需补充Chrome选项隐藏这些特征:

chrome_options = Options()
chrome_options.add_argument('start-maximized')
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation'])
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en,en_US'})
# 新增反检测参数
chrome_options.add_argument('--disable-blink-features=AutomationControlled')  # 禁用自动化控制标识
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--disable-infobars') # 禁用浏览器提示条

此外,可注入stealth.min.js脚本进一步隐藏Selenium痕迹(需自行下载该脚本):

# 注入stealth脚本
with open('stealth.min.js', 'r') as f:
    stealth_script = f.read()
driver.execute_script(stealth_script)

2. 调整JS执行逻辑,规避全局变量保护

网站可能对全局变量做了隔离保护,换一种更稳健的方式调用回调函数:

# 尝试多种方式调用回调,确保兼容性
try:
    # 先尝试从grecaptcha配置中提取回调
    driver.execute_script(f"""
        function getCaptchaCallback() {{
            if (typeof ___grecaptcha_cfg !== 'undefined' && ___grecaptcha_cfg.clients.length > 0) {{
                return window[___grecaptcha_cfg.clients[0].o.o.callback];
            }} else if (typeof verifyAkReCaptcha !== 'undefined') {{
                return window.verifyAkReCaptcha;
            }}
            return null;
        }}
        var callback = getCaptchaCallback();
        if (callback) {{
            callback('{captcha_key}');
            console.log('回调函数调用成功');
        }} else {{
            console.error('未找到回调函数');
        }}
    """)
except Exception as e:
    print(f"调用失败:{str(e)}")
    # 降级尝试:直接调用verifyAkReCaptcha
    driver.execute_script(f"verifyAkReCaptcha('{captcha_key}')")

3. 换用Playwright替代Selenium

如果Selenium的反爬规避效果不佳,推荐使用Playwright,它对浏览器自动化的模拟更接近真实用户,反爬检测难度更低:

from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha
from dotenv import load_dotenv
import os

load_dotenv()
solver = TwoCaptcha(os.getenv("CAPTCHA_API_KEY"))
sitekey = "6Lfwdy4UAAAAAGDE3YfNHIT98j8R1BW1yIn7j8Ka"
url = "https://suchen.mobile.de/fahrzeuge/search.html?dam=0&isSearchRequest=true&ms=8600%3B51%3B%3B&ref=quickSearch&sb=rel&vc=Car"

def solve_captcha(sitekey, url):
    try:
        result = solver.recaptcha(sitekey=sitekey, url=url)
        return result.get('code')
    except Exception as e:
        exit(e)

captcha_key = solve_captcha(sitekey, url)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto(url)
    # 调用回调函数完成验证
    page.evaluate(f"verifyAkReCaptcha('{captcha_key}')")
    # 后续爬取操作...
    browser.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:50:32