Webscraping en bots · Les

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.

Les 4 van 413 stappen

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 added

Terugdruk 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=4

Resultaten 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 sooner

Korte 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.

Gratis beginnen

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

  1. Gedistribueerd scrapen met Scrapy
  2. Cloud Functions voor scraping
  3. Monitoring en logging
  4. Taakverdeling op basis van queues
← Terug naar Webscraping en bots