Cara menghindari captcha saat scraping (tanpa melanggar aturan)
Kebanyakan captcha saat scraping adalah reaksi terhadap traffic yang terlihat seperti automation. Cara paling murah untuk menanganinya adalah berhenti memicunya. Artinya: cari sumber data yang sah dulu, cek apa yang boleh dilakukan menurut aturan situs, kirim request lebih sedikit dan lebih pelan, dan jangan mengambil halaman yang sama dua kali. Menyelesaikan captcha adalah cadangan untuk kasus yang tidak bisa dihindari, bukan rencana utamanya.
Cek API atau feed resmi terlebih dahulu
Banyak situs yang sering di-scrape sudah menyediakan cara untuk mendapatkan data yang sama tanpa captcha: API publik, ekspor data, feed RSS atau sitemap, atau program partner. Sumber resmi lebih andal, lebih kecil kemungkinannya berubah tanpa pemberitahuan, dan memberi pemilik situs kendali atas cara Anda memakainya. Carilah:
- bagian developer atau API di footer situs,
sitemap.xmluntuk daftar halaman,- link RSS atau Atom di
<head>halaman, - halaman "data" atau "download" untuk ekspor massal.
Jika salah satunya sudah mencakup kebutuhan Anda, gunakan itu. Anda akan menghindari sebagian besar captcha dengan tidak meminta HTML sama sekali.
Patuhi robots.txt dan rate yang diminta
robots.txt memberi tahu Anda path mana yang boleh diambil oleh client automation, dan kadang berapa lama harus menunggu di antara request. Library standar Python bisa membacanya untuk Anda:
import time
from urllib.robotparser import RobotFileParser
import requests
USER_AGENT = "ExampleBot/1.0 (+https://example.com/bot)"
parser = RobotFileParser()
parser.set_url("https://example.com/robots.txt")
parser.read()
delay = parser.crawl_delay(USER_AGENT) or 5 # cadangan konservatif 5 detik
urls = [
"https://example.com/products?page=1",
"https://example.com/products?page=2",
]
last_request = 0.0
for url in urls:
if not parser.can_fetch(USER_AGENT, url):
print("skipped by robots.txt:", url)
continue
wait = delay - (time.monotonic() - last_request)
if wait > 0:
time.sleep(wait)
resp = requests.get(url, headers={"User-Agent": USER_AGENT}, timeout=30)
last_request = time.monotonic()
print(url, resp.status_code)
Jika robots.txt melarang sebuah path, jawaban yang jujur adalah membiarkannya atau bertanya kepada pemiliknya. Memutar lewat browser tidak mengubah apa yang diminta situs.
Perlambat dan sebarkan request
Ritme yang stabil dan tidak terlalu cepat jarang memicu tantangan, sedangkan lonjakan hampir selalu memicunya. Beberapa kebiasaan membuat perbedaan besar:
- Pilih satu rate request per situs dan pertahankan, alih-alih berjalan dengan kecepatan penuh.
- Tambahkan jitter acak agar waktunya tidak terlalu teratur.
- Berhenti dan mundur sebentar saat melihat 429 atau halaman captcha.
- Jalankan job di jam sepi jika beban situs menjadi perhatian.
Cache dan jangan ambil ulang
Setiap request yang tidak Anda buat adalah request yang tidak perlu ditangani situs. Simpan halaman yang Anda ambil beserta tanggalnya dan hash dari body-nya, lalu ambil lagi hanya saat kontennya kemungkinan besar sudah berubah. Conditional request dengan header If-Modified-Since atau ETag memungkinkan server menjawab "not modified" dengan murah jika server mendukungnya.
Gunakan ulang sesi, kirim header yang wajar
Sesi yang menyimpan cookie di antara request berperilaku lebih mirip pengunjung dibanding script yang mulai dari awal setiap kali. Gunakan requests.Session() untuk setiap situs, dan kirim User-Agent yang jelas dan jujur yang menyebut nama bot Anda beserta kontak. Jangan menyamar sebagai browser untuk melewati aturan. Jika situs membutuhkan JavaScript untuk menampilkan kontennya, gunakan alat browser untuk halaman tersebut, dan tetap patuhi batas rate yang sama.
Saat captcha masih muncul
Beberapa situs akan menampilkan captcha tidak peduli seberapa hati-hati Anda bersikap. Deteksi di kode dan hentikan job itu, alih-alih terus menghantam halaman. Deteksi dan solve opsional untuk PopularCaptcha dibahas di captcha pada web scraping.
Rencanakan crawl sebelum mulai
Crawl yang mengambil semuanya setiap hari adalah cara termudah untuk memicu captcha. Rencanakan pekerjaannya terlebih dahulu:
- Tentukan prioritas. Putuskan halaman mana yang sering berubah dan mana yang jarang. Crawl yang sering berubah lebih sering, dan sisanya lebih jarang.
- Gunakan tanggal di sitemap. Banyak sitemap menyertakan nilai
lastmod. Lewati URL yang belum berubah sejak kunjungan terakhir Anda. - Crawl secara inkremental. Simpan waktu fetch sukses terakhir untuk setiap URL, dan lanjutkan dari sana, alih-alih mengulang dari halaman pertama setelah gagal.
- Sebarkan beban. Pecah daftar besar menjadi batch dan jalankan sepanjang hari, jangan sekaligus.
Rencana seperti ini menurunkan jumlah request, dan itu adalah pengungkit terbesar yang Anda punya.
Tuliskan rencananya sebagai file konfigurasi singkat atau tabel: situsnya, bagian-bagiannya, interval refresh, dan anggaran request harian untuk setiap situs. Saat anggaran habis, job berhenti sampai jendela berikutnya. Memperlakukan anggaran sebagai batas keras, bukan sekadar panduan, adalah yang mencegah crawler menyimpang ke pola traffic yang memicu captcha. Tinjau anggaran itu setiap beberapa minggu, karena situs yang berkembang mungkin juga menambah traffic-nya, dan apa yang sopan kuartal lalu belum tentu sopan sekarang.
Scraping secara bertanggung jawab
- Cek
robots.txtdan terms of service sebelum mulai, dan patuhi isinya. - Jaga rate request tetap rendah dan berhenti saat situs menunjukkan bahwa ia kewalahan.
- Jangan mengumpulkan data pribadi yang tidak Anda perlukan, dan hapus saat tidak lagi dibutuhkan.
- Jangan mempublikasikan ulang konten berhak cipta secara massal. Gunakan data untuk analisis, perbandingan, atau produk Anda sendiri, dan cantumkan sumbernya jika sesuai.
- Hubungi pemilik situs jika Anda membutuhkan volume yang lebih besar. Mereka mungkin menawarkan feed.