Bygga en Scrapy-spindel
Skapa ett Scrapy-projekt, skriv en spider och följ länkar automatiskt.
Bygga en Scrapy-spindel är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.
Vad är Scrapy?
Scrapy är ett komplett ramverk för webbskrapning med inbyggd asynkron crawling, item pipelines, middlewares och exportverktyg.
# pip install scrapy
# Create a project:
# scrapy startproject myspider
# myspider/
# scrapy.cfg
# myspider/
# settings.py
# spiders/
# quotes_spider.pySkapa en spider
Skapa en subklass av scrapy.Spider, ange name och start_urls och implementera sedan parse().
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ["https://quotes.toscrape.com"]
def parse(self, response):
for quote in response.css("div.quote"):
yield {
"text": quote.css("span.text::text").get(),
"author": quote.css("small.author::text").get(),
}CSS- och XPath-selektorer
Använd response.css("selector") eller response.xpath("//xpath") för att extrahera data. .get() returnerar den första träffen och .getall() returnerar alla.
def parse(self, response):
# CSS:
titles = response.css("h2.title::text").getall()
# XPath:
links = response.xpath("//a/@href").getall()
yield {"titles": titles, "links": links}Följ länkar
Yielda en scrapy.Request för att följa en länk och tolka nästa sida.
import scrapy
class Spider(scrapy.Spider):
name = "crawler"
start_urls = ["https://quotes.toscrape.com"]
def parse(self, response):
for quote in response.css("div.quote"):
yield {"text": quote.css("span.text::text").get()}
next_page = response.css("li.next a::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)Items och ItemLoaders
Definiera Item-klasser för att strukturera skrapade data och använd ItemLoader för att rensa och omvandla fält.
import scrapy
class ProductItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
url = scrapy.Field()
def parse(self, response):
item = ProductItem()
item["name"] = response.css("h1::text").get(strip=True)
item["price"] = response.css(".price::text").re_first(r"[\d.]+")
item["url"] = response.url
yield itemKör spider:n
Kör från projektkatalogen. Exportera till JSON, CSV eller en anpassad pipeline.
# Run and print to console:
# scrapy crawl quotes
# Save to JSON:
# scrapy crawl quotes -o quotes.json
# Save to CSV:
# scrapy crawl quotes -o quotes.csv
# Scrapy shell for interactive testing:
# scrapy shell "https://quotes.toscrape.com"Inställningar: DOWNLOAD_DELAY och CONCURRENT_REQUESTS
Visa hänsyn: lägg till fördröjningar och begränsa antalet samtidiga anrop för att undvika att överbelasta servrar.
# settings.py
DOWNLOAD_DELAY = 1 # 1 second between requests
CONCURRENT_REQUESTS = 8 # max 8 at a time
CONCURRENT_REQUESTS_PER_DOMAIN = 2
ROBOTSTXT_OBEY = True # respect robots.txtMiddlewares
Middlewares fångar upp anrop och svar. Använd de inbyggda för rotation av user-agent, återförsök och cookies.
# settings.py
DOWNLOADER_MIDDLEWARES = {
"scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
"scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
"myspider.middlewares.RotateUserAgentMiddleware": 400,
}Item pipelines
Pipelines bearbetar items efter skrapningen: rensa data, validera, ta bort dubbletter och spara i en databas.
# pipelines.py
class CleanPipeline:
def process_item(self, item, spider):
item["name"] = item["name"].strip()
return item
class DBPipeline:
def open_spider(self, spider):
self.conn = connect_db()
def process_item(self, item, spider):
self.conn.insert(dict(item))
return itemHantera inloggning
Använd Scrapys FormRequest för att skicka ett inloggningsformulär och bevara sessionscookien.
import scrapy
class AuthSpider(scrapy.Spider):
name = "auth"
login_url = "https://example.com/login"
def start_requests(self):
yield scrapy.Request(self.login_url, self.login)
def login(self, response):
yield scrapy.FormRequest.from_response(
response,
formdata={"user": "me", "pass": "secret"},
callback=self.parse
)scrapy-playwright för JS-sidor
Pluginen scrapy-playwright integrerar Playwright i Scrapy för JavaScript-renderade sidor.
# pip install scrapy-playwright
# playwright install
# settings.py:
# DOWNLOAD_HANDLERS = {
# "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
# "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
# }
# In spider:
# yield scrapy.Request(url, meta={"playwright": True})Snabbtest
Vad gör response.follow(href, callback) i en Scrapy-spider?
Sammanfattning
Scrapy-spiders ärver från scrapy.Spider, deklarerar start_urls och returnerar items eller ytterligare Requests från parse() med yield. Använd CSS/XPath-selektorer, visa hänsyn med DOWNLOAD_DELAY och använd pipelines för att spara data.
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
- 76
- Lektioner
- 320
Vanliga frågor
Är lektionen ”Bygga en Scrapy-spindel” gratis?
Ja – hela texten till ”Bygga en Scrapy-spindel” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Bygga en Scrapy-spindel”?
Skapa ett Scrapy-projekt, skriv en spider och följ länkar automatiskt. Ni övar på Python Academy 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 Python Academy?
Du behöver inga förkunskaper. Utbildningen i Python Academy 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 3 av 4.
Hur lång tid tar lektionen ”Bygga en Scrapy-spindel”?
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 Python Academy-lektionen?
Ja. Varje Python Academy-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
- HTTP-anrop med requests och httpx
- Tolka HTML med BeautifulSoup
- Bygga en Scrapy-spindel
- Hantera JavaScript och åtgärder mot skrapning