Teknik Açıklamalar

Web Scraping İş Akışlarında reCAPTCHA v2 Nasıl Kullanılır

Kazıyıcınız bir reCAPTCHA v2 mücadelesine çarptığında iş akışı durur. Sayfa, ihtiyacınız olan verileri sunmadan önce bir kişinin onay kutusunu veya resim ızgarasını çözmesini bekler. Kazımaya devam etmenin en hızlı yolu CAPTCHA'yı bir çözücü API'sine yönlendirmektir: site anahtarını ve sayfa URL'sini çıkarın, bunlarıCaptchaAI, geçerli bir jeton alın ve onu tekrar sayfaya enjekte edin.

Bu kılavuz, Python (Selenium + request) ve Node.js (Puppeteer) için çalışma kodunu içeren akışın tamamını gösterir.


İş akışı nasıl çalışır?

Her reCAPTCHA v2 widget'ının kazıyıcınızın ihtiyaç duyduğu iki parametresi vardır:

  1. googlekey — sayfa HTML'sine yerleştirilmiş genel site anahtarı
  2. pageurl — CAPTCHA'nın göründüğü URL

Kazıyıcınız bunları CaptchaAI API'sine gönderir, çözülmüş bir belirteci bekler ve belirteci sayfanın g-recaptcha-response alanına geri enjekte eder (veya geri çağırma işlevini çağırır). Hedef sitenin arka ucu, jetonu Google'a karşı doğrular ve isteğin iletilmesine izin verir.


Python: Selenyum + 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 ve başlı mod

Bazı siteler headless tarayıcıları algılar ve CAPTCHA görünmeden onları engeller. reCAPTCHA'yı görmeden engellenirseniz:

  • Puppeteer'da headless: "new" kullanın (daha yeni gizlilik modu)
  • --no-sandbox'yi Chromium işaretlerine ekleyin
  • Gerçek bir Kullanıcı Aracısı dizesi kullanın
  • CaptchaAI çözümlerinizle proxy rotasyonunu kullanmayı düşünün

Yalnızca HTTP yaklaşımı (tarayıcı yok)

Hedef site CAPTCHA'yı bir form gönderme akışında gönderirse tarayıcıyı tamamen atlayabilirsiniz:

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])

SSS

reCAPTCHA v2'yi çözmek kazıyıcımı yavaşlatır mı?

Her çözüm 15-60 saniye sürer. Yüksek hacimli kazıma için birden fazla çözümü paralel olarak çalıştırın (CaptchaAI, iş parçacığı başına eşzamanlı görevleri destekler).

reCAPTCHA belirteçlerini önbelleğe alabilir miyim?

Hayır. Her jeton tek kullanımlıktır ve kullanım süresi yaklaşık 2 dakika sonra sona erer. Her korumalı sayfa isteği için yeni bir çözüme ihtiyacınız var.

reCAPTCHA v2'yi işlemek için bir tarayıcıya ihtiyacım var mı?

Her zaman değil. Site g-recaptcha-response'yi POST alanı olarak kabul ederse, yalnızca HTTP yaklaşımını kullanabilirsiniz. Site JavaScript tabanlı jeton enjeksiyonu gerektiriyorsa bir tarayıcıya ihtiyacınız vardır.

CaptchaAI ile QA test oturumu'leri nasıl yönetirim?

CaptchaAI, CAPTCHA'ları kendi altyapısında çözer; standart reCAPTCHA v2 için proxy'nizi aktarmanıza gerek yoktur. Aşağıdaki kazıma istekleri için proxy'lerinizi kullanın.

Site Enterprise reCAPTCHA kullanıyorsa ne olur?

CaptchaAI isteğinize enterprise=1 ekleyin. GörmekAPI Kullanarak reCAPTCHA v2 Enterprise Nasıl Çözülür?.


reCAPTCHA v2 ile kazımaya başlayın

  1. API anahtarınızı şu adresten alın:captchaai.com/api.php
  2. Site anahtarını hedef sayfadan çıkarın
  3. Çözmek ve enjekte etmek için yukarıdaki kod örneklerini kullanın
  4. Yüksek hacimli iş akışları için eş zamanlı çözümlerle ölçeklendirme

İlgili kılavuzlar

Bu makale için yorumlar devre dışı bırakılmıştır.