Kasus Penggunaan

Scraping Situs Web yang Dilindungi CAPTCHA

Sebagian besar situs web bernilai tinggi menggunakan CAPTCHA sebagai bagian dari pertahanan anti-botnya. Panduan ini mencakup strategi untuk melakukan scraping situs-situs ini dengan andal menggunakan CaptchaAI, termasuk cara mengidentifikasi jenis CAPTCHA, menyelesaikannya secara otomatis, dan membuat scraper yang tangguh.

Implementasi CAPTCHA Umum

CAPTCHA Dimana Digunakan Metode CaptchaAI
reCAPTCHA v2 Formulir login, halaman pencarian method=userrecaptcha
reCAPTCHA v3 Penilaian latar belakang di halaman mana pun method=userrecaptcha&version=v3
Cloudflare Turnstile Situs di balik Cloudflare method=turnstile
Cloudflare Challenge Blok Cloudflare satu halaman penuh method=cloudflare_challenge
Gambar/OCR CAPTCHA Situs warisan, Amazon method=base64
hCaptcha Situs yang berfokus pada privasi method=hcaptcha

Strategi 1: Deteksi dan Selesaikan Sesuai Request

Pendekatan yang paling dapat diandalkan – scraping secara normal dan menyelesaikan CAPTCHA hanya jika muncul:

import requests
import time
from bs4 import BeautifulSoup

API_KEY = "YOUR_API_KEY"

class ProtectedScraper:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def scrape(self, url):
        resp = self.session.get(url)

        # Check for CAPTCHA
        if self._has_captcha(resp.text):
            resp = self._handle_captcha(resp.text, url)

        return resp.text

    def _has_captcha(self, html):
        indicators = ["g-recaptcha", "cf-turnstile", "h-captcha", "captcha"]
        return any(ind in html.lower() for ind in indicators)

    def _handle_captcha(self, html, url):
        soup = BeautifulSoup(html, "html.parser")

        # reCAPTCHA v2
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            token = self._solve_recaptcha(rc["data-sitekey"], url)
            return self.session.post(url, data={"g-recaptcha-response": token})

        # Cloudflare Turnstile
        ts = soup.find("div", class_="cf-turnstile")
        if ts:
            token = self._solve_turnstile(ts["data-sitekey"], url)
            return self.session.post(url, data={"cf-turnstile-response": token})

        raise Exception("Unknown CAPTCHA type")

    def _solve_recaptcha(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "userrecaptcha",
            "googlekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _solve_turnstile(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "turnstile",
            "sitekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _poll(self, task_id):
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get", "id": task_id
            })
            if result.text == "CAPCHA_NOT_READY": continue
            if result.text.startswith("OK|"): return result.text.split("|")[1]
            raise Exception(result.text)
        raise TimeoutError()

# Usage
scraper = ProtectedScraper()
html = scraper.scrape("https://example.com/data")

Strategi 2: Solve Awal untuk Halaman CAPTCHA yang Diketahui

Jika Anda mengetahui halaman mana yang selalu memiliki CAPTCHA, selesaikan terlebih dahulu:

def scrape_known_captcha_page(url, site_key):
    # Solve before even loading the page
    token = solve_recaptcha(site_key, url)

    # Submit directly with token
    resp = requests.post(url, data={
        "g-recaptcha-response": token,
        "query": "search term"
    })
    return resp.text

Strategi 3: Situs yang Dilindungi Cloudflare

Situs di belakang Cloudflare sering kali memerlukan cookie qa_validation_cookie:

def get_cloudflare_clearance(url, proxy):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "cloudflare_challenge",
        "pageurl": url,
        "proxy": proxy,
        "proxytype": "HTTP"
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if "qa_validation_cookie" in result.text:
            # Parse qa_validation_cookie and user_agent from response
            return result.text
    raise TimeoutError()

Pola Scraping Multi-Halaman

def scrape_multiple_pages(base_url, site_key, pages):
    scraper = ProtectedScraper()
    results = []

    for page in pages:
        url = f"{base_url}?page={page}"
        try:
            html = scraper.scrape(url)
            soup = BeautifulSoup(html, "html.parser")
            items = soup.find_all("div", class_="item")
            results.extend([item.text.strip() for item in items])
            print(f"Page {page}: {len(items)} items")
        except Exception as e:
            print(f"Page {page} failed: {e}")

        time.sleep(random.uniform(2, 5))

    return results

Pemecahan Masalah

Masalah Perbaiki
CAPTCHA muncul di setiap halaman Gunakan proxy; mengurangi tingkat request
Token ditolak setelah diselesaikan Token mungkin telah kedaluwarsa; gunakan dalam waktu 120 detik
Cloudflare memblokir meskipun ada izin Gunakan proxy dan agen pengguna yang sama untuk semua request
Situs mengembalikan halaman berbeda setelah solve Periksa pengalihan atau cookie tambahan

Pertanyaan Umum

Situs mana yang paling sulit untuk dikikis?

Situs yang menggunakan Cloudflare Enterprise, PerimeterX, atau Akamai Bot Manager adalah yang paling menantang. CaptchaAI menangani komponen CAPTCHA-nya; gabungkan dengan browser tersembunyi dan proxy untuk hasil terbaik.

Bisakah saya scraping situs yang memerlukan login?

Ya. Masuk terlebih dahulu (selesaikan CAPTCHA login apa pun), pertahankan cookie sesi, lalu kikis halaman yang diautentikasi. CaptchaAI menangani CAPTCHA pada tahap apa pun.

Bagaimana cara menangani halaman yang dirender JavaScript?

Gunakan Selenium, Puppeteer, atau Playwright untuk merender JavaScript, lalu ekstrak parameter CAPTCHA dan selesaikan melalui CaptchaAI. MelihatPenanganan Selenium CAPTCHA.

Panduan Terkait

  • Cara Menangani Tantangan CAPTCHA dalam Alur Kerja Scraping Web
  • Masalah CAPTCHA Browser Headless
  • Deteksi CAPTCHA dalam Scraping Dijelaskan
Komentar dinonaktifkan untuk artikel ini.