Købasert oppgavefordeling
Lær hvordan meldingskøer som Redis og Celery frikobler URL-oppdagelse fra henting, slik at scraping kan skaleres på tvers av mange arbeidere.
Købasert oppgavefordeling er en gratis leksjon i Nettskraping og boter på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Nettskraping og boter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Nettskraping og boter inneholder totalt 4 leksjoner.
Flaskehalsen ved skalering
En scraper i én prosess er begrenset av CPU-en og nettverket på én maskin. For å skalere deler De arbeidet mellom mange arbeidere som kjører parallelt, eventuelt på forskjellige servere.
En oppgavekø er limet som fordeler arbeidet på en trygg måte.
Produsenter og konsumenter
Kømønsteret har to roller:
- Produsenter finner URL-er og legger oppgaver i køen.
- Konsumenter (arbeidere) henter oppgaver og laster inn sidene.
Ved å koble rollene fra hverandre kan hver side skaleres uavhengig.
En Redis-basert kø
Redis-lister gir en enkel og rask kø. Produsenter bruker LPUSH på URL-er, mens arbeidere bruker BRPOP for å hente dem og venter hvis det ikke finnes arbeid.
import redis
r = redis.Redis()
# producer
r.lpush('urls', 'https://site.com/page1')
# worker
_, url = r.brpop('urls')
print('processing', url)Hvorfor ikke dele en Python-liste
En liste i minnet fungerer bare innenfor én prosess. En Redis-kø deles mellom prosesser og maskiner, bevares hvis en arbeider krasjer, og håndterer samtidighet atomisk.
Introduksjon til Celery
Celery er et komplett rammeverk for oppgaver, bygget på en meldingsmegler som Redis. De definerer oppgaver som funksjoner og kaller dem asynkront; arbeidere henter dem automatisk.
from celery import Celery
app = Celery('scraper', broker='redis://localhost:6379/0')
@app.task
def scrape(url):
return fetch_and_parse(url)Distribuere oppgaver
Et kall til .delay() legger oppgaven i kø og returnerer umiddelbart. Arbeidere som kjører celery worker, konsumerer og utfører dem parallelt.
for url in discovered_urls:
scrape.delay(url)Nye forsøk og feil
Celery kan automatisk prøve mislykkede oppgaver på nytt med gradvis lengre ventetid, slik at en midlertidig nettverksfeil ikke fører til at en URL går tapt.
@app.task(bind=True, max_retries=3, default_retry_delay=10)
def scrape(self, url):
try:
return fetch_and_parse(url)
except ConnectionError as e:
raise self.retry(exc=e)Fjerne duplikate URL-er
I distribuert crawling kan den samme URL-en bli funnet to ganger. Bruk et Redis-sett som et «sett over besøkte» for å sikre at hver side hentes én gang.
if r.sadd('seen', url):
scrape.delay(url) # sadd returns 1 only if newly addedTilbakepress og samtidighet
Juster samtidigheten for arbeiderne etter hensynet til målstedet og båndbredden Deres. For mange arbeidere overbelaster nettstedet; for få gjør at køen bygger seg opp. Følg med på kølengden for å finne balansen.
# start 4 worker processes
// celery -A scraper worker --concurrency=4Resultater og lagring
Arbeidere bør skrive analyserte data til et delt lager, for eksempel en database eller objektlagring, og ikke returnere dem gjennom køen. Køen frakter oppgaver; datalageret inneholder resultatene.
Prioritetskøer
Alle URL-er er ikke like viktige. Send hastende oppgaver, for eksempel en kategoriindeks som åpner for mange undersider, til en kø med høy prioritet slik at arbeiderne håndterer dem før sider med lav verdi.
scrape.apply_async(args=[url], priority=9) # higher runs soonerRask kontroll
Test forståelsen Deres av købasert distribusjon.
Oppsummering
De har lært å skalere scraping med oppgavekøer: produsent-/konsumentmønsteret, Redis-baserte køer, Celery-oppgaver med .delay(), automatiske nye forsøk, fjerning av duplikate URL-er med Redis-sett, justering av samtidighet og skriving av resultater til delt lagring.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Købasert oppgavefordeling» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Nettskraping og boter, inkludert «Købasert oppgavefordeling», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Nettskraping og boter inneholder totalt 4 leksjoner.
Hva lærer jeg i «Købasert oppgavefordeling»?
Lær hvordan meldingskøer som Redis og Celery frikobler URL-oppdagelse fra henting, slik at scraping kan skaleres på tvers av mange arbeidere. Du øver på Nettskraping og boter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Nettskraping og boter?
Ingen tidligere erfaring er nødvendig. Nettskraping og boter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Købasert oppgavefordeling»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Nettskraping og boter-leksjonen?
Ja. Alle Nettskraping og boter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Distribuert scraping med Scrapy
- Cloud Functions for scraping
- Overvåking og logging
- Købasert oppgavefordeling