Scarnox · Blog

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:

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:

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:

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

Langkah selanjutnya