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 имеет большое комьюнити и огромное количество документации, что поможет вам в процессе обучения и разработки.