
Emma Foster
Machine Learning Engineer
TLDR: Panduan ini menunjukkan cara menggabungkan Botasaurus, kerangka kerja scraping web Python dengan fitur anti-pendeteksian, dan CapSolver, API penyelesaian CAPTCHA, untuk secara otomatis melewati reCAPTCHA v2, reCAPTCHA v3, dan Cloudflare Turnstile selama scraping web skala besar. Proses intinya melibatkan persiapan lingkungan, menggunakan ekstensi browser CapSolver untuk mengidentifikasi parameter CAPTCHA, memanggil API CapSolver melalui fungsi bantuan Python untuk mendapatkan token solusi, dan akhirnya menggunakan Botasaurus untuk menyisipkan token ke halaman web untuk pengiriman formulir.

Scraping web skala besar sering kali menghadapi CAPTCHA yang menghalangi akses otomatis. Panduan ini menunjukkan cara menggabungkan Botasaurus, kerangka kerja scraping web yang kuat, dengan CapSolver untuk secara otomatis menyelesaikan CAPTCHA reCAPTCHA v2, reCAPTCHA v3, dan Cloudflare Turnstile.
Botasaurus adalah kerangka kerja scraping web Python yang mempermudah otomasi browser dengan fitur anti-pendeteksian yang terintegrasi. Ini menyediakan API berbasis dekorator yang bersih untuk tugas browser.
Fitur Utama:
@browserInstalasi:
pip install botasaurus
Penggunaan dasar:
from botasaurus.browser import browser, Driver
@browser()
def scrape_page(driver: Driver, data):
driver.get("https://example.com")
title = driver.get_text("h1")
return {"title": title}
# Jalankan scraper
result = scrape_page()
CapSolver adalah layanan penyelesaian CAPTCHA yang menyediakan API untuk menyelesaikan berbagai jenis CAPTCHA termasuk reCAPTCHA dan Cloudflare Turnstile.
Jenis CAPTCHA yang didukung:
Mendapatkan kunci API Anda:
CAP-)pip install botasaurus capsolver requests python-dotenv
Buat file .env di akar proyek Anda:
CAPSOLVER_API_KEY=CAP-YOUR_API_KEY_HERE
Buat pemuat konfigurasi yang dapat dibagikan:
# shared/config.py
import os
from pathlib import Path
from dotenv import load_dotenv
# Muat file .env dari akar proyek
ROOT_DIR = Path(__file__).parent.parent
load_dotenv(ROOT_DIR / ".env")
class Config:
"""Kelas konfigurasi untuk integrasi CapSolver."""
# Kunci API CapSolver
CAPSOLVER_API_KEY: str = os.getenv("CAPSOLVER_API_KEY", "")
# Endpoint API CapSolver
CAPSOLVER_API_URL = "https://api.capsolver.com"
CREATE_TASK_ENDPOINT = f"{CAPSOLVER_API_URL}/createTask"
GET_RESULT_ENDPOINT = f"{CAPSOLVER_API_URL}/getTaskResult"
@classmethod
def validate(cls) -> bool:
"""Periksa apakah konfigurasi valid."""
if not cls.CAPSOLVER_API_KEY:
print("Error: CAPSOLVER_API_KEY tidak diatur!")
return False
return True
Sebelum mengintegrasikan dengan API, Anda perlu mengidentifikasi parameter yang benar untuk CAPTCHA target. Ekstensi CapSolver browser menyediakan cara mudah untuk mendeteksi semua parameter yang diperlukan secara otomatis.
Pasang ekstensi CapSolver dari Chrome Web Store.
Penting: Jangan tutup panel CapSolver sebelum mengaktifkan CAPTCHA, karena menutupnya akan menghapus informasi yang sebelumnya terdeteksi.
Ekstensi secara otomatis mengidentifikasi semua parameter reCAPTCHA yang diperlukan:
Detektor memberikan output JSON yang diformat siap untuk integrasi API, membuatnya mudah untuk menyalin parameter tepat yang dibutuhkan untuk tugas penyelesaian Anda.
Untuk detail lebih lanjut, lihat panduan lengkap mengenai mengidentifikasi parameter CAPTCHA.
reCAPTCHA v2 adalah CAPTCHA checkbox "Saya bukan robot" klasik. Ini mungkin menampilkan tantangan pemilihan gambar kepada pengguna.
Anda dapat menggunakan detektor ekstensi CapSolver (seperti yang dijelaskan di atas) atau menemukan kunci situs secara manual:
Cari di HTML halaman:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
Atau dalam JavaScript:
grecaptcha.render('container', {'sitekey': '6Le-xxxxx...'});
# utils/capsolver_helper.py
import time
import requests
from shared.config import Config
def solve_recaptcha_v2(
website_url: str,
website_key: str,
is_invisible: bool = False,
timeout: int = 120
) -> dict:
"""
Selesaikan reCAPTCHA v2 menggunakan API CapSolver.
Args:
website_url: URL halaman dengan CAPTCHA
website_key: Kunci situs reCAPTCHA
is_invisible: Apakah ini reCAPTCHA v2 invisible
timeout: Waktu maksimum menunggu solusi (detik)
Returns:
dict dengan 'gRecaptchaResponse' token
"""
if not Config.validate():
raise Exception("Konfigurasi tidak valid - periksa kunci API Anda")
# Bangun payload tugas
task = {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
}
if is_invisible:
task["isInvisible"] = True
payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"task": task
}
# Buat tugas
response = requests.post(Config.CREATE_TASK_ENDPOINT, json=payload)
result = response.json()
if result.get("errorId") and result.get("errorId") != 0:
raise Exception(f"Gagal membuat tugas: {result.get('errorDescription')}")
task_id = result.get("taskId")
# Poll hasil
start_time = time.time()
while time.time() - start_time < timeout:
time.sleep(2)
result_payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"taskId": task_id
}
response = requests.post(Config.GET_RESULT_ENDPOINT, json=result_payload)
result = response.json()
if result.get("status") == "ready":
return result.get("solution", {})
elif result.get("status") == "failed":
raise Exception(f"Tugas gagal: {result.get('errorDescription')}")
raise Exception(f"Timeout setelah {timeout} detik")
from botasaurus.browser import browser, Driver
from shared.config import Config
from utils.capsolver_helper import solve_recaptcha_v2
DEMO_URL = "https://www.google.com/recaptcha/api2/demo"
DEMO_SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
@browser(headless=False)
def solve_recaptcha_v2_with_api(driver: Driver, data: dict):
"""Selesaikan reCAPTCHA v2 menggunakan API CapSolver dan sisipkan token."""
url = data.get("url", DEMO_URL)
site_key = data.get("site_key", DEMO_SITEKEY)
# Langkah 1: Muat halaman
driver.get(url)
driver.sleep(2)
# Langkah 2: Ekstrak kunci situs dari halaman (opsional)
extracted_key = driver.run_js("""
const recaptchaDiv = document.querySelector('.g-recaptcha');
return recaptchaDiv ? recaptchaDiv.getAttribute('data-sitekey') : null;
""")
if extracted_key:
site_key = extracted_key
# Langkah 3: Selesaikan CAPTCHA via API CapSolver
solution = solve_recaptcha_v2(
website_url=url,
website_key=site_key
)
token = solution.get("gRecaptchaResponse")
# Langkah 4: Sisipkan token ke halaman
driver.run_js(f"""
// Atur nilai textarea tersembunyi
const responseField = document.querySelector('[name="g-recaptcha-response"]');
if (responseField) {{
responseField.value = "{token}";
}}
// Aktifkan callback jika tersedia
if (typeof ___grecaptcha_cfg !== 'undefined') {{
try {{
const clients = ___grecaptcha_cfg.clients;
for (const key in clients) {{
const client = clients[key];
if (client && client.callback) {{
client.callback("{token}");
}}
}}
}} catch (e) {{}}
}}
""")
# Langkah 5: Kirim formulir
submit_button = driver.select('input[type="submit"]')
if submit_button:
submit_button.click()
driver.sleep(2)
return {"success": True, "token_length": len(token)}
# Jalankan demo
result = solve_recaptcha_v2_with_api(data={"url": DEMO_URL, "site_key": DEMO_SITEKEY})
reCAPTCHA v3 adalah CAPTCHA yang tidak terlihat dan bekerja dengan menganalisis perilaku pengguna untuk menghasilkan skor dari 0.0 hingga 1.0.
Perbedaan utama dari v2: reCAPTCHA v3 memerlukan parameter pageAction.
Cara paling mudah untuk menemukan pageAction adalah menggunakan detektor ekstensi CapSolver. Alternatifnya, cari di JavaScript halaman:
grecaptcha.execute('siteKey', {action: 'login'})
// 'login' adalah pageAction Anda
def solve_recaptcha_v3(
website_url: str,
website_key: str,
page_action: str,
timeout: int = 120
) -> dict:
"""
Selesaikan reCAPTCHA v3 menggunakan API CapSolver.
Args:
website_url: URL halaman dengan CAPTCHA
website_key: Kunci situs reCAPTCHA
page_action: Parameter aksi (WAJIB untuk v3)
timeout: Waktu maksimum menunggu solusi (detik)
Returns:
dict dengan 'gRecaptchaResponse' token
"""
if not Config.validate():
raise Exception("Konfigurasi tidak valid - periksa kunci API Anda")
if not page_action:
raise Exception("pageAction WAJIB untuk reCAPTCHA v3")
# Bangun payload tugas
task = {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
"pageAction": page_action, # WAJIB untuk v3
}
payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"task": task
}
# Buat tugas
response = requests.post(Config.CREATE_TASK_ENDPOINT, json=payload)
result = response.json()
if result.get("errorId") and result.get("errorId") != 0:
raise Exception(f"Gagal membuat tugas: {result.get('errorDescription')}")
task_id = result.get("taskId")
# Poll hasil
start_time = time.time()
while time.time() - start_time < timeout:
time.sleep(2)
result_payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"taskId": task_id
}
response = requests.post(Config.GET_RESULT_ENDPOINT, json=result_payload)
result = response.json()
if result.get("status") == "ready":
return result.get("solution", {})
elif result.get("status") == "failed":
raise Exception(f"Tugas gagal: {result.get('errorDescription')}")
raise Exception(f"Timeout setelah {timeout} detik")
from botasaurus.browser import browser, Driver
from shared.config import Config
from utils.capsolver_helper import solve_recaptcha_v3
DEMO_URL = "https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php"
DEMO_SITEKEY = "6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696"
PAGE_ACTION = "examples/v3scores"
@browser(headless=False)
def solve_recaptcha_v3_with_api(driver: Driver, data: dict):
"""Selesaikan reCAPTCHA v3 menggunakan API CapSolver dan sisipkan token."""
url = data.get("url", DEMO_URL)
site_key = data.get("site_key", DEMO_SITEKEY)
page_action = data.get("page_action", PAGE_ACTION)
# Langkah 1: Muat halaman
driver.get(url)
driver.sleep(2)
# Langkah 2: Selesaikan CAPTCHA via API CapSolver
solution = solve_recaptcha_v3(
website_url=url,
website_key=site_key,
page_action=page_action
)
token = solution.get("gRecaptchaResponse")
# Langkah 3: Sisipkan token ke halaman
driver.run_js(f"""
const token = "{token}";
// Atur field tersembunyi jika ada
const responseField = document.querySelector('[name="g-recaptcha-response"]');
if (responseField) {{
responseField.value = token;
}}
// Buat field tersembunyi jika formulir ada tetapi field tidak
const forms = document.querySelectorAll('form');
forms.forEach(form => {{
let field = form.querySelector('[name="g-recaptcha-response"]');
if (!field) {{
field = document.createElement('input');
field.type = 'hidden';
field.name = 'g-recaptcha-response';
form.appendChild(field);
}}
field.value = token;
}});
""")
# Langkah 4: Kirim atau verifikasi
buttons = driver.select_all("button")
for button in buttons:
if "verify" in button.text.lower() or "submit" in button.text.lower():
button.click()
driver.sleep(2)
break
return {"success": True, "token_length": len(token)}
# Jalankan demo
result = solve_recaptcha_v3_with_api(data={
"url": DEMO_URL,
"site_key": DEMO_SITEKEY,
"page_action": PAGE_ACTION
})
Cloudflare Turnstile adalah alternatif CAPTCHA yang fokus pada privasi dan dirancang untuk lebih tidak mengganggu daripada CAPTCHA tradisional.
Perbedaan utama dari reCAPTCHA:
AntiTurnstileTaskProxyLesstoken (bukan gRecaptchaResponse)0x4Cari di HTML halaman:
<div class="cf-turnstile" data-sitekey="0x4AAAAAAABS7vwvV6VFfMcD"></div>
def solve_turnstile(
website_url: str,
website_key: str,
action: str = None,
cdata: str = None,
timeout: int = 120
) -> dict:
"""
Selesaikan Cloudflare Turnstile menggunakan API CapSolver.
Args:
url_website: URL halaman dengan Turnstile
kunci_website: Kunci situs Turnstile (dimulai dengan 0x4)
aksi: Aksi opsional dari atribut data-action
cdata: Cdata opsional dari atribut data-cdata
timeout: Waktu maksimum untuk menunggu solusi (detik)
Returns:
dict dengan bidang 'token'
"""
if not Config.validate():
raise Exception("Konfigurasi tidak valid - periksa API key Anda")
# Bangun payload tugas
tugas = {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": url_website,
"websiteKey": kunci_website,
}
# Tambahkan metadata opsional
metadata = {}
if aksi:
metadata["aksi"] = aksi
if cdata:
metadata["cdata"] = cdata
if metadata:
tugas["metadata"] = metadata
payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"tugas": tugas
}
# Buat tugas
response = requests.post(Config.CREATE_TASK_ENDPOINT, json=payload)
result = response.json()
if result.get("errorId") and result.get("errorId") != 0:
raise Exception(f"Gagal membuat tugas: {result.get('errorDescription')}")
id_tugas = result.get("taskId")
# Poll untuk hasil
start_time = time.time()
while time.time() - start_time < timeout:
time.sleep(2)
result_payload = {
"clientKey": Config.CAPSOLVER_API_KEY,
"taskId": id_tugas
}
response = requests.post(Config.GET_RESULT_ENDPOINT, json=result_payload)
result = response.json()
if result.get("status") == "ready":
return result.get("solution", {})
elif result.get("status") == "failed":
raise Exception(f"Tugas gagal: {result.get('errorDescription')}")
raise Exception(f"Waktu habis setelah {timeout} detik")
from botasaurus.browser import browser, Driver
from shared.config import Config
from utils.capsolver_helper import solve_turnstile
DEMO_URL = "https://peet.ws/turnstile-test/non-interactive.html"
DEMO_SITEKEY = "0x4AAAAAAABS7vwvV6VFfMcD"
@browser(headless=False)
def solve_turnstile_with_api(driver: Driver, data: dict):
"""Selesaikan Cloudflare Turnstile menggunakan API CapSolver dan sisipkan token."""
url = data.get("url", DEMO_URL)
kunci_site = data.get("site_key", DEMO_SITEKEY)
# Langkah 1: Muat halaman
driver.get(url)
driver.sleep(3)
# Langkah 2: Ekstrak kunci situs dari halaman (opsional)
extracted_params = driver.run_js("""
const turnstileDiv = document.querySelector('.cf-turnstile, [data-sitekey]');
if (turnstileDiv) {
const key = turnstileDiv.getAttribute('data-sitekey');
if (key && key.startsWith('0x')) {
return {
sitekey: key,
action: turnstileDiv.getAttribute('data-action')
};
}
}
return null;
""")
if extracted_params and extracted_params.get("sitekey"):
kunci_site = extracted_params["sitekey"]
# Langkah 3: Selesaikan Turnstile via API CapSolver
solution = solve_turnstile(
url_website=url,
kunci_website=kunci_site,
aksi=extracted_params.get("action") if extracted_params else None
)
token = solution.get("token")
# Langkah 4: Sisipkan token ke halaman
driver.run_js(f"""
const token = "{token}";
// Cari dan isi bidang cf-turnstile-response
const responseFields = [
document.querySelector('[name="cf-turnstile-response"]'),
document.querySelector('[name="cf_turnstile_response"]'),
document.querySelector('input[name*="turnstile"]')
];
for (const field of responseFields) {{
if (field) {{
field.value = token;
break;
}}
}}
// Buat bidang tersembunyi jika form ada tapi field tidak
const forms = document.querySelectorAll('form');
forms.forEach(form => {{
let field = form.querySelector('[name="cf-turnstile-response"]');
if (!field) {{
field = document.createElement('input');
field.type = 'hidden';
field.name = 'cf-turnstile-response';
form.appendChild(field);
}}
field.value = token;
}});
""")
# Langkah 5: Kirim formulir
submit_btn = driver.select('button[type="submit"], input[type="submit"]')
if submit_btn:
submit_btn.click()
driver.sleep(2)
return {"success": True, "panjang_token": len(token)}
# Jalankan demo
result = solve_turnstile_with_api(data={"url": DEMO_URL, "site_key": DEMO_SITEKEY})
| Jenis Captcha | Jenis Tugas | Bidang Respons | Parameter yang Diperlukan |
|---|---|---|---|
| reCAPTCHA v2 | ReCaptchaV2TaskProxyLess |
gRecaptchaResponse |
websiteURL, websiteKey |
| reCAPTCHA v2 Enterprise | ReCaptchaV2EnterpriseTaskProxyLess |
gRecaptchaResponse |
websiteURL, websiteKey |
| reCAPTCHA v3 | ReCaptchaV3TaskProxyLess |
gRecaptchaResponse |
websiteURL, websiteKey, pageAction |
| reCAPTCHA v3 Enterprise | ReCaptchaV3EnterpriseTaskProxyLess |
gRecaptchaResponse |
websiteURL, websiteKey, pageAction |
| Cloudflare Turnstile | AntiTurnstileTaskProxyLess |
token |
websiteURL, websiteKey |
Untuk situs yang memblokir IP datacenter, gunakan varian proxy (misalnya ReCaptchaV2Task) dan berikan proxy residensial Anda sendiri.
1. Kedaluwarsa Token
Token captcha kedaluwarsa dengan cepat (biasanya dalam 2 menit). Selalu gunakan token segera setelah menerimanya:
# Dapatkan token
solution = solve_recaptcha_v2(url, kunci_site)
token = solution.get("gRecaptchaResponse")
# Gunakan segera - jangan simpan untuk nanti
driver.run_js(f'document.querySelector("[name=g-recaptcha-response]").value = "{token}"')
driver.select('button[type="submit"]').click()
2. Penanganan Kesalahan
Selalu implementasikan penanganan kesalahan yang tepat untuk kegagalan API:
try:
solution = solve_recaptcha_v2(url, kunci_site)
except Exception as e:
print(f"Pemecahan captcha gagal: {e}")
# Implementasikan logika ulang atau fallback
3. Pembatasan Kecepatan
Tambahkan jeda antara permintaan untuk menghindari pengaktifan pengukuran anti-bot:
driver.sleep(2) # Tunggu setelah muat halaman
# ... selesaikan captcha ...
driver.sleep(1) # Tunggu sebelum pengiriman formulir
4. Validasi Konfigurasi
Selalu validasi API key Anda sebelum membuat permintaan:
if not Config.validate():
raise Exception("Silakan konfigurasi API key Anda di file .env")
Menggabungkan Botasaurus dengan CapSolver memberikan solusi yang andal untuk menangani captcha dalam proyek scraping web. Pendekatan berbasis API memberi Anda kontrol penuh atas proses penyelesaian dan bekerja secara andal di berbagai jenis captcha.
Tingkatkan anggaran otomasi Anda secara instan!
Gunakan kode bonus CAPN saat menambahkan dana ke akun CapSolver Anda untuk mendapatkan tambahan 5% bonus pada setiap pengisian ulang — tanpa batas.
Tukarkan sekarang di Dashboard CapSolver Anda
websiteURL dan websiteKeypageActiontoken alih-alih gRecaptchaResponseMetode yang paling efektif adalah menggunakan framework otomatisasi browser yang kuat seperti Botasaurus, yang menangani anti-detect, dan mengintegrasikannya dengan API penyelesaian captcha khusus seperti CapSolver untuk mendapatkan token solusi secara programatis.
Botasaurus menyederhanakan otomatisasi browser dengan API berbasis dekorator yang bersih sambil menyediakan fitur stealth esensial untuk meminimalkan risiko terdeteksi dan diblokir oleh situs target.
Meskipun keduanya memerlukan parameter websiteURL dan websiteKey, penyelesaian reCAPTCHA v3 (versi tidak terlihat, berbasis skor) secara tambahan memerlukan parameter pageAction yang harus dimasukkan dalam payload tugas yang dikirim ke API CapSolver.
Pelajari arsitektur pengambilan data web Rust yang dapat diskalakan dengan reqwest, scraper, pengambilan data asinkron, pengambilan data browser tanpa tampilan, rotasi proxy, dan penanganan CAPTCHA yang sesuai aturan.

Mengotomasi penyelesaian CAPTCHA dengan Nanobot dan CapSolver. Gunakan Playwright untuk menyelesaikan reCAPTCHA dan Cloudflare secara otomatis.
