Praktik Scraping yang Bertanggung Jawab
Kepatuhan terhadap robots.txt, header agen pengguna, jeda permintaan, dan caching.
Praktik Scraping yang Bertanggung Jawab adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mengapa Pengambilan Data Web yang Bertanggung Jawab Itu Penting
Pengambilan data web dapat membebani server, melanggar ketentuan layanan, dan menyebabkan IP agen Anda diblokir. Alat pengambil data yang bertanggung jawab mematuhi batas laju, mengidentifikasi dirinya, dan mengikuti aturan yang dipublikasikan situs web.
Pelajaran ini membahas alat dan teknik untuk mengambil data web secara etis dan berkelanjutan.
Memeriksa robots.txt
Setiap situs web dapat menerbitkan berkas robots.txt yang menentukan jalur mana yang boleh atau tidak boleh diakses oleh agen otomatis. Pustaka standar Python menyertakan urllib.robotparser untuk mengurai berkas ini.
Selalu periksa robots.txt sebelum mengambil data dari suatu situs.
import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
# Check if our bot can fetch a specific path
can_fetch = rp.can_fetch('MyAgent/1.0', 'https://example.com/public-data')
print(f'Can fetch: {can_fetch}') # True or False
cannot_fetch = rp.can_fetch('*', 'https://example.com/private/admin')
print(f'Admin allowed: {cannot_fetch}') # Often FalseMenetapkan User-Agent yang Deskriptif
Header HTTP User-Agent mengidentifikasi pihak yang mengirimkan permintaan. User-Agent yang jujur memberi tahu administrator situs apa bot Anda dan cara menghubungi Anda jika terjadi masalah. Menyamarkan bot sebagai peramban untuk menghindari pemblokiran menimbulkan persoalan etika.
import httpx
headers = {
# Honest, descriptive User-Agent
'User-Agent': 'MyResearchBot/1.0 (contact: me@example.com; purpose: academic research)'
}
response = httpx.get(
'https://example.com/data',
headers=headers,
timeout=10.0
)
print(response.status_code)Membatasi Laju dengan time.sleep()
Mengirim ratusan permintaan per detik dapat membebani server dan sering dianggap sebagai serangan penolakan layanan. Tambahkan jeda di antara permintaan menggunakan time.sleep(). Gunakan random.uniform() agar jedanya tidak terlalu berpola seperti robot dan lebih menyerupai perilaku manusia.
import time
import random
import httpx
urls = [
'https://example.com/page/1',
'https://example.com/page/2',
'https://example.com/page/3'
]
for url in urls:
response = httpx.get(url, timeout=10.0)
print(f'Fetched {url}: {response.status_code}')
# Wait between 1 and 3 seconds before the next request
delay = random.uniform(1, 3)
print(f'Sleeping {delay:.1f}s...')
time.sleep(delay)Mematuhi Header Retry-After
Saat server merespons dengan 429 Too Many Requests, biasanya server menyertakan header Retry-After yang menentukan berapa detik Anda harus menunggu. Agen Anda harus membaca header ini dan mematuhinya, bukan langsung mencoba lagi.
import time
import httpx
def fetch_with_retry(url: str) -> httpx.Response:
while True:
response = httpx.get(url, timeout=10.0)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 5))
print(f'Rate limited. Waiting {retry_after}s...')
time.sleep(retry_after)
continue # retry
response.raise_for_status()
return responseMenyimpan Respons dalam Cache untuk Menghindari Pengambilan Ulang
requests-cache secara otomatis menyimpan respons HTTP ke disk. Jika agen Anda perlu mengambil URL yang sama beberapa kali (misalnya selama pengembangan atau pelaksanaan ulang), respons yang tersimpan dalam cache dikembalikan secara instan tanpa mengakses server.
# pip install requests-cache
import requests_cache
# Install the cache globally — cached responses expire after 1 hour
requests_cache.install_cache(
'agent_cache',
backend='sqlite',
expire_after=3600 # seconds
)
import requests
# First call: fetches from network and caches
response = requests.get('https://api.example.com/data')
print(response.from_cache) # False
# Second call: returns cached result instantly
response2 = requests.get('https://api.example.com/data')
print(response2.from_cache) # TrueCaching Berbasis Berkas Secara Manual dengan httpx
Jika Anda memilih untuk tidak menggunakan requests-cache, cache berbasis berkas sederhana dapat berfungsi dengan baik. Simpan respons sebagai berkas JSON yang kuncinya berasal dari hash URL, lalu muat ulang respons tersebut jika berkasnya masih cukup baru.
import hashlib
import json
import os
import time
import httpx
CACHE_DIR = '/tmp/agent_cache'
os.makedirs(CACHE_DIR, exist_ok=True)
def cached_get(url: str, ttl_seconds: int = 3600) -> dict:
key = hashlib.md5(url.encode()).hexdigest()
cache_file = os.path.join(CACHE_DIR, key + '.json')
if os.path.exists(cache_file):
age = time.time() - os.path.getmtime(cache_file)
if age < ttl_seconds:
with open(cache_file) as f:
return json.load(f)
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
data = response.json()
with open(cache_file, 'w') as f:
json.dump(data, f)
return dataMembaca Ketentuan Layanan
Sebelum mengambil data dari situs mana pun, bacalah Ketentuan Layanannya. Banyak situs secara eksplisit melarang akses otomatis atau penggunaan data mereka untuk tujuan komersial. Pelanggaran Ketentuan Layanan dapat mengakibatkan tindakan hukum, bukan sekadar pemblokiran IP.
Jika tersedia API resmi, selalu pilih API tersebut daripada mengambil data dari HTML—API lebih cepat, lebih stabil, dan lebih aman secara hukum.
Kemunduran Eksponensial saat Terjadi Kesalahan
Jika permintaan gagal, jangan langsung mencobanya lagi. Gunakan kemunduran eksponensial: tunggu 1 detik, lalu 2 detik, kemudian 4 detik, dan seterusnya. Cara ini mencegah server yang sedang kesulitan terus-menerus menerima permintaan dan merupakan pola profesional dalam agen produksi.
import time
import httpx
def fetch_with_backoff(url: str, max_retries: int = 4) -> dict:
for attempt in range(max_retries):
try:
response = httpx.get(url, timeout=10.0)
response.raise_for_status()
return response.json()
except (httpx.HTTPStatusError, httpx.RequestError) as e:
if attempt == max_retries - 1:
raise
wait = 2 ** attempt # 1, 2, 4, 8 seconds
print(f'Attempt {attempt+1} failed: {e}. Retrying in {wait}s...')
time.sleep(wait)
return {}Mengambil Hanya Data yang Diperlukan
Minimalkan beban server dengan hanya mengambil data yang benar-benar diperlukan agen Anda. Hindari mengunduh seluruh halaman jika titik akhir API kecil dapat mengembalikan data yang sama. Gunakan permintaan HEAD untuk memeriksa apakah suatu sumber daya telah berubah sebelum mengambil isi lengkapnya.
import httpx
def has_page_changed(url: str, last_etag: str = None) -> bool:
headers = {}
if last_etag:
headers['If-None-Match'] = last_etag
response = httpx.head(url, headers=headers, timeout=5.0)
if response.status_code == 304: # Not Modified
return False
new_etag = response.headers.get('ETag')
print(f'New ETag: {new_etag}')
return TrueRingkasan Aturan Pengambilan Data Web yang Bertanggung Jawab
Daftar periksa singkat sebelum agen Anda mengambil data dari suatu situs:
- Periksa
robots.txtdan patuhi aturan pelarangannya - Tetapkan
User-Agentyang jujur dan deskriptif - Tambahkan jeda acak di antara permintaan (
time.sleep(random.uniform(1,3))) - Patuhi header
Retry-Afterpada respons 429 - Simpan respons dalam cache untuk menghindari pengambilan berulang
- Baca Ketentuan Layanan situs tersebut
- Utamakan API resmi daripada pengambilan data dari HTML jika tersedia
Pemeriksaan Pemahaman: Pengambilan Data Web yang Bertanggung Jawab
Uji pemahaman Anda tentang praktik pengambilan data web yang etis dan bertanggung jawab.
Ringkasan: Praktik Pengambilan Data Web yang Bertanggung Jawab
Anda sekarang memiliki perangkat lengkap untuk mengambil data web secara bertanggung jawab:
robotparseruntuk memeriksa hal-hal yang boleh Anda akses- Header
User-Agentdeskriptif yang mengidentifikasi bot Anda time.sleep(random.uniform(1,3))di antara permintaanrequests-cacheatau caching manual untuk menghindari pengambilan duplikat- Kemunduran eksponensial untuk menangani kesalahan
- Kesadaran hukum: selalu periksa Ketentuan Layanan
Pengambilan data web yang bertanggung jawab membantu membangun web yang lebih sehat dan menjaga agen Anda tetap berjalan tanpa pemblokiran.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Praktik Scraping yang Bertanggung Jawab” gratis?
Ya — teks lengkap “Praktik Scraping yang Bertanggung Jawab” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Praktik Scraping yang Bertanggung Jawab”?
Kepatuhan terhadap robots.txt, header agen pengguna, jeda permintaan, dan caching. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Praktik Scraping yang Bertanggung Jawab” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Klien HTTP untuk Agen: httpx dan requests
- Mengurai HTML dengan BeautifulSoup
- Menangani Paginasi dan Konten Dinamis
- Praktik Scraping yang Bertanggung Jawab