Pembahasan sisi yang sering terlupakan: legalitas dan etika scraping. Membaca robots.txt, mematuhi Terms of Service, menerapkan rate limiting yang sopan, sanitasi output dan perlindungan PII, serta mengamankan kredensial scraper seperti API key dan proxy di environment variable.

Dua episode terakhir terasa seperti perlombaan senjata: di episode 12 kalian merotasi proxy agar tidak diblokir, lalu di episode 13 menyamarkan TLS fingerprint agar request tampak seperti browser asli. Keterampilan itu penting — tapi harus diimbangi satu hal: tanggung jawab.
Episode ini membahas sisi yang tidak bisa diajarkan lewat kode: legalitas dan etika. Kalian akan belajar membaca robots.txt, memahami posisi Terms of Service, menata rate limit yang sopan, menjaga data yang kalian ekstrak — termasuk isu PII — dan mengamankan kredensial scraper supaya tidak bocor. Bukan sekadar supaya aman dari tuntutan, tapi supaya kalian jadi scraper yang dibutuhkan orang, bukan yang dimusuhi.
Sebelum menulis satu baris kode, bedakan dua konsep ini:
Aturan praktis sederhana: scraping untuk data yang memang publik dan dibutuhkan, dengan kecepatan manusiawi, tanpa membebani server, dan tanpa menyentuh data pribadi — hampir selalu aman secara legal dan etis. Scraping data pribadi massal, konten berbayar, atau platform yang jelas-jelas melarangnya di ToS adalah zona merah.
robots.txt adalah file di root situs yang memberi tahu crawler halaman mana yang boleh dan tidak boleh diakses. Ini bukan hukum — beberapa situs menulisnya longgar — tapi mematuhinya adalah kebiasaan baik yang dihormati mesin pencari dan scraper profesional:
curl -s https://example.com/robots.txtScrapling menghormati ini di spider lewat atribut robots_txt_obey:
from scrapling.spiders import Spider
class BeritaSpider(Spider):
name = "berita"
start_urls = ["https://example.com/berita"]
robots_txt_obey = TrueSaat aktif, spider membaca aturan Disallow, menghormati Crawl-delay, dan memproses Request-rate dengan cache per domain. Pahami juga arti Disallow — ia bisa berarti "jangan diindex" alih-alih "jangan diakses". Kalau ragu, tanyakan langsung ke pemilik situs.
Warning
robots.txt tidak menyelamatkan kalian secara hukum dan bukan lisensi scraping. ToS situs dan hukum lokal tetap berlaku. Anggap robots.txt sebagai petunjuk awal, bukan pengaman terakhir.
Kecepatan crawl adalah wajah etika kalian. Meluncurkan 100 request per detik ke situs kecil adalah cara paling cepat membakar reputasi IP kalian sendiri — dan menghancurkan server orang. Praktik baik: batasi concurrency per domain dan sisipkan jeda antar request:
from scrapling.spiders import Spider
class BeritaSpider(Spider):
name = "berita"
start_urls = ["https://example.com/berita"]
robots_txt_obey = True
download_delay = 2.0
concurrent_requests_per_domain = 1
max_blocked_retries = 3download_delay menambah jeda sebelum tiap request, dan concurrent_requests_per_domain membatasi request paralel ke satu domain. Ukur batas wajar dengan coba-coba: mulai pelan, naikkan bertahap, dan perhatikan apakah server merespons 429. Kalau server memberi sinyal, turunkan lagi — itu bentuk negosiasi yang sehat.
Data yang kalian kumpulkan adalah tanggung jawab yang tersimpan. Mulai dari sanitasi: teks dari halaman web sering membawa tag HTML, whitespace ganda, atau karakter aneh. Bersihkan sebelum disimpan:
import re
def bersihkan(raw: str) -> str:
tanpa_tag = re.sub(r"<[^>]+>", "", raw)
return " ".join(tanpa_tag.split())Di luar kebersihan, ada lapisan etika yang lebih berat: PII (Personally Identifiable Information). Nomor telepon, email, alamat, atau identitas orang adalah data sensitif. Jangan mengumpulkannya tanpa dasar hukum yang jelas, dan jangan pernah menyimpannya tanpa perlu. Kalau halaman target memang mengandung PII, terapkan masking atau abaikan field itu sama sekali:
EMAIL_PATTERN = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
def buang_pii(teks: str) -> str:
return re.sub(EMAIL_PATTERN, "[redacted]", teks)Aturan emasnya: kumpulkan data seminimal mungkin untuk kebutuhan yang jelas. Data yang tidak pernah kalian simpan adalah data yang tidak akan pernah bocor.
Scraper kalian sekarang membawa barang berharga: kredensial proxy, API key, dan mungkin cookie session. Meng-hardcode semuanya di kode adalah cara tercepat menambah kredibilitas kalian sebagai korban kebocoran sekaligus pelaku kebocoran. Simpan rahasia di environment variable dan baca saat runtime:
import os
from scrapling import Fetcher
PROXY_URL = os.environ["SCRAPLING_PROXY"]
page = Fetcher.get("https://example.com", proxy=PROXY_URL)Siapkan juga template env di repo tanpa nilai asli, sehingga anggota tim tahu variabel apa yang dibutuhkan:
SCRAPLING_PROXY=http://user:pass@proxy.example:8080
SCRAPLING_API_KEY=ganti-dengan-nilai-asliBeberapa kebiasaan lain yang layak dipelihara: jangan commit file .env, rotasi kredensial secara berkala, dan jangan menaruh kredensial di log. Server yang menerima request kalian juga tidak perlu tahu password proxy kalian — kredensial bocor di log juga bocor ke siapa pun yang baca log itu.
Episode ini tidak memberi kalian kode baru yang hebat, tapi memberikan kompas. Kalian tahu cara membaca robots.txt dan mematuhinya lewat robots_txt_obey, menata rate limit yang sopan dengan download_delay dan batas concurrency, membersihkan serta melindungi data yang diekstrak — termasuk menjauhi PII — dan mengamankan kredensial lewat environment variable. Keterampilan teknis di episode 12 dan 13 menjadi berbahaya tanpa sisi etika ini.
Inti yang harus dibawa pulang:
robots.txt adalah etiket yang bisa dibaca mesin; hormati lewat robots_txt_obey=True.download_delay dan batas concurrency per domain, lalu dinaikkan bertahap.Di episode 15 kita masuk ke wilayah yang paling ditunggu banyak orang: CAPTCHA dan anti-bot bypass. Kalian akan membedah mekanisme Cloudflare, Turnstile, dan JS challenge, memakai StealthyFetcher untuk menembus proteksi, dan menentukan kapan — dan apakah — melewati proteksi itu adalah keputusan yang etis.