Taakverdeling op basis van queues
Leer hoe message queues zoals Redis en Celery URL-discovery loskoppelen van fetching, zodat scraping over veel workers kan worden geschaald.
Taakverdeling op basis van queues is een gratis Webscraping en bots-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Webscraping en bots. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Webscraping en bots bevat in totaal 4 lessen.
Het knelpunt bij opschalen
Een scraper met één proces wordt beperkt door de CPU en het netwerk van één machine. Om op te schalen, verdeel je het werk over meerdere werkers die parallel draaien, eventueel op verschillende servers.
Een takenwachtrij is het verbindende onderdeel dat het werk veilig verdeelt.
Producenten en consumenten
Het wachtrijpatroon heeft twee rollen:
- Producenten ontdekken URL's en plaatsen taken in de wachtrij.
- Consumenten (werkers) halen taken op en laden de pagina's.
Door deze rollen los te koppelen, kan elke kant onafhankelijk worden opgeschaald.
Een wachtrij op basis van Redis
Redis-lijsten vormen een eenvoudige, snelle wachtrij. Producenten plaatsen URL's met LPUSH; werkers halen ze met BRPOP op en wachten daarbij totdat er werk beschikbaar is.
import redis
r = redis.Redis()
# producer
r.lpush('urls', 'https://site.com/page1')
# worker
_, url = r.brpop('urls')
print('processing', url)Waarom geen Python-lijst delen
Een lijst in het geheugen werkt alleen binnen één proces. Een Redis-wachtrij wordt gedeeld tussen processen en machines, blijft behouden als een werker crasht en handelt gelijktijdige toegang atomair af.
Kennismaken met Celery
Celery is een volledig takenframework dat op een broker zoals Redis is gebouwd. Je definieert taken als functies en roept ze asynchroon aan; werkers pakken ze automatisch op.
from celery import Celery
app = Celery('scraper', broker='redis://localhost:6379/0')
@app.task
def scrape(url):
return fetch_and_parse(url)Taken distribueren
Als je .delay() aanroept, wordt de taak in de wachtrij geplaatst en keert de aanroep onmiddellijk terug. Werkers die celery worker uitvoeren, nemen de taken af en voeren ze parallel uit.
for url in discovered_urls:
scrape.delay(url)Opnieuw proberen en fouten
Celery kan mislukte taken automatisch opnieuw proberen met een steeds langere wachttijd, zodat een tijdelijke netwerkfout niet tot gevolg heeft dat een URL verloren gaat.
@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)URL's ontdubbelen
Bij gedistribueerd crawlen kan dezelfde URL twee keer worden ontdekt. Gebruik een Redis-set als filter voor al geziene URL's, zodat elke pagina één keer wordt opgehaald.
if r.sadd('seen', url):
scrape.delay(url) # sadd returns 1 only if newly addedTerugdruk en gelijktijdigheid
Stem de gelijktijdigheid van werkers af op de gewenste beleefdheid tegenover de doelsite en op je bandbreedte. Te veel werkers overbelasten de site; te weinig werkers laten de wachtrij oplopen. Houd de lengte van de wachtrij in de gaten om de juiste balans te vinden.
# start 4 worker processes
// celery -A scraper worker --concurrency=4Resultaten en opslag
Werkers moeten verwerkte gegevens naar een gedeelde opslag schrijven, zoals een database of objectopslag, en ze niet via de wachtrij terugsturen. De wachtrij vervoert taken; de gegevensopslag bevat de resultaten.
Prioriteitswachtrijen
Niet alle URL's zijn even belangrijk. Stuur dringende taken, zoals een categorie-index die veel onderliggende pagina's ontsluit, naar een wachtrij met hoge prioriteit, zodat werkers deze vóór pagina's met een lagere waarde afhandelen.
scrape.apply_async(args=[url], priority=9) # higher runs soonerKorte controle
Test je begrip van distributie op basis van wachtrijen.
Samenvatting
Je hebt geleerd hoe je scraping opschaalt met takenwachtrijen: het producent-consumentpatroon, wachtrijen op basis van Redis, Celery-taken met .delay(), automatisch opnieuw proberen, URL's ontdubbelen met Redis-sets, gelijktijdigheid afstemmen en resultaten naar gedeelde opslag schrijven.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Taakverdeling op basis van queues” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Webscraping en bots, waaronder “Taakverdeling op basis van queues”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Webscraping en bots bevat in totaal 4 lessen.
Wat leer ik in “Taakverdeling op basis van queues”?
Leer hoe message queues zoals Redis en Celery URL-discovery loskoppelen van fetching, zodat scraping over veel workers kan worden geschaald. Je oefent met Webscraping en bots door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Webscraping en bots te beginnen?
Ervaring vooraf is niet nodig. Webscraping en bots op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Taakverdeling op basis van queues”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Webscraping en bots?
Ja. Elke les over Webscraping en bots bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Gedistribueerd scrapen met Scrapy
- Cloud Functions voor scraping
- Monitoring en logging
- Taakverdeling op basis van queues