AI-agenter · Lektion

Ansvarlig scraping-praksis

Overholdelse af robots.txt, user-agent-headers, forsinkelser mellem requests og caching.

Lektion 4 af 413 trin

Ansvarlig scraping-praksis er en gratis AI-agenter-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i AI-agenter, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. AI-agenter-kurset indeholder 4 lektioner i alt.

Hvorfor ansvarlig webskrabning er vigtig

Webskrabning kan belaste servere, overtræde brugsbetingelser og få din agents IP-adresse blokeret. Ansvarlige webskrabere respekterer hastighedsbegrænsninger, identificerer sig og følger de regler, websteder offentliggør.

Denne lektion gennemgår værktøjer og teknikker til etisk og bæredygtig webskrabning.

Kontrol af robots.txt

Alle websteder kan offentliggøre en robots.txt-fil, der angiver, hvilke stier automatiserede agenter må eller ikke må tilgå. Pythons standardbibliotek indeholder urllib.robotparser til at fortolke denne fil.

Tjek altid robots.txt, før du skraber et websted.

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 False

Angiv en beskrivende User-Agent

HTTP-headeren User-Agent identificerer, hvem der sender en forespørgsel. En ærlig User-Agent fortæller webstedets administratorer, hvad dit program er, og hvordan de kan kontakte dig, hvis der opstår problemer. Det giver etiske problemer at udgive sig for at være en browser for at undgå blokeringer.

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)

Begrænsning af anmodningshastigheden med time.sleep()

Hvis du sender hundredvis af forespørgsler i sekundet, kan du overbelaste en server, og det bliver ofte behandlet som et tjenestenægtelsesangreb. Tilføj forsinkelser mellem forespørgsler med time.sleep(). Brug random.uniform() for at gøre forsinkelsen mindre robotagtig og mere menneskelignende.

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)

Overholdelse af Retry-After-headere

Når en server svarer med 429 Too Many Requests, indeholder svaret ofte en Retry-After-header, der angiver, hvor mange sekunder du skal vente. Din agent bør læse denne værdi og overholde den i stedet for straks at prøve igen.

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 response

Caching af svar for at undgå gentagne hentninger

requests-cache gemmer automatisk HTTP-svar i en cache på disken. Hvis din agent skal hente den samme URL flere gange (f.eks. under udvikling eller ved nye kørsler), returneres de gemte svar straks uden at kontakte serveren.

# 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)  # True

Manuel filbaseret cache med httpx

Hvis du foretrækker ikke at bruge requests-cache, fungerer en simpel filbaseret cache godt. Gem svar som JSON-filer med en hash af URL'en som nøgle, og indlæs dem igen, hvis filen stadig er tilstrækkelig ny.

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 data

Læsning af brugsbetingelser

Læs webstedets brugsbetingelser, før du skraber det. Mange forbyder udtrykkeligt automatiseret adgang eller kommerciel brug af deres data. Overtrædelse af brugsbetingelserne kan føre til sagsanlæg, ikke kun en blokeret IP-adresse.

Hvis der findes et officielt API, skal du altid foretrække det frem for at skrabe HTML'en — det er hurtigere, mere stabilt og juridisk mere sikkert.

Eksponentiel ventetid ved fejl

Når en forespørgsel mislykkes, skal du ikke prøve igen med det samme. Brug eksponentielt længere ventetid: vent 1 sek., derefter 2 sek., så 4 sek. osv. Det undgår at overbelaste en server, der allerede har problemer, og er en professionel fremgangsmåde for agenter i produktion.

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 {}

Indsaml kun det, du har brug for

Minimér serverbelastningen ved kun at hente det, din agent faktisk har brug for. Undgå at downloade hele sider, når et lille API-slutpunkt returnerer de samme data. Brug HEAD-forespørgsler til at kontrollere, om en ressource er ændret, før du henter hele indholdet.

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 True

Opsummering af regler for ansvarlig webskrabning

En hurtig tjekliste, før din agent skraber et websted:

  • Tjek robots.txt, og overhold reglerne for forbudte stier
  • Angiv en ærlig og beskrivende User-Agent
  • Tilføj tilfældige forsinkelser mellem forespørgsler (time.sleep(random.uniform(1,3)))
  • Overhold Retry-After-headere ved svar med status 429
  • Gem svar i en cache for at undgå overflødige hentninger
  • Læs webstedets brugsbetingelser
  • Foretræk officielle API'er frem for HTML-skrabning, når det er muligt

Videnstjek: Ansvarlig webskrabning

Tjek din forståelse af etisk og ansvarlig webskrabning.

Opsummering: Ansvarlig webskrabning

Du har nu et komplet værktøjssæt til ansvarlig webskrabning:

  • robotparser til at kontrollere, hvad du har tilladelse til at tilgå
  • Beskrivende User-Agent-headere, der identificerer dit program
  • time.sleep(random.uniform(1,3)) mellem forespørgsler
  • requests-cache eller manuel caching for at undgå dobbelte hentninger
  • Eksponentielt længere ventetid ved fejlhåndtering
  • Juridisk opmærksomhed: Tjek altid brugsbetingelserne

Ansvarlig webskrabning skaber et sundere web og holder dine agenter kørende uden blokeringer.

Gratis at komme i gang

Lær AI-agenter med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
60
Lektioner
239

Ofte stillede spørgsmål

Er lektionen “Ansvarlig scraping-praksis” gratis?

Ja — hele teksten til “Ansvarlig scraping-praksis” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af AI-agenter-kurset, skal du opgradere til CoddyKit PRO. AI-agenter-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Ansvarlig scraping-praksis”?

Overholdelse af robots.txt, user-agent-headers, forsinkelser mellem requests og caching. Du øver dig i AI-agenter med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på AI-agenter?

Der kræves ingen tidligere erfaring. AI-agenter på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Ansvarlig scraping-praksis”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne AI-agenter-lektion?

Ja. Alle AI-agenter-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. HTTP-klienter til agenter: httpx og requests
  2. Parsing af HTML med BeautifulSoup
  3. Håndtering af paginering og dynamisk indhold
  4. Ansvarlig scraping-praksis
← Tilbage til AI-agenter