0Pricing
Python Academy · Lekcja

Budowanie spidera Scrapy

Proszę utworzyć projekt Scrapy, napisać spidera i automatycznie podążać za odnośnikami.

Budowanie spidera Scrapy to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Czym jest Scrapy

Scrapy to rozbudowany framework do scrapingu internetowego z wbudowanym asynchronicznym przeszukiwaniem, potokami elementów, middleware i eksporterami.

# pip install scrapy

# Create a project:
# scrapy startproject myspider

# myspider/
#   scrapy.cfg
#   myspider/
#     settings.py
#     spiders/
#       quotes_spider.py

Tworzenie spidera

Należy utworzyć podklasę scrapy.Spider, ustawić name i start_urls, a następnie zaimplementować 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(),
            }

Selektory CSS i XPath

Do wydobywania danych należy używać response.css("selector") lub response.xpath("//xpath"). .get() zwraca pierwsze dopasowanie, a .getall() — wszystkie.

def parse(self, response):
    # CSS:
    titles = response.css("h2.title::text").getall()

    # XPath:
    links = response.xpath("//a/@href").getall()

    yield {"titles": titles, "links": links}

Podążanie za linkami

Należy zwrócić za pomocą yield obiekt scrapy.Request, aby przejść za linkiem i sparsować następną stronę.

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)

Elementy i ItemLoaders

Klasy Item służą do strukturyzowania zescrapowanych danych, a ItemLoader — do oczyszczania i przekształcania pól.

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 item

Uruchamianie spidera

Spider należy uruchamiać z katalogu projektu. Dane można eksportować do JSON, CSV lub niestandardowego potoku.

# 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"

Ustawienia: DOWNLOAD_DELAY i CONCURRENT_REQUESTS

Należy zachować umiar: dodawać opóźnienia i ograniczać liczbę równoczesnych żądań, aby nie przeciążać serwerów.

# 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.txt

Middleware

Middleware przechwytuje żądania i odpowiedzi. Wbudowanych mechanizmów należy używać do rotacji user-agentów, ponawiania żądań i obsługi plików cookie.

# settings.py
DOWNLOADER_MIDDLEWARES = {
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
    "myspider.middlewares.RotateUserAgentMiddleware": 400,
}

Potoki elementów

Potoki przetwarzają elementy po scrapingu: oczyszczają dane, sprawdzają ich poprawność, usuwają duplikaty i zapisują dane w bazie danych.

# 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 item

Obsługa logowania

FormRequest z Scrapy należy używać do przesyłania formularza logowania i zachowania pliku cookie sesji.

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 dla stron JS

Wtyczka scrapy-playwright integruje Playwright z Scrapy na potrzeby stron renderowanych przez JavaScript.

# 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})

Szybkie sprawdzenie

Co robi response.follow(href, callback) w spiderze Scrapy?

Podsumowanie

Spidery Scrapy dziedziczą po scrapy.Spider, deklarują start_urls i zwracają za pomocą yield elementy lub kolejne obiekty Requests z parse(). Należy używać selektorów CSS/XPath, zachowywać umiar za pomocą DOWNLOAD_DELAY oraz korzystać z potoków do utrwalania danych.

Często zadawane pytania

Czy lekcja „Budowanie spidera Scrapy” jest bezpłatna?

Tak — pełny tekst „Budowanie spidera Scrapy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Budowanie spidera Scrapy”?

Proszę utworzyć projekt Scrapy, napisać spidera i automatycznie podążać za odnośnikami. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Budowanie spidera Scrapy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Żądania HTTP za pomocą requests i httpx
  2. Parsowanie HTML za pomocą BeautifulSoup
  3. Budowanie spidera Scrapy
  4. Obsługa JavaScriptu i zabezpieczeń przed scrapingiem
← Powrót do Python Academy