如何用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
相关产品推荐
相关产品推荐

