Scrapy: Простой пример для начинающих. Пошаговое руководство по созданию первого парсера на Python.

Scrapy – это мощный и гибкий фреймворк для веб-скрейпинга на Python. Он позволяет быстро и эффективно извлекать данные с веб-сайтов. В этой статье мы рассмотрим базовый пример использования Scrapy, чтобы вы могли начать создавать свои собственные парсеры.

Знакомство со Scrapy и подготовка к работе

Что такое Scrapy и его преимущества?

Scrapy – это фреймворк, предназначенный для автоматизированного сбора данных из интернета (веб-скрейпинга). Он предоставляет структурированный способ организации процесса парсинга, обработки и сохранения данных. Основные преимущества Scrapy:

  • Скорость и эффективность: Scrapy использует асинхронную архитектуру, что позволяет ему обрабатывать множество запросов параллельно.

  • Гибкость: Фреймворк легко настраивается и расширяется для работы с разными типами веб-сайтов.

  • Встроенные инструменты: Scrapy включает в себя инструменты для обработки данных, такие как селекторы (XPath и CSS), а также механизмы для предотвращения блокировок.

Установка Scrapy и создание первого проекта

Для начала работы с Scrapy необходимо установить его. Откройте командную строку или терминал и выполните следующую команду:

pip install scrapy

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

scrapy startproject my_first_scraper

Эта команда создаст директорию my_first_scraper с необходимой структурой для вашего проекта.

Разработка вашего первого Scrapy Spider

Структура Scrapy Spider и базовые компоненты

Spider – это класс, который определяет, как Scrapy будет парсить веб-сайт. Он содержит логику извлечения данных и переходы по страницам. Внутри проекта my_first_scraper перейдите в директорию spiders и создайте файл, например, quotes_spider.py. Добавьте следующий код:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    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(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

Разберем основные компоненты:

  • name: Уникальное имя паука.

  • start_urls: Список URL-адресов, с которых начинается парсинг.

  • parse: Метод, который вызывается для обработки каждого ответа от сервера. Он извлекает данные и возвращает их в виде словаря (dict).

Использование селекторов: XPath и CSS для извлечения данных

Scrapy поддерживает два типа селекторов для извлечения данных: XPath и CSS. В примере выше используются CSS селекторы для выбора элементов на странице. Например, response.css('div.quote') выбирает все элементы div с классом quote. quote.css('span.text::text').get() извлекает текст из элемента span с классом text внутри выбранного div.quote. XPath селекторы позволяют более гибко выбирать элементы, но часто бывают сложнее в написании.

Реклама

Пример XPath:

response.xpath('//div[@class="quote"]/span[@class="text"]/text()').get()

Запуск парсера и сохранение результатов

Как запустить Scrapy Spider и отладка с Scrapy Shell

Чтобы запустить паука, выполните следующую команду в корневой директории проекта:

scrapy crawl quotes

Scrapy Shell – это интерактивный инструмент, который позволяет тестировать селекторы и отлаживать паука. Чтобы запустить Scrapy Shell, выполните:

scrapy shell 'http://quotes.toscrape.com/page/1/'

В Scrapy Shell вы можете использовать response.css() и response.xpath() для проверки селекторов.

Экспорт данных и основы Scrapy Items/Pipelines

Scrapy позволяет экспортировать данные в различные форматы, такие как JSON, CSV и XML. Чтобы сохранить данные в JSON файл, добавьте -o output.json к команде запуска:

scrapy crawl quotes -o output.json

Scrapy Items – это контейнеры для данных, которые вы хотите извлечь. Они позволяют структурировать данные и упростить их обработку. Scrapy Pipelines – это компоненты, которые обрабатывают извлеченные данные. Они могут использоваться для очистки данных, проверки дубликатов, сохранения данных в базу данных и т.д.

Полный пример кода: Парсинг простой веб-страницы

Пошаговое написание кода простого парсера

Предположим, мы хотим спарсить список книг с сайта books.toscrape.com. Создадим новый паук books_spider.py:

import scrapy


class BooksSpider(scrapy.Spider):
    name = "books"
    start_urls = ['http://books.toscrape.com/']

    def parse(self, response):
        for book in response.css('article.product_pod'):
            yield {
                'title': book.css('h3 a::attr(title)').get(),
                'price': book.css('p.price_color::text').get(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

Этот код извлекает название и цену каждой книги на сайте и переходит на следующую страницу, если она есть.

Распространенные проблемы и советы для начинающих

  • Блокировка: Веб-сайты могут блокировать запросы от парсеров. Используйте User-Agent, задержки между запросами и прокси-серверы, чтобы избежать блокировки.

  • Динамический контент: Если сайт использует JavaScript для загрузки контента, Scrapy может не увидеть его. Используйте Scrapy с Selenium или Splash для обработки динамического контента.

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

Заключение

В этой статье мы рассмотрели базовый пример использования Scrapy для веб-скрейпинга. Scrapy – это мощный инструмент, который может значительно упростить процесс сбора данных из интернета. Начните с простых примеров, экспериментируйте и постепенно переходите к более сложным задачам. Scrapy имеет большое комьюнити и огромное количество документации, что поможет вам в процессе обучения и разработки.


Добавить комментарий