Ölçülü Veri Kazıma Uygulamaları
robots.txt uyumluluğu, kullanıcı aracısı üst bilgileri, istek gecikmeleri ve önbellekleme.
Ölçülü Veri Kazıma Uygulamaları, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Saygılı Web Kazımanın Önemi
Web kazıma sunucuları zorlayabilir, hizmet koşullarını ihlal edebilir ve ajanın IP adresinin engellenmesine yol açabilir. Sorumlu kazıyıcılar istek hız sınırlarına uyar, kendilerini tanıtır ve web sitelerinin yayımladığı kurallara riayet eder.
Bu derste etik ve sürdürülebilir kazıma için kullanılan araçlar ve teknikler ele alınmaktadır.
robots.txt Dosyasını Denetleme
Her web sitesi, otomatik ajanların hangi yollara erişebileceğini veya erişemeyeceğini belirten bir robots.txt dosyası yayımlayabilir. Python'ın standart kütüphanesinde bu dosyayı ayrıştırmak için urllib.robotparser bulunur.
Bir siteyi kazımadan önce her zaman robots.txt dosyasını kontrol edin.
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 FalseAçıklayıcı Bir Kullanıcı Aracısı Belirleme
User-Agent HTTP üstbilgisi, isteği kimin yaptığını belirtir. Dürüst bir User-Agent, site yöneticilerinin botunuzun ne olduğunu ve sorun çıkması durumunda sizinle nasıl iletişim kurabileceklerini anlamasını sağlar. Engellemelerden kaçmak için tarayıcı kılığına girmek etik açıdan sorunludur.
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)time.sleep() ile İstek Hızını Sınırlama
Saniyede yüzlerce istek göndermek bir sunucuyu aşırı yükleyebilir ve çoğu zaman hizmet reddi saldırısı olarak değerlendirilir. time.sleep() kullanarak istekler arasına gecikmeler ekleyin. Gecikmeyi daha az robotik ve daha insansı kılmak için random.uniform() kullanın.
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)Retry-After Üstbilgilerine Uyma
Bir sunucu 429 Too Many Requests yanıtı verdiğinde genellikle kaç saniye beklenmesi gerektiğini belirten bir Retry-After üstbilgisi içerir. Ajanınız bunu okumalı ve hemen yeniden denemek yerine bu süreye uymalıdır.
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 responseTekrarlanan Getirmeleri Önlemek için Yanıtları Önbelleğe Alma
requests-cache, HTTP yanıtlarını otomatik olarak diskte önbelleğe alır. Ajanınızın aynı URL'yi birden çok kez getirmesi gerekiyorsa (örneğin geliştirme veya yeniden çalıştırma sırasında), önbelleğe alınmış yanıtlar sunucuya yeniden istek gönderilmeden anında döndürülür.
# 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) # Truehttpx ile Elle Dosya Tabanlı Önbelleğe Alma
requests-cache kullanmayı tercih etmiyorsanız basit bir dosya tabanlı önbellek iyi çalışır. Yanıtları URL özetine göre adlandırılmış JSON dosyaları olarak saklayın ve dosya yeterince güncelse bunları yeniden yükleyin.
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 dataHizmet Koşullarını Okuma
Herhangi bir siteyi kazımadan önce hizmet koşullarını okuyun. Birçoğu otomatik erişimi veya verilerinin ticari amaçla kullanılmasını açıkça yasaklar. Hizmet koşullarını ihlal etmek yalnızca IP engeline değil, hukuki işlemlere de yol açabilir.
Resmî bir uygulama programlama arayüzü varsa HTML kazımak yerine her zaman onu tercih edin; daha hızlı, daha kararlı ve hukuken daha güvenlidir.
Hatalarda Üstel Geri Çekilme
Bir istek başarısız olduğunda hemen yeniden denemeyin. Üstel geri çekilme kullanın: 1 saniye, ardından 2 saniye, sonra 4 saniye bekleyin ve bu şekilde devam edin. Bu yaklaşım, zorlanan bir sunucunun sürekli isteklerle bunaltılmasını önler ve üretim ajanlarında kullanılan profesyonel bir yöntemdir.
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 {}Yalnızca İhtiyacınız Olanı Kazıma
Ajanınızın gerçekten ihtiyaç duyduğu verileri getirerek sunucu yükünü en aza indirin. Küçük bir uygulama programlama arayüzü uç noktası aynı verileri döndürebiliyorsa tüm sayfaları indirmekten kaçının. Tam gövdeyi getirmeden önce bir kaynağın değişip değişmediğini kontrol etmek için HEAD isteklerini kullanın.
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 TrueSaygılı Web Kazıma Kurallarının Özeti
Ajanınız herhangi bir siteyi kazımadan önce kullanabileceğiniz kısa kontrol listesi:
robots.txtdosyasını kontrol edin ve izin verilmeyen yollarla ilgili kurallara uyun- Dürüst ve açıklayıcı bir
User-Agentbelirleyin - İstekler arasına rastgele gecikmeler ekleyin (
time.sleep(random.uniform(1,3))) - 429 yanıtlarındaki
Retry-Afterüstbilgilerine uyun - Gereksiz tekrarlanan getirmeleri önlemek için yanıtları önbelleğe alın
- Sitenin hizmet koşullarını okuyun
- Mevcut olduğunda HTML kazımak yerine resmî uygulama programlama arayüzlerini tercih edin
Bilgi Kontrolü: Saygılı Web Kazıma
Etik ve saygılı web kazıma uygulamaları konusundaki anlayışınızı sınayın.
Özet: Saygılı Web Kazıma Uygulamaları
Artık sorumlu bir şekilde web kazımak için eksiksiz bir araç setine sahipsiniz:
- Erişmenize izin verilenleri kontrol etmek için
robotparser - Botunuzu tanımlayan açıklayıcı
User-Agentüstbilgileri - İstekler arasında
time.sleep(random.uniform(1,3)) - Yinelenen getirmeleri önlemek için
requests-cacheveya elle önbelleğe alma - Hata yönetimi için üstel geri çekilme
- Hukuki farkındalık: hizmet koşullarını her zaman kontrol edin
Sorumlu web kazıma daha sağlıklı bir web oluşturur ve ajanlarınızın engellenmeden çalışmasını sağlar.
Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 60
- Dersler
- 239
Sıkça Sorulan Sorular
“Ölçülü Veri Kazıma Uygulamaları” dersi ücretsiz mi?
Evet — “Ölçülü Veri Kazıma Uygulamaları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Ölçülü Veri Kazıma Uygulamaları” dersinde ne öğreneceğim?
robots.txt uyumluluğu, kullanıcı aracısı üst bilgileri, istek gecikmeleri ve önbellekleme. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Ölçülü Veri Kazıma Uygulamaları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Aracılar İçin HTTP İstemcileri: httpx ve requests
- BeautifulSoup ile HTML Ayrıştırma
- Sayfalandırma ve Dinamik İçeriği Ele Alma
- Ölçülü Veri Kazıma Uygulamaları