Rücksichtsvolle Scraping-Praktiken
Einhaltung von robots.txt, User-Agent-Header, Verzögerungen zwischen Requests und Caching.
Rücksichtsvolle Scraping-Praktiken ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Warum verantwortungsbewusstes Scraping wichtig ist
Web-Scraping kann Server belasten, gegen Nutzungsbedingungen verstoßen und dazu führen, dass die IP-Adresse Ihres Agenten gesperrt wird. Verantwortungsbewusste Scraper halten Ratenbegrenzungen ein, identifizieren sich und beachten die von Websites veröffentlichten Regeln.
Diese Lektion behandelt die Tools und Techniken für ethisches und nachhaltiges Scraping.
robots.txt prüfen
Jede Website kann eine Datei robots.txt veröffentlichen, in der festgelegt wird, auf welche Pfade automatisierte Agenten zugreifen dürfen oder nicht. Die Python-Standardbibliothek enthält urllib.robotparser, um diese Datei zu parsen.
Prüfen Sie immer die robots.txt, bevor Sie eine Website scrapen.
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 FalseEinen aussagekräftigen User-Agent festlegen
Der HTTP-Header User-Agent gibt an, wer eine Anfrage stellt. Ein ehrlicher User-Agent teilt Website-Administratoren mit, was Ihr Bot ist und wie sie Sie bei Problemen kontaktieren können. Sich als Browser auszugeben, um Sperren zu umgehen, ist ethisch bedenklich.
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)Ratenbegrenzung mit time.sleep()
Hunderte Anfragen pro Sekunde können einen Server überlasten und werden häufig als Denial-of-Service-Angriff eingestuft. Fügen Sie zwischen den Anfragen mit time.sleep() Verzögerungen ein. Verwenden Sie random.uniform(), um die Verzögerung weniger roboterhaft und menschlicher wirken zu lassen.
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-Header beachten
Wenn ein Server mit 429 Too Many Requests antwortet, enthält die Antwort häufig einen Retry-After-Header, der angibt, wie viele Sekunden gewartet werden soll. Ihr Agent sollte diesen Wert auslesen und beachten, statt sofort einen neuen Versuch zu starten.
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 responseAntworten zwischenspeichern, um wiederholte Abrufe zu vermeiden
requests-cache speichert HTTP-Antworten automatisch auf der Festplatte. Wenn Ihr Agent dieselbe URL mehrmals abrufen muss, beispielsweise während der Entwicklung oder bei erneuten Ausführungen, werden zwischengespeicherte Antworten sofort zurückgegeben, ohne den Server erneut anzufragen.
# 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) # TrueManuelles dateibasiertes Caching mit httpx
Wenn Sie requests-cache nicht verwenden möchten, funktioniert ein einfacher dateibasierter Cache gut. Speichern Sie Antworten als JSON-Dateien, deren Namen aus dem URL-Hash abgeleitet werden, und laden Sie sie erneut, solange die Datei noch aktuell genug ist.
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 dataNutzungsbedingungen lesen
Lesen Sie vor dem Scraping einer Website deren Nutzungsbedingungen. Viele verbieten den automatisierten Zugriff oder die kommerzielle Nutzung ihrer Daten ausdrücklich. Ein Verstoß gegen die ToS kann rechtliche Schritte nach sich ziehen, nicht nur eine IP-Sperre.
Wenn eine offizielle API existiert, bevorzugen Sie diese immer gegenüber dem Scraping von HTML – sie ist schneller, stabiler und rechtlich sicherer.
Exponentielles Backoff bei Fehlern
Wenn eine Anfrage fehlschlägt, versuchen Sie es nicht sofort erneut. Verwenden Sie exponentielles Backoff: Warten Sie 1 Sekunde, dann 2 Sekunden, dann 4 Sekunden usw. Dadurch vermeiden Sie, einen bereits überlasteten Server weiter zu belasten. Dieses Vorgehen ist in produktiven Agenten ein professionelles Muster.
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 {}Nur die benötigten Daten scrapen
Minimieren Sie die Serverlast, indem Sie nur das abrufen, was Ihr Agent tatsächlich benötigt. Vermeiden Sie es, ganze Seiten herunterzuladen, wenn ein kleiner API-Endpunkt dieselben Daten liefert. Verwenden Sie HEAD-Anfragen, um zu prüfen, ob sich eine Ressource geändert hat, bevor Sie den vollständigen Inhalt abrufen.
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 TrueZusammenfassung der Regeln für verantwortungsbewusstes Scraping
Eine kurze Checkliste, bevor Ihr Agent eine Website scrapt:
- Prüfen Sie
robots.txtund halten Sie sich an die Disallow-Regeln - Setzen Sie einen ehrlichen, aussagekräftigen
User-Agent - Fügen Sie zufällige Verzögerungen zwischen den Anfragen ein (
time.sleep(random.uniform(1,3))) - Beachten Sie
Retry-After-Header bei 429-Antworten - Speichern Sie Antworten zwischen, um redundante Abrufe zu vermeiden
- Lesen Sie die Nutzungsbedingungen der Website
- Bevorzugen Sie verfügbare offizielle APIs gegenüber dem HTML-Scraping
Wissenscheck: Verantwortungsbewusstes Scraping
Testen Sie Ihr Verständnis ethischer und verantwortungsbewusster Scraping-Verfahren.
Zusammenfassung: Verantwortungsbewusste Scraping-Verfahren
Sie verfügen nun über ein vollständiges Werkzeugset für verantwortungsbewusstes Scraping:
robotparser, um zu prüfen, worauf Sie zugreifen dürfen- Aussagekräftige
User-Agent-Header, die Ihren Bot identifizieren time.sleep(random.uniform(1,3))zwischen den Anfragenrequests-cacheoder manuelles Caching, um doppelte Abrufe zu vermeiden- Exponentielles Backoff zur Fehlerbehandlung
- Rechtliches Bewusstsein: Prüfen Sie immer die ToS
Verantwortungsbewusstes Scraping trägt zu einem gesünderen Web bei und sorgt dafür, dass Ihre Agenten ohne Sperren weiterlaufen.
Häufig gestellte Fragen
Ist die Lektion „Rücksichtsvolle Scraping-Praktiken“ kostenlos?
Ja — der vollständige Text von „Rücksichtsvolle Scraping-Praktiken“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Rücksichtsvolle Scraping-Praktiken“?
Einhaltung von robots.txt, User-Agent-Header, Verzögerungen zwischen Requests und Caching. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Rücksichtsvolle Scraping-Praktiken“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- HTTP-Clients für Agenten: httpx und requests
- HTML mit BeautifulSoup parsen
- Paginierung und dynamische Inhalte verarbeiten
- Rücksichtsvolle Scraping-Praktiken