Ansvarlig scraping-praksis
Overholdelse af robots.txt, user-agent-headers, forsinkelser mellem requests og caching.
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 FalseAngiv 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 responseCaching 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) # TrueManuel 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 dataLæ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 TrueOpsummering 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:
robotparsertil 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ørgslerrequests-cacheeller 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.
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
- HTTP-klienter til agenter: httpx og requests
- Parsing af HTML med BeautifulSoup
- Håndtering af paginering og dynamisk indhold
- Ansvarlig scraping-praksis