
Adélia Cruz
Neural Network Developer

Web scraping telah menjadi alat yang penting untuk pengumpulan data, penelitian pasar, dan analisis kompetitif. Namun, seiring dengan perkembangan teknik scraping, pertahanan yang digunakan situs web untuk melindungi data mereka juga semakin berkembang. Salah satu rintangan paling umum yang dihadapi scraper adalah captcha — tantangan-tantangan yang dirancang untuk membedakan manusia dari bot.
Jika Anda pernah mencoba mengambil data dari situs web dan dihadapkan dengan pesan "Harap verifikasi Anda manusia", Anda tahu betapa frustrasinya situasi itu. Berita baiknya? Ada kombinasi alat yang kuat yang bisa membantu: Scrapling untuk web scraping yang cerdas dan CapSolver untuk penyelesaian captcha otomatis.
Dalam panduan ini, kami akan membimbing Anda melalui semua yang perlu Anda ketahui untuk mengintegrasikan alat-alat ini dan secara sukses mengambil data dari situs web yang dilindungi captcha. Baik Anda menghadapi ReCaptcha v2 Google, ReCaptcha v3 yang tidak terlihat, atau Cloudflare Turnstile, kami akan membantu Anda.
Scrapling adalah perpustakaan web scraping modern Python yang menggambarkan dirinya sebagai "perpustakaan scraping adaptif pertama yang belajar dari perubahan situs web dan berkembang bersamanya." Dirancang untuk membuat ekstraksi data mudah sambil menyediakan kemampuan anti-bot yang kuat.
Untuk kemampuan parsing dasar:
pip install scrapling
Untuk fitur penuh termasuk otomatisasi browser:
pip install "scrapling[fetchers]"
scrapling install
Untuk semua fitur termasuk fitur AI:
pip install "scrapling[all]"
scrapling install
Scrapling menggunakan metode kelas untuk permintaan HTTP:
from scrapling import Fetcher
# Permintaan GET
response = Fetcher.get("https://example.com")
# Permintaan POST dengan data
response = Fetcher.post("https://example.com/api", data={"key": "value"})
# Akses respons
print(response.status) # Kode status HTTP
print(response.body) # Byte mentah
print(response.body.decode()) # Teks yang didekripsi
CapSolver adalah layanan penyelesaian captcha yang menggunakan AI canggih untuk menyelesaikan berbagai jenis captcha secara otomatis. Menyediakan API sederhana yang terintegrasi dengan sempurna dengan setiap bahasa pemrograman atau kerangka kerja scraping.
Tingkatkan anggaran otomatisasi Anda secara instan!
Gunakan kode bonus SCRAPLING saat menambahkan dana ke akun CapSolver Anda untuk mendapatkan bonus 6% tambahan pada setiap pengisian ulang — khusus untuk pengguna integrasi Scrapling.
Klaim sekarang di Dashboard CapSolver Anda
CapSolver menggunakan dua endpoint utama:
POST https://api.capsolver.com/createTaskPOST https://api.capsolver.com/getTaskResultSebelum masuk ke jenis captcha tertentu, mari kita buat fungsi bantuan yang dapat digunakan kembali yang menangani alur kerja API CapSolver:
import requests
import time
CAPSOLVER_API_KEY = "YOUR_API_KEY"
def solve_captcha(task_type, website_url, website_key, **kwargs):
"""
Solver captcha umum menggunakan API CapSolver.
Args:
task_type: Jenis tugas captcha (misalnya, "ReCaptchaV2TaskProxyLess")
website_url: URL halaman dengan captcha
website_key: Kunci situs untuk captcha
**kwargs: Parameter tambahan yang spesifik untuk jenis captcha
Returns:
dict: Solusi yang mencakup token dan data lainnya
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": task_type,
"websiteURL": website_url,
"websiteKey": website_key,
**kwargs
}
}
# Buat tugas
response = requests.post(
"https://api.capsolver.com/createTask",
json=payload
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Gagal membuat tugas: {result.get('errorDescription')}")
task_id = result.get("taskId")
print(f"Tugas dibuat: {task_id}")
# Pantau hasil
max_attempts = 60 # Maksimum 2 menit pemantauan
for attempt in range(max_attempts):
time.sleep(2)
response = requests.post(
"https://api.capsolver.com/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
print(f"Captcha selesai dalam {(attempt + 1) * 2} detik")
return result.get("solution")
if result.get("errorId") != 0:
raise Exception(f"Kesalahan: {result.get('errorDescription')}")
print(f"Menunggu... (percobaan {attempt + 1})")
raise Exception("Waktu habis: Penyelesaian captcha terlalu lama")
Fungsi ini menangani seluruh alur kerja: membuat tugas, memantau hasil, dan mengembalikan solusi. Kami akan menggunakan fungsi ini sepanjang panduan ini.
ReCaptcha v2 adalah captcha checkbox "Saya bukan robot" klasik. Ketika diaktifkan, mungkin meminta pengguna untuk mengidentifikasi objek dalam gambar (lampu lalu lintas, trotoar, dll.). Untuk scraper, kita perlu menyelesaikan ini secara programatis.
Kunci situs biasanya ditemukan dalam HTML halaman:
<div class="g-recaptcha" data-sitekey="6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"></div>
Atau dalam tag skrip:
<script src="https://www.google.com/recaptcha/api.js?render=6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"></script>
from scrapling import Fetcher
def scrape_with_recaptcha_v2(target_url, site_key, form_url=None):
"""
Mengambil halaman yang dilindungi ReCaptcha v2.
Args:
target_url: URL halaman dengan captcha
site_key: Kunci ReCaptcha
form_url: URL untuk mengirimkan formulir (default ke target_url)
Returns:
Respons dari halaman yang dilindungi
"""
# Selesaikan captcha menggunakan CapSolver
print("Menyelesaikan ReCaptcha v2...")
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key
)
captcha_token = solution["gRecaptchaResponse"]
print(f"Dapatkan token: {captcha_token[:50]}...")
# Kirim formulir dengan token captcha menggunakan Scrapling
# Catatan: Gunakan Fetcher.post() sebagai metode kelas (bukan metode instans)
submit_url = form_url or target_url
response = Fetcher.post(
submit_url,
data={
"g-recaptcha-response": captcha_token,
# Tambahkan bidang formulir lainnya yang diperlukan situs
}
)
return response
# Contoh penggunaan
if __name__ == "__main__":
url = "https://example.com/protected-page"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
result = scrape_with_recaptcha_v2(url, site_key)
print(f"Status: {result.status}")
print(f"Panjang konten: {len(result.body)}") # Gunakan .body untuk byte mentah
Untuk ReCaptcha v2 yang tidak terlihat (tanpa checkbox, diaktifkan saat mengirim formulir), tambahkan parameter isInvisible:
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key,
isInvisible=True
)
Untuk versi ReCaptcha v2 Enterprise, gunakan jenis tugas yang berbeda:
solution = solve_captcha(
task_type="ReCaptchaV2EnterpriseTaskProxyLess",
website_url=target_url,
website_key=site_key,
enterprisePayload={
"s": "nilai_s_payload jika diperlukan"
}
)
ReCaptcha v3 berbeda dari v2 — berjalan secara tidak terlihat di latar belakang dan memberikan skor (0.0 hingga 1.0) berdasarkan perilaku pengguna. Skor yang lebih dekat ke 1.0 menunjukkan aktivitas manusia yang mungkin.
| Aspek | ReCaptcha v2 | ReCaptcha v3 |
|---|---|---|
| Interaksi Pengguna | Checkbox/tantangan gambar | Tidak ada (tidak terlihat) |
| Output | Lulus/gagal | Skor (0.0-1.0) |
| Parameter Aksi | Tidak diperlukan | Diperlukan |
| Kapan digunakan | Formulir, login | Semua muatan halaman |
Aksi ditentukan dalam JavaScript situs web:
grecaptcha.execute('6LcxxxxxxxxxxxxxxxxABCD', {action: 'submit'})
Aksi umum termasuk: submit, login, register, homepage, contact.
from scrapling import Fetcher
def scrape_with_recaptcha_v3(target_url, site_key, page_action="submit", min_score=0.7):
"""
Mengambil halaman yang dilindungi ReCaptcha v3.
Args:
target_url: URL halaman dengan captcha
site_key: Kunci ReCaptcha
page_action: Parameter aksi (ditemukan dalam grecaptcha.execute)
min_score: Skor minimum yang diminta (0.1-0.9)
Returns:
Respons dari halaman yang dilindungi
"""
print(f"Menyelesaikan ReCaptcha v3 (aksi: {page_action})...")
solution = solve_captcha(
task_type="ReCaptchaV3TaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction=page_action
)
captcha_token = solution["gRecaptchaResponse"]
print(f"Dapatkan token dengan skor: {solution.get('score', 'Tidak tersedia')}")
# Kirim permintaan dengan token menggunakan metode kelas Scrapling
response = Fetcher.post(
target_url,
data={
"g-recaptcha-response": captcha_token,
},
headers={
"User-Agent": solution.get("userAgent", "Mozilla/5.0")
}
)
return response
# Contoh penggunaan
if __name__ == "__main__":
url = "https://example.com/api/data"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
result = scrape_with_recaptcha_v3(url, site_key, page_action="getData")
print(f"Respons: {result.body.decode()[:200]}") # Gunakan .body untuk konten
solution = solve_captcha(
task_type="ReCaptchaV3EnterpriseTaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction=page_action,
enterprisePayload={
"s": "parameter s opsional"
}
)
Cloudflare Turnstile adalah alternatif captcha yang lebih baru yang dirancang sebagai pengganti captcha tradisional yang ramah pengguna dan menjaga privasi. Semakin umum digunakan di situs web yang menggunakan Cloudflare.
Turnstile memiliki tiga mode:
Berita baiknya? CapSolver menangani ketiga mode ini secara otomatis.
Cari Turnstile dalam HTML halaman:
<div class="cf-turnstile" data-sitekey="0x4xxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
Atau dalam JavaScript:
turnstile.render('#container', {
sitekey: '0x4xxxxxxxxxxxxxxxxxxxxxxxxxx',
callback: function(token) { ... }
});
from scrapling import Fetcher
def scrape_with_turnstile(target_url, site_key, action=None, cdata=None):
"""
Mengambil halaman yang dilindungi Cloudflare Turnstile.
Args:
target_url: URL halaman dengan captcha
site_key: Kunci Turnstile (dimulai dengan 0x4...)
action: Parameter aksi opsional
cdata: Parameter cdata opsional
Returns:
Respons dari halaman yang dilindungi
"""
print("Menyelesaikan Cloudflare Turnstile...")
# Bangun metadata jika tersedia
metadata = {}
if action:
metadata["action"] = action
if cdata:
metadata["cdata"] = cdata
task_params = {
"task_type": "AntiTurnstileTaskProxyLess",
"website_url": target_url,
"website_key": site_key,
}
if metadata:
task_params["metadata"] = metadata
solution = solve_captcha(**task_params)
turnstile_token = solution["token"]
user_agent = solution.get("userAgent", "")
print(f"Dapatkan token Turnstile: {turnstile_token[:50]}...")
# Kirim dengan token menggunakan metode kelas Scrapling
headers = {}
if user_agent:
headers["User-Agent"] = user_agent
response = Fetcher.post(
target_url,
data={
"cf-turnstile-response": turnstile_token,
},
headers=headers
)
return response
# Contoh penggunaan
if __name__ == "__main__":
url = "https://example.com/terlindungi"
site_key = "0x4AAAAAAAxxxxxxxxxxxxxx"
result = scrape_with_turnstile(url, site_key)
print(f"Berhasil! Mendapatkan {len(result.body)} byte") # Gunakan .body untuk konten
### Turnstile dengan Action dan CData
Beberapa implementasi memerlukan parameter tambahan:
```python
solution = solve_captcha(
task_type="AntiTurnstileTaskProxyLess",
website_url=target_url,
website_key=site_key,
metadata={
"action": "login",
"cdata": "session_id_atau_data_kustom"
}
)
Terkadang permintaan HTTP dasar tidak cukup. Situs web mungkin menggunakan deteksi bot yang canggih yang memeriksa:
Scrapling's StealthyFetcher memberikan perlindungan anti-deteksi tingkat browser dengan menggunakan mesin browser nyata dengan modifikasi stealth.
StealthyFetcher menggunakan browser Firefox yang dimodifikasi dengan:
| Scenario | Gunakan Fetcher | Gunakan StealthyFetcher |
|---|---|---|
| Form sederhana dengan captcha | Ya | Tidak |
| Halaman JavaScript berat | Tidak | Ya |
| Lapisan anti-bot banyak | Tidak | Ya |
| Kecepatan kritis | Ya | Tidak |
| Mode Under Attack Cloudflare | Tidak | Ya |
Berikut cara menggunakan keduanya bersama-sama untuk efektivitas maksimal:
from scrapling import StealthyFetcher
import asyncio
async def scrape_with_stealth_and_recaptcha(target_url, site_key, captcha_type="v2"):
"""
Menggabungkan fitur anti-bot StealthyFetcher dengan CapSolver untuk ReCaptcha.
Args:
target_url: URL yang ingin di-scrape
site_key: Kunci captcha
captcha_type: "v2" atau "v3"
Returns:
Konten halaman setelah menyelesaikan captcha
"""
# Pertama, selesaikan captcha menggunakan CapSolver
print(f"Menyelesaikan ReCaptcha {captcha_type}...")
if captcha_type == "v2":
solution = solve_captcha(
task_type="ReCaptchaV2TaskProxyLess",
website_url=target_url,
website_key=site_key
)
token = solution["gRecaptchaResponse"]
elif captcha_type == "v3":
solution = solve_captcha(
task_type="ReCaptchaV3TaskProxyLess",
website_url=target_url,
website_key=site_key,
pageAction="submit"
)
token = solution["gRecaptchaResponse"]
else:
raise ValueError(f"Jenis captcha tidak dikenal: {captcha_type}")
print(f"Dapatkan token: {token[:50]}...")
# Gunakan StealthyFetcher untuk perilaku seperti browser
fetcher = StealthyFetcher()
# Navigasi ke halaman
page = await fetcher.async_fetch(target_url)
# Sisipkan solusi ReCaptcha menggunakan JavaScript
await page.page.evaluate(f'''() => {{
// Cari bidang g-recaptcha-response dan atur nilainya
let field = document.querySelector('textarea[name="g-recaptcha-response"]');
if (!field) {{
field = document.createElement('textarea');
field.name = "g-recaptcha-response";
field.style.display = "none";
document.body.appendChild(field);
}}
field.value = "{token}";
}}''')
# Cari dan klik tombol submit
submit_button = page.css('button[type="submit"], input[type="submit"]')
if submit_button:
await submit_button[0].click()
# Tunggu navigasi
await page.page.wait_for_load_state('networkidle')
# Dapatkan konten halaman akhir
content = await page.page.content()
return content
# Wrapper sinkron untuk penggunaan yang lebih mudah
def scrape_stealth(target_url, site_key, captcha_type="v2"):
"""Wrapper sinkron untuk scraper stealth asinkron."""
return asyncio.run(
scrape_with_stealth_and_recaptcha(target_url, site_key, captcha_type)
)
# Contoh penggunaan
if __name__ == "__main__":
url = "https://example.com/halaman-terlindungi-tinggi"
site_key = "6LcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD"
content = scrape_stealth(url, site_key, captcha_type="v2")
print(f"Dapatkan {len(content)} byte konten")
from scrapling import StealthyFetcher
import asyncio
class StealthScraper:
"""Pengambil data yang mempertahankan sesi di beberapa halaman."""
def __init__(self, api_key):
self.api_key = api_key
self.fetcher = None
async def __aenter__(self):
self.fetcher = StealthyFetcher()
return self
async def __aexit__(self, *args):
if self.fetcher:
await self.fetcher.close()
async def solve_and_access(self, url, site_key, captcha_type="v2"):
"""Selesaikan ReCaptcha dan akses halaman."""
global CAPSOLVER_API_KEY
CAPSOLVER_API_KEY = self.api_key
# Selesaikan ReCaptcha
task_type = f"ReCaptcha{captcha_type.upper()}TaskProxyLess"
solution = solve_captcha(
task_type=task_type,
website_url=url,
website_key=site_key
)
token = solution["gRecaptchaResponse"]
# Navigasi dan sisipkan token
page = await self.fetcher.async_fetch(url)
# ... lanjutkan dengan interaksi halaman
return page
# Penggunaan
async def main():
async with StealthScraper("kunci_api_anda") as scraper:
page1 = await scraper.solve_and_access(
"https://example.com/login",
"kunci_site_here",
"v2"
)
# Sesi dipertahankan untuk permintaan berikutnya
page2 = await scraper.solve_and_access(
"https://example.com/dashboard",
"kunci_site_lain",
"v3"
)
asyncio.run(main())
Jangan menyerang situs web dengan permintaan berlebihan. Implementasikan jeda antara permintaan:
import time
import random
def scrape_yang_sopan(urls, min_delay=2, max_delay=5):
"""Mengambil data dengan jeda acak untuk terlihat lebih manusia."""
results = []
for url in urls:
result = scrape_page(url)
results.append(result)
# Jeda acak antara permintaan
delay = random.uniform(min_delay, max_delay)
time.sleep(delay)
return results
Selalu tangani kegagalan dengan baik:
def solve_captcha_yang_kuat(task_type, website_url, website_key, max_retries=3, **kwargs):
"""Menyelesaikan captcha dengan retry otomatis."""
for attempt in range(max_retries):
try:
return solve_captcha(task_type, website_url, website_key, **kwargs)
except Exception as e:
print(f"Uji coba {attempt + 1} gagal: {e}")
if attempt < max_retries - 1:
time.sleep(5) # Tunggu sebelum retry
else:
raise
Periksa robots.txt situs sebelum mengambil data:
from urllib.robotparser import RobotFileParser
def bisa_scrape(url):
"""Periksa apakah mengambil data diizinkan oleh robots.txt."""
rp = RobotFileParser()
rp.set_url(f"{url}/robots.txt")
rp.read()
return rp.can_fetch("*", url)
Saat mengambil data dalam skala besar, putar proxy untuk menghindari blokir IP:
# CapSolver mendukung tugas dengan proxy
solution = solve_captcha(
task_type="ReCaptchaV2Task", # Perhatikan: tidak ada "ProxyLess"
website_url=target_url,
website_key=site_key,
proxy="http://user:pass@proxy.example.com:8080"
)
Token captcha biasanya berlaku selama 1-2 menit. Jika Anda perlu membuat beberapa permintaan, gunakan ulang token:
import time
class CacheCaptcha:
def __init__(self, ttl=120): # TTL default 2 menit
self.cache = {}
self.ttl = ttl
def get_or_solve(self, key, solve_func):
"""Dapatkan token yang disimpan atau selesaikan yang baru."""
if key in self.cache:
token, timestamp = self.cache[key]
if time.time() - timestamp < self.ttl:
return token
token = solve_func()
self.cache[key] = (token, time.time())
return token
| Fitur | ReCaptcha v2 | ReCaptcha v3 | Cloudflare Turnstile |
|---|---|---|---|
| Interaksi Pengguna | Checkbox + tantangan mungkin | Tidak ada | Minimal atau tidak ada |
| Format Kunci Situs | 6L... |
6L... |
0x4... |
| Bidang Respons | g-recaptcha-response |
g-recaptcha-response |
cf-turnstile-response |
| Parameter Action | Tidak | Ya (diperlukan) | Opsional |
| Waktu Penyelesaian | 1-10 detik | 1-10 detik | 1-20 detik |
| Tugas CapSolver | ReCaptchaV2TaskProxyLess |
ReCaptchaV3TaskProxyLess |
AntiTurnstileTaskProxyLess |
| Fitur | Fetcher | StealthyFetcher |
|---|---|---|
| Kecepatan | Sangat cepat | Lebih lambat |
| Dukungan JavaScript | Tidak | Ya |
| Fingerprint Browser | Tidak ada | Firefox nyata |
| Penggunaan Memori | Rendah | Lebih tinggi |
| Bypass Cloudflare | Tidak | Ya |
| Paling Cocok Untuk | Permintaan sederhana | Anti-bot kompleks |
Periksa halaman harga CapSolver untuk tarif terkini.
Cari sumber halaman (Ctrl+U) untuk:
data-sitekeygrecaptcha.executerender= di URL skrip reCaptchaclass="cf-turnstile" untuk TurnstileToken biasanya kedaluwarsa setelah 1-2 menit. Selesaikan captcha secepat mungkin sebelum mengirimkan formulir. Jika Anda mendapatkan kesalahan validasi, selesaikan kembali dengan token baru.
Ya! Bungkus fungsi solve dalam executor async:
import asyncio
async def async_solve_captcha(*args, **kwargs):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(
None,
lambda: solve_captcha(*args, **kwargs)
)
Selesaikan setiap captcha secara terpisah dan sertakan semua token dalam pengiriman Anda:
# Selesaikan beberapa ReCaptchas
solution_v2 = solve_captcha("ReCaptchaV2TaskProxyLess", url, key1)
solution_v3 = solve_captcha("ReCaptchaV3TaskProxyLess", url, key2, pageAction="submit")
# Kirim token menggunakan metode kelas Scrapling
response = Fetcher.post(url, data={
"g-recaptcha-response": solution_v2["gRecaptchaResponse"],
"g-recaptcha-response-v3": solution_v3["gRecaptchaResponse"],
})
Menggabungkan Scrapling dan CapSolver memberikan solusi kuat untuk mengambil data dari situs web yang dilindungi captcha. Berikut ringkasan singkat:
Ingat untuk mengambil data secara bertanggung jawab:
Siap mulai mengambil data? Dapatkan kunci API CapSolver Anda di capsolver.com dan instal Scrapling dengan pip install "scrapling[all]".
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.
