Когда парсер достигает задачи reCAPTCHA v2, рабочий процесс останавливается. Страница ждет, пока человек установит флажок или сетку изображения, прежде чем предоставлять необходимые вам данные. быстрый по нашей внутренней выборке способ возобновить парсинг — направить CAPTCHA в API решателя: извлеките ключ сайта и URL-адрес страницы, отправьте их наCaptchaAI, получите действительный токен и вставьте его обратно на страницу.
В этом руководстве показан полный процесс работы с рабочим кодом для Python (Selenium + запросы) и Node.js (Puppeteer).
Как работает рабочий процесс
Каждый виджет reCAPTCHA v2 имеет два параметра, необходимые вашему парсеру:
googlekey— общедоступный ключ сайта, встроенный в HTML-код страницы.pageurl— URL-адрес, на котором отображается CAPTCHA.
Ваш парсер отправляет их в API CaptchaAI, ждет решенного токена и вводит токен обратно в поле g-recaptcha-response страницы (или вызывает функцию обратного вызова). Серверная часть целевого сайта проверяет токен на соответствие Google и пропускает запрос.
Питон: Селен + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")
# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url
# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": 1
}).json()
task_id = response["request"]
# Step 4: Poll for result
token = None
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve failed: {result['request']}")
# Step 5: Inject the token and submit
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Check for callback
callback = driver.execute_script(
'var el = document.querySelector(".g-recaptcha"); '
'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
driver.execute_script(f'{callback}("{token}");')
else:
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()
Node.js: Puppeteer + CaptchaAI
const puppeteer = require("puppeteer");
async function scrapeWithCaptcha(url) {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle2" });
// Extract sitekey
const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);
// Submit to CaptchaAI
const submitRes = await fetch(
`https://ocr.captchaai.com/in.php?${new URLSearchParams({
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: url,
json: 1,
})}`
);
const { request: taskId } = await submitRes.json();
// Poll for result
let token;
for (let i = 0; i < 40; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(
`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: "YOUR_API_KEY",
action: "get",
id: taskId,
json: 1,
})}`
);
const data = await res.json();
if (data.status === 1) {
token = data.request;
break;
}
if (data.request !== "CAPCHA_NOT_READY")
throw new Error(`Solve failed: ${data.request}`);
}
// Inject token
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
if (cb && window[cb]) window[cb](t);
}, token);
// Wait for navigation after form submit
await page.waitForNavigation({ waitUntil: "networkidle2" });
const content = await page.content();
await browser.close();
return content;
}
scrapeWithCaptcha("https://example.com/protected-page").then(console.log);
headless-режим и headed-режимы
Некоторые сайты обнаруживают headless-браузеры и блокируют их еще до появления CAPTCHA. Если вас заблокировали до того, как вы увидели reCAPTCHA:
- Используйте
headless: "new"в «Puppeteer» (новый стандартная конфигурация браузера-режим). - Добавьте
--disable-blink-features=AutomationControlledк флагам Chromium. - Используйте настоящую строку User-Agent.
- Рассмотрите возможность использования ротации прокси с вашими решениями CaptchaAI.
Только HTTP-подход (без браузера)
Если целевой сайт отправляет CAPTCHA в процессе отправки формы, вы можете полностью пропустить браузер:
import requests
import time
session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
# Load the page to get cookies
session.get("https://example.com/protected-page")
# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..." # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY", "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": "https://example.com/protected-page",
"json": 1
}).json()
task_id = solve_resp["request"]
time.sleep(15)
# Poll
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
time.sleep(5)
# Submit with token
resp = session.post("https://example.com/protected-page", data={
"g-recaptcha-response": token,
"other_field": "value"
})
print(resp.text[:500])
Часто задаваемые вопросы
Замедляет ли решение reCAPTCHA v2 мой парсер?
Каждое решение занимает 15–60 секунд. Для парсинга большого объема запустите несколько решений параллельно (CaptchaAI поддерживает одновременные задачи для каждого потока).
Могу ли я кэшировать токены reCAPTCHA?
Нет. Каждый токен одноразовый, срок его действия истекает примерно через 2 минуты. Вам нужно новое решение для каждого запроса защищенной страницы.
Нужен ли мне браузер для обработки reCAPTCHA v2?
Не всегда. Если сайт принимает g-recaptcha-response в качестве поля POST, вы можете использовать подход только для HTTP. Если сайт требует передача токена во внутренний QA endpoint на основе JavaScript, вам понадобится браузер.
Как мне обрабатывать ротацию прокси с помощью CaptchaAI?
CaptchaAI решает CAPTCHA на собственной инфраструктуре — вам не нужно передавать свой прокси для стандартного reCAPTCHA v2. Используйте свои прокси для последующих запросов на парсинг.
Что делать, если на сайте используется Enterprise reCAPTCHA?
Добавьте enterprise=1 к вашему запросу CaptchaAI. ВидетьКак решить reCAPTCHA v2 Enterprise с помощью API.
Начать парсить через reCAPTCHA v2
- Получите ключ API по адресуcaptchaai.com/api.php
- Извлеките ключ сайта с целевой страницы
- Используйте приведенные выше примеры кода для решения и внедрения
- Масштабируйте с помощью параллельных решений для больших рабочих процессов
Связанные руководства
- Как решить reCAPTCHA v2 с помощью API
- Обработка Selenium CAPTCHA с помощью Python
- Решение капчи «Puppeteer» Node.js
- Распространенные ошибки решения reCAPTCHA v2