0Pricing
Python Academy · Урок

Создание паука Scrapy

Создайте проект Scrapy, напишите паука и автоматически переходите по ссылкам.

«Создание паука Scrapy» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Что такое Scrapy

Scrapy — полнофункциональный фреймворк для веб-парсинга со встроенным асинхронным обходом страниц, конвейерами элементов, промежуточными обработчиками и экспортерами.

# pip install scrapy

# Create a project:
# scrapy startproject myspider

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

Создание паука

Создайте подкласс scrapy.Spider, задайте name и start_urls, а затем реализуйте 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- и XPath-селекторы

Используйте response.css("selector") или response.xpath("//xpath") для извлечения данных. .get() возвращает первое совпадение, а .getall() — все совпадения.

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

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

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

Переход по ссылкам

Выдавайте объект scrapy.Request, чтобы перейти по ссылке и разобрать следующую страницу.

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)

Элементы и ItemLoaders

Определяйте классы Item, чтобы структурировать собранные данные, и используйте ItemLoader для очистки и преобразования полей.

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

Запуск паука

Запускайте паука из каталога проекта. Экспортируйте данные в JSON, CSV или пользовательский конвейер.

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

Настройки: DOWNLOAD_DELAY и CONCURRENT_REQUESTS

Соблюдайте осторожность: добавляйте задержки и ограничивайте число одновременных запросов, чтобы не перегружать серверы.

# 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

Промежуточные обработчики

Промежуточные обработчики перехватывают запросы и ответы. Используйте встроенные обработчики для смены User-Agent, повторных попыток и работы с файлами cookie.

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

Конвейеры элементов

Конвейеры обрабатывают элементы после парсинга: очищают и проверяют данные, удаляют дубликаты и сохраняют данные в базе данных.

# 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

Обработка входа в систему

Используйте FormRequest Scrapy для отправки формы входа и сохранения файла cookie сессии.

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 для страниц с JS

Плагин scrapy-playwright интегрирует Playwright с Scrapy для страниц, содержимое которых формируется с помощью 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})

Быстрая проверка

Что делает response.follow(href, callback) в пауке Scrapy?

Итоги

Пауки Scrapy создаются на основе scrapy.Spider, объявляют start_urls и выдают элементы или дополнительные объекты Request из parse() с помощью yield. Используйте CSS- и XPath-селекторы, соблюдайте осторожность с DOWNLOAD_DELAY и применяйте конвейеры для сохранения данных.

Часто задаваемые вопросы

Урок «Создание паука Scrapy» бесплатный?

Да — полный текст урока «Создание паука Scrapy» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание паука Scrapy»?

Создайте проект Scrapy, напишите паука и автоматически переходите по ссылкам. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Создание паука Scrapy»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. HTTP-запросы с requests и httpx
  2. Разбор HTML с помощью BeautifulSoup
  3. Создание паука Scrapy
  4. Обработка JavaScript и мер против парсинга
← Назад к Python Academy