Köbaserad uppgiftsfördelning
Lär dig hur meddelandeköer som Redis och Celery frikopplar URL-upptäckt från hämtning så att scraping kan skalas över många workers.
Köbaserad uppgiftsfördelning är en gratis lektion i Webbskrapning och botutveckling på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Webbskrapning och botutveckling, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Webbskrapning och botutveckling innehåller totalt 4 lektioner.
Skalningens flaskhals
En scraper i en enda process begränsas av en maskins CPU och nätverk. För att skala delar du upp arbetet mellan många workers som körs parallellt, eventuellt på olika servrar.
En task queue är det sammanbindande lagret som distribuerar arbetet på ett säkert sätt.
Producenter och konsumenter
Kö-mönstret har två roller:
- Producenter upptäcker URL:er och lägger uppgifter i kön.
- Konsumenter (workers) hämtar uppgifter och läser in sidorna.
Genom att frikoppla dem kan varje sida skalas oberoende av den andra.
En Redis-baserad kö
Redis-listor ger en enkel och snabb kö. Producenter använder LPUSH för URL:er och workers använder BRPOP för att hämta dem och blockeras tills arbete finns tillgängligt.
import redis
r = redis.Redis()
# producer
r.lpush('urls', 'https://site.com/page1')
# worker
_, url = r.brpop('urls')
print('processing', url)Varför inte dela en Python-lista
En lista i minnet fungerar bara inom en process. En Redis-kö delas mellan processer och maskiner, finns kvar om en worker kraschar och hanterar samtidighet atomiskt.
Introduktion till Celery
Celery är ett komplett ramverk för uppgifter som bygger på en broker som Redis. Du definierar uppgifter som funktioner och anropar dem asynkront; workers hämtar dem automatiskt.
from celery import Celery
app = Celery('scraper', broker='redis://localhost:6379/0')
@app.task
def scrape(url):
return fetch_and_parse(url)Skicka uppgifter
Att anropa .delay() lägger uppgiften i kön och returnerar omedelbart. Workers som kör celery worker konsumerar och kör dem parallellt.
for url in discovered_urls:
scrape.delay(url)Försök igen och hantera fel
Celery kan automatiskt försöka köra misslyckade uppgifter igen med ökande fördröjning, så att ett tillfälligt nätverksfel inte gör att en URL går förlorad.
@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)Eliminera dubbletter av URL:er
I distribuerad crawling kan samma URL upptäckas två gånger. Använd en Redis-mängd som ett filter över redan sedda URL:er, så att varje sida hämtas en gång.
if r.sadd('seen', url):
scrape.delay(url) # sadd returns 1 only if newly addedBaktryck och samtidighet
Ställ in antalet samtidiga workers efter målwebbplatsens belastningstolerans och din bandbredd. För många workers överbelastar webbplatsen; för få gör att kön byggs upp. Övervaka kölängden för att hitta balansen.
# start 4 worker processes
// celery -A scraper worker --concurrency=4Resultat och lagring
Workers bör skriva tolkade data till ett gemensamt lagringssystem, till exempel en databas eller objektlagring, i stället för att returnera dem genom kön. Kön transporterar uppgifter; datalagret innehåller resultaten.
Prioritetsköer
Alla URL:er är inte lika viktiga. Skicka brådskande uppgifter, till exempel ett kategoriindex som låser upp många undersidor, till en kö med hög prioritet så att workers hanterar dem före sidor med lågt värde.
scrape.apply_async(args=[url], priority=9) # higher runs soonerSnabb kontroll
Testa din förståelse av köbaserad distribution.
Sammanfattning
Du har lärt dig att skala scraping med uppgiftsköer: producent-/konsumentmönstret, Redis-baserade köer, Celery-uppgifter med .delay(), automatiska nya försök, eliminering av URL-dubbletter med Redis-mängder, justering av samtidighet och skrivning av resultat till gemensam lagring.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Köbaserad uppgiftsfördelning” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Webbskrapning och botutveckling, inklusive ”Köbaserad uppgiftsfördelning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Webbskrapning och botutveckling innehåller totalt 4 lektioner.
Vad lär jag mig i ”Köbaserad uppgiftsfördelning”?
Lär dig hur meddelandeköer som Redis och Celery frikopplar URL-upptäckt från hämtning så att scraping kan skalas över många workers. Ni övar på Webbskrapning och botutveckling med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Webbskrapning och botutveckling?
Du behöver inga förkunskaper. Utbildningen i Webbskrapning och botutveckling på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Köbaserad uppgiftsfördelning”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Webbskrapning och botutveckling-lektionen?
Ja. Varje Webbskrapning och botutveckling-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Distribuerad scraping med Scrapy
- Cloud Functions för scraping
- Övervakning och loggning
- Köbaserad uppgiftsfördelning