Integrations

Octoparse + CaptchaAI: Visual Scraping dengan Penanganan CAPTCHA

Octoparse berhenti mengekstrak begitu sebuah reCAPTCHA muncul di halaman target — dan karena alatnya berbasis visual tanpa kode, tidak ada tempat untuk menempelkan solver. Jalan keluarnya sederhana: selesaikan CAPTCHA di luar Octoparse memakai satu skrip Python kecil dengan CaptchaAI, ekspor cookie sesi yang sudah tervalidasi, lalu impor cookie itu ke task Octoparse Anda. Panduan ini menunjukkan dua pola integrasi yang bisa langsung dipakai.

Kenapa CAPTCHA menghentikan task Octoparse

Octoparse unggul untuk pekerjaan scraping visual: Anda menunjuk elemen di layar dan alat merakit alur ekstraksi tanpa satu baris kode. Kelemahannya muncul ketika situs target memasang CAPTCHA — Octoparse tidak punya cara bawaan yang andal untuk menyelesaikannya, sehingga task berhenti atau mengembalikan halaman kosong.

Skenario Apa yang terjadi
reCAPTCHA di halaman target Ekstraksi berhenti, perlu penyelesaian manual
Cloudflare Challenge Halaman termuat tetapi tidak ada data yang terekstrak
CAPTCHA akibat rate limiting Setelah N halaman, tantangan CAPTCHA muncul
Data di balik login Formulir login memuat CAPTCHA sebelum sesi terbentuk

CaptchaAI menyelesaikan reCAPTCHA v2 dan v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, serta CAPTCHA gambar/OCR — semua tipe yang paling sering menghentikan scraper Octoparse.

Dua pola integrasi

Karena Octoparse tidak mengekspos titik untuk memanggil API solver, kedua pola di bawah menjalankan penyelesaian CAPTCHA di sisi Python, lalu menyerahkan hasilnya kembali ke Octoparse:

  1. Validasi awal + injeksi cookie — cocok untuk data di balik login. Anda login sekali via skrip, lalu Octoparse memakai cookie sesinya.
  2. Ekstraksi berbasis API — cocok untuk banyak halaman ber-CAPTCHA. Skrip menyelesaikan CAPTCHA per URL dan mengambil datanya langsung.

Pola ini menyelesaikan CAPTCHA di halaman login satu kali, lalu mengekspor cookie terautentikasi ke format yang bisa diimpor Octoparse. Alurnya mengikuti empat langkah standar CaptchaAI: kirim task ke in.php, simpan task ID, polling res.php sampai token siap, lalu pakai token pada form login.

import requests
import time
import json


class OctoparseCaptchaHelper:
    """Solve CAPTCHAs and export cookies for Octoparse."""

    def __init__(self, api_key):
        self.api_key = api_key
        self.session = requests.Session()

    def solve_and_get_cookies(self, login_url, sitekey, credentials):
        """
        Solve login CAPTCHA and return session cookies.

        Steps:

        1. Visit login page to get initial cookies
        2. Solve CAPTCHA via CaptchaAI
        3. Submit login form with token
        4. Export authenticated cookies
        """
        # Step 1: Get initial cookies
        self.session.get(login_url, timeout=15)

        # Step 2: Solve CAPTCHA
        token = self._solve_recaptcha(sitekey, login_url)

        # Step 3: Submit login
        login_data = {
            **credentials,
            "g-recaptcha-response": token,
        }
        resp = self.session.post(login_url, data=login_data, timeout=30)

        if resp.status_code != 200:
            raise RuntimeError(f"Login failed: {resp.status_code}")

        # Step 4: Export cookies
        cookies = []
        for cookie in self.session.cookies:
            cookies.append({
                "name": cookie.name,
                "value": cookie.value,
                "domain": cookie.domain,
                "path": cookie.path,
            })

        return cookies

    def export_cookies_for_octoparse(self, cookies, output_file="cookies.json"):
        """Save cookies in format importable by Octoparse."""
        with open(output_file, "w") as f:
            json.dump(cookies, f, indent=2)
        print(f"Cookies saved to {output_file}")
        print(f"Import these in Octoparse: Task → Advanced Settings → Cookies")

    def _solve_recaptcha(self, sitekey, pageurl):
        """Solve reCAPTCHA via CaptchaAI."""
        resp = requests.post("https://ocr.captchaai.com/in.php", data={
            "key": self.api_key,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": 1,
        }, timeout=30)
        result = resp.json()

        if result.get("status") != 1:
            raise RuntimeError(f"Submit error: {result.get('request')}")

        task_id = result["request"]
        time.sleep(15)

        for _ in range(24):
            resp = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get",
                "id": task_id, "json": 1,
            }, timeout=15)
            data = resp.json()

            if data.get("status") == 1:
                return data["request"]
            if data["request"] != "CAPCHA_NOT_READY":
                raise RuntimeError(data["request"])
            time.sleep(5)

        raise TimeoutError("Solve timeout")


# Usage
helper = OctoparseCaptchaHelper("YOUR_API_KEY")

cookies = helper.solve_and_get_cookies(
    login_url="https://staging.example.com/qa-login",
    sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    credentials={"username": "user", "password": "pass"},
)

helper.export_cookies_for_octoparse(cookies)

Hasilnya adalah cookies.json yang tinggal Anda muat lewat Task → Advanced Settings → Cookies di Octoparse. Selama cookie sesi masih berlaku, task berjalan tanpa menyentuh halaman login lagi.

Pola 2: ekstraksi berbasis API

Bila data yang Anda butuhkan tersebar di banyak halaman yang masing-masing dilindungi CAPTCHA, injeksi cookie saja tidak cukup. Di sini skrip Python menyelesaikan CAPTCHA per URL dan mengambil datanya langsung, memberi Anda kontrol penuh atas retry dan jeda antar-permintaan:

def extract_with_captcha(api_key, urls, sitekey):
    """Extract data from CAPTCHA-protected pages."""
    results = []

    for url in urls:
        print(f"Processing: {url}")

        # Solve CAPTCHA for this page
        helper = OctoparseCaptchaHelper(api_key)
        token = helper._solve_recaptcha(sitekey, url)

        # Access page with token
        resp = requests.post(url, data={
            "g-recaptcha-response": token,
        }, timeout=30)

        # Parse response
        if resp.status_code == 200:
            results.append({
                "url": url,
                "content_length": len(resp.text),
                "status": "success",
            })
        else:
            results.append({
                "url": url,
                "status": f"failed ({resp.status_code})",
            })

        time.sleep(3)  # Rate limit

    return results

Perhatikan time.sleep(3) di akhir loop: jeda antar-permintaan menahan laju agar situs target tidak memicu lebih banyak CAPTCHA. Untuk beban besar, tambahkan percobaan ulang dengan jeda yang meningkat eksponensial (exponential backoff) alih-alih menyerah pada error pertama.

Konfigurasi Octoparse yang penting

Beberapa pengaturan menentukan apakah cookie hasil validasi benar-benar terpakai saat task berjalan:

Pengaturan Rekomendasi
Tunggu pemuatan halaman Setel 10+ detik untuk halaman ber-CAPTCHA
Retry saat error Aktifkan, 3 kali percobaan
Impor cookie Pakai cookie hasil ekspor dari helper
Ekstraksi cloud Jalankan cloud Octoparse dengan cookie yang sudah divalidasi
Ekstraksi lokal Pakai mode lokal untuk validasi CAPTCHA awal

Cookie sesi punya masa berlaku. Untuk task terjadwal — misalnya price monitoring harian yang jamak dikerjakan tim data dan freelancer scraping di Indonesia — jalankan helper Python lewat cron atau Task Scheduler agar cookie disegarkan sesaat sebelum setiap run Octoparse. Bila Anda deploy di cloud, region seperti AWS ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta) menekan latensi ke banyak situs lokal.

Soal biaya, model CaptchaAI berbasis thread, bukan per solve: satu thread adalah satu CAPTCHA yang sedang diproses, dan setiap paket memberi solve tak terbatas per thread selama sebulan. Paket BASIC mulai $15/bulan dengan 5 threads — cukup untuk sebagian besar task Octoparse tunggal, dan bisa dinaikkan saat Anda menjalankan banyak ekstraksi paralel. Terakhir, scraping data di balik login menyentuh UU Pelindungan Data Pribadi (UU 27/2022): ambil hanya data yang berhak Anda proses dan hindari data pribadi orang lain.

Pertanyaan umum

Tipe CAPTCHA apa saja yang bisa ditangani lewat pola ini?

Helper di atas dicontohkan dengan reCAPTCHA v2, tetapi metode yang sama berlaku untuk reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, dan GeeTest v3 — cukup ganti parameter method dan sitekey sesuai tipe target. hCaptcha dan FunCaptcha belum didukung, jadi untuk keduanya Anda memerlukan layanan lain.

Berapa biaya CaptchaAI untuk beban scraping seperti ini?

Penagihan per thread, bukan per solve, jadi biaya bulanan tetap berapa pun jumlah CAPTCHA yang diselesaikan. Paket BASIC $15/bulan (5 threads) menutupi task Octoparse skala kecil; naikkan ke paket dengan lebih banyak thread saat menjalankan banyak ekstraksi bersamaan. Harga terbaru ada di halaman pricing CaptchaAI.

Biasanya cookie sudah kedaluwarsa atau domain/path-nya tidak cocok dengan URL yang di-scrape. Jalankan ulang helper untuk membuat cookie segar, pastikan field domain sama persis dengan situs target, dan naikkan waktu tunggu pemuatan halaman agar konten sempat muncul sebelum ekstraksi dimulai.

Kapan sebaiknya beralih dari Octoparse ke skrip penuh?

Selama CAPTCHA jarang muncul, injeksi cookie ke Octoparse sudah cukup. Begitu hampir setiap halaman meminta CAPTCHA atau Anda butuh logika retry yang rumit, Pola 2 berbasis API memberi kontrol dan keandalan yang lebih baik daripada alur visual.

Panduan terkait


Tangani CAPTCHA dalam visual scraping — coba CaptchaAI.

Komentar dinonaktifkan untuk artikel ini.