Captcha dalam web scraping: mengapa muncul dan apa yang harus dilakukan
Captcha muncul saat scraping ketika situs memutuskan bahwa sebuah request terlihat otomatis. Pemicu yang umum adalah terlalu banyak request dalam waktu singkat, alamat IP dengan reputasi buruk, sinyal browser yang hilang, atau kunjungan ke halaman yang dilindungi lebih ketat daripada halaman lainnya. Respons praktisnya memiliki tiga langkah, dengan urutan ini: kurangi pemicunya, deteksi captcha dalam kode, dan pecahkan captcha yang tidak bisa dihindari. Panduan ini membahas setiap langkah dan menunjuk ke panduan rinci untuk bagian lainnya.
Mengapa situs menampilkan captcha kepada scraper
Situs hanya punya sedikit cara untuk membedakan manusia dari skrip pada saat sebuah halaman diminta, jadi situs melihat pola. Scraper sering menonjol karena:
- mengirim request lebih cepat daripada yang bisa dilakukan manusia saat mengklik,
- mengulang path yang sama tanpa jeda,
- datang dari alamat datacenter, bukan jaringan rumah,
- mengirim header yang tidak cocok dengan browser yang umum, atau
- tidak menyimpan cookie maupun state sesi di antara request.
Salah satu dari ini saja mungkin sudah cukup. Captcha adalah cara situs meminta langkah seperti manusia sebelum ia menyajikan lebih banyak halaman. Mengurangi pola biasanya juga mengurangi captcha, dan itu lebih murah daripada memecahkannya.
Deteksi captcha dalam kode
Sebelum memecahkan apa pun, periksa apakah halaman yang Anda terima memang halaman captcha. Tes sederhana mencari markup widget dan membaca sitekey-nya:
import re
import requests
SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')
def fetch(url: str) -> dict:
resp = requests.get(
url,
timeout=30,
headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
)
html = resp.text
if "h-captcha" in html or "g-recaptcha" in html:
match = SITEKEY_RE.search(html)
return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
return {"captcha": False, "sitekey": None, "html": html}
page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
print("captcha ditemukan, sitekey:", page["sitekey"])
String h-captcha dan g-recaptcha hanyalah markup yang digunakan halaman, jadi ini adalah sinyal, bukan jaminan. Jika sitekey tidak ada, lihat cara menemukan sitekey captcha.
Pecahkan ketika tidak bisa dihindari
Ketika widget PopularCaptcha ada di halaman dan Anda memiliki sitekey-nya, Anda bisa meminta token dari API Scarnox dengan satu POST request dan mengirimkannya di field h-captcha-response. Fungsi lengkapnya, dengan penanganan error, ada di pecahkan captcha dari Python dengan satu request. Gunakan token segera, karena token kedaluwarsa setelah sekitar dua menit. Detail waktunya ada di token captcha kedaluwarsa.
Dukungan Scarnox yang aktif saat ini adalah PopularCaptcha, proxyless dan dengan proxy Anda sendiri. reCAPTCHA v2 dan v3, Cloudflare Turnstile, GeeTest, AWS WAF, dan Arkose segera hadir. Jika target Anda menggunakan salah satu dari itu, panduan captcha menjelaskan opsi umumnya, tetapi jangan membangun alur produksi di atas solve yang belum aktif.
Keputusan untuk setiap halaman yang diblokir
Ketika scraper Anda menemui captcha, urutan keputusan yang sederhana akan menjaga pekerjaan tetap jujur dan menjaga volume request tetap rendah:
- Apakah ada sumber data lain yang bisa dipakai? Jika API, feed, atau ekspor mencakup field yang Anda butuhkan, beralih ke sana dan berhenti meminta halaman itu.
- **Apakah
robots.txtmengizinkan path tersebut?** Jika tidak, lewati. Jangan memecahkan captcha pada halaman yang diminta untuk Anda tinggalkan. - Apakah Anda mengirim terlalu banyak terlalu cepat? Jeda lebih lama, turunkan laju, dan periksa lagi nanti. Banyak captcha hilang dengan pacing yang lebih lambat.
- Apakah captcha-nya jenis yang aktif? Jika PopularCaptcha, solve dalam panduan ini berlaku. Jika jenis yang segera hadir, biarkan pekerjaan dijeda dan pantau rilisnya.
- Apakah halaman itu boleh Anda otomatisasi? Jika jawabannya tidak jelas, tanyakan kepada pemilik situs sebelum Anda melanjutkan.
Langkah keempat adalah yang paling sering terlewat. Solver hanya berguna ketika jenis captcha didukung, dan pekerjaan yang terus mencoba jenis yang tidak didukung membuang waktu dan request.
Tangani captcha dalam pekerjaan, bukan dalam loop
Letakkan solve di dalam jalur kode yang membutuhkan token, sehingga pekerjaan bisa mencatat setiap captcha, berhenti ketika sebuah halaman terus gagal, dan melanjutkan. Loop tanpa batas yang terus meminta halaman captcha adalah cara tercepat agar firewall situs memblokir alamat Anda selamanya.
Pantau apa yang gagal
Simpan hitungan halaman yang mengembalikan captcha, dikelompokkan menurut URL dan waktu dalam sehari. Captcha yang hanya muncul di satu bagian situs, atau hanya setelah jumlah request tertentu, menunjukkan di mana pemicunya. Informasi itu lebih berguna daripada solver yang lebih cepat, karena menunjukkan apa yang perlu diubah.
Yang tidak boleh dilakukan
- Jangan berganti-ganti banyak alamat IP untuk menghindari batas situs. Itu adalah penghindaran, dan itu mengubah permintaan untuk melambat menjadi pertarungan.
- Jangan scrape halaman di balik login dengan kredensial yang tidak Anda punya izin untuk digunakan.
- Jangan memecahkan captcha untuk membuat akun, memposting spam, atau membeli barang yang terbatas.
Scraping secara bertanggung jawab
- Baca
robots.txtdan ketentuan layanan situs sebelum Anda mulai. Hormati path yang dilarang dan crawl delay apa pun. - Identifikasi bot Anda secara jujur di User-Agent, dengan cara untuk menghubungi Anda.
- Jaga laju request tetap rendah. Captcha sering kali adalah situs yang meminta Anda memperlambat.
- Berhenti jika situs memintanya, dan jangan mengakali pemblokiran yang diminta untuk Anda hormati.
- Tangani data pribadi sesuai aturan privasi yang berlaku bagi Anda, dan kumpulkan hanya yang Anda butuhkan.