Открыть сервис

CrawlSpider

CrawlSpider — это класс фреймворка Scrapy для языка Python, предназначенный для создания веб-скрейперов (пауков), которые автоматически обходят веб-сайты, следуя по ссылкам, обнаруженным на страницах. В отличие от базового класса Spider, который требует ручного определения логики перехода между страницами, CrawlSpider предоставляет встроенный механизм для рекурсивного обхода сайта на основе набора правил (rules).

История и контекст

Фреймворк Scrapy был создан в 2008 году сотрудниками британской компании «Mydeco» (позднее — «Scrapinghub») под руководством Пабло Хоффмана. Первая публичная версия (0.7) вышла в 2009 году. Класс CrawlSpider был добавлен в ранних версиях Scrapy как расширение базового функционала пауков для решения типовой задачи — обхода многостраничных сайтов (каталогов, блогов, форумов). Он стал одним из наиболее часто используемых классов в Scrapy благодаря своей эффективности и простоте настройки для задач сбора данных с сайтов, имеющих чёткую структуру внутренних ссылок.

Архитектура и принцип работы

CrawlSpider наследует все возможности базового класса Spider и добавляет к ним два ключевых компонента: правила обхода (rules) и парсер ссылок (LinkExtractor).

Правила (rules)

Атрибут rules представляет собой кортеж или список объектов класса Rule. Каждое правило определяет, как CrawlSpider должен обрабатывать ссылки, найденные на странице. Правило состоит из двух основных частей:

  1. LinkExtractorобъект, который извлекает ссылки из HTML-кода страницы в соответствии с заданными параметрами (например, URL-паттерны, домены, атрибуты тегов).
  2. Callback — функция-обработчик (метод класса паука), которая вызывается для каждой страницы, найденной по ссылке, соответствующей правилу. Если callback не указан, страница используется только для дальнейшего извлечения ссылок.
  3. Дополнительные параметры:
  • follow — булево значение, указывающее, следует ли продолжать обход со страниц, обработанных callback-функцией. По умолчанию True, если callback не задан.
  • cb_kwargsсловарь дополнительных аргументов, передаваемых в callback-функцию.
  • process_links — функция для предварительной обработки списка извлечённых ссылок (например, фильтрация).
  • process_request — функция для модификации объекта Request перед его отправкой.

LinkExtractor

LinkExtractor — это класс, который анализирует HTML-страницу и извлекает из неё все ссылки (<a href="...">). Он может быть настроен для фильтрации ссылок по различным критериям:

  • allowрегулярное выражение (или список выражений), которому должен соответствовать URL.
  • deny — регулярное выражение (или список выражений), которому URL не должен соответствовать.
  • allow_domains — список разрешённых доменов.
  • deny_domains — список запрещённых доменов.
  • restrict_xpaths — XPath-выражения, ограничивающие область поиска ссылок (например, только внутри определённого блока <div>).
  • restrict_cssCSS-селекторы для той же цели.
  • tags и attrs — параметры для поиска ссылок в других тегах (например, <area>, <frame>).

Пример использования

Типичный сценарий — сбор данных с интернет-магазина. Ниже приведён упрощённый пример паука, который обходит страницы категорий и товаров.

```python import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor

class MyShopSpider(CrawlSpider): name = 'myshop' allowed_domains = ['example-shop.ru'] start_urls = ['https://example-shop.ru/catalog']

Правила обхода

rules = (

Правило для страниц категорий:

Извлекать ссылки, соответствующие паттерну '/catalog/*',

не вызывать callback (страница нужна только для поиска новых ссылок),

продолжать обход (follow=True).

Rule(LinkExtractor(allow=r'/catalog/'), follow=True),

Правило для страниц товаров:

Извлекать ссылки, соответствующие паттерну '/item/\d+',

вызывать callback 'parse_item' для обработки страницы товара,

не продолжать обход со страницы товара (follow=False).

Rule(LinkExtractor(allow=r'/item/\d+'), callback='parse_item', follow=False), )

def parse_item(self, response):

Извлечение данных со страницы товара

yield { 'name': response.css('h1.product-title::text').get(), 'price': response.css('span.price::text').get(), 'url': response.url, } ```

Преимущества и недостатки

Преимущества

  1. Автоматизация обхода: CrawlSpider самостоятельно находит и обрабатывает ссылки, что значительно сокращает объём кода по сравнению с ручной реализацией.
  2. Гибкость настройки: Правила позволяют точно определить, какие ссылки обрабатывать, а какие игнорировать, что важно для больших и сложных сайтов.
  3. Устойчивость к изменениям структуры: При изменении URL-паттернов достаточно скорректировать регулярные выражения в правилах, не переписывая всю логику.
  4. Встроенная поддержка пагинации: Легко настраивается обход страниц с номерами (/page/2/, ?page=2).

Недостатки

  1. Риск «зацикливания»: При неправильной настройке правил паук может бесконечно обходить одни и те же страницы (например, если ссылка ведёт на саму себя). Требуется тщательная настройка LinkExtractor и использование фильтров дубликатов.
  2. Сложность отладки: Из-за автоматического характера обхода бывает трудно понять, почему паук пропустил определённую страницу или, наоборот, обработал лишнюю.
  3. Неэффективность на сайтах с динамической загрузкой: CrawlSpider работает с HTML-кодом, полученным от сервера. Если контент и ссылки подгружаются через JavaScript, LinkExtractor может не найти нужные ссылки. В таких случаях требуется использование middleware для рендеринга JavaScript (например, Splash или Selenium).
  4. Ограниченная применимость: Для сайтов с нестандартной структурой навигации (например, одностраничные приложения, сайты с большим количеством форм) CrawlSpider может быть неэффективен, и проще использовать базовый Spider с ручным управлением запросами.

Применение

CrawlSpider широко используется для:

  • Сбора данных с каталогов и интернет-магазинов: обход страниц товаров, категорий, брендов.
  • Мониторинга новостных сайтов: сбор заголовков, текстов статей, дат публикаций.
  • Архивирования веб-сайтов: создание локальных копий сайтов.
  • Анализа структуры сайтов: построение карты сайта, выявление битых ссылок.
  • Сбора данных для поисковых систем: индексация контента.

Критика и ограничения

Основная критика CrawlSpider связана с тем, что он поощряет «слепое» следование ссылкам, что может привести к нарушению условий использования сайта (например, при многократном обращении к страницам в короткий промежуток времени) или к сбору конфиденциальных данных. Для соблюдения этических норм и законодательства (в частности, Федерального закона «Об информации, информационных технологиях и о защите информации») разработчикам рекомендуется:

  • Уважать файл robots.txt.
  • Устанавливать разумные задержки между запросами (настройка DOWNLOAD_DELAY).
  • Не обходить страницы, требующие авторизации, без явного разрешения.

Кроме того, CrawlSpider не предназначен для работы с API, которые обычно предоставляют структурированные данные в формате JSON или XML. Для таких задач лучше использовать базовый Spider с ручным формированием HTTP-запросов.

Интересные факты

  • Название «CrawlSpider» происходит от английского слова «crawl» (ползать), что отражает его основное поведение — медленное и методичное перемещение по сайту.
  • Внутренняя реализация CrawlSpider использует механизм «middleware» для обработки ответов и извлечения ссылок, что делает его легко расширяемым.
  • Несмотря на свою популярность, CrawlSpider не является единственным способом создания обходящих пауков в Scrapy. Существуют также классы XMLFeedSpider, CSVFeedSpider и SitemapSpider, каждый из которых оптимизирован для определённого типа источников данных.

Источники

  1. Документация Scrapy. Раздел «Spiders» (CrawlSpider).
  2. Официальный репозиторий Scrapy на GitHub.
  3. Книга «Web Scraping with Python» (Райан Митчелл, 2-е издание).
  4. Статья «Introduction to Scrapy CrawlSpider» на сайте Real Python.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →