Crawlee для Python: Практическое руководство по рабочим процессам веб-скрапинга
TL;DR
Crawlee для Python — это фреймворк для рабочих процессов веб-сканирования. Он управляет запросами, очередями, обработчиками и наборами данных вокруг вашего кода извлечения; это больше, чем просто парсер или драйвер браузера.
Начните с HTTP-сканера для статических или серверно-рендеренных страниц. Выберите BeautifulSoupCrawler или ParselCrawler; переходите к PlaywrightCrawler только тогда, когда контент действительно требует рендеринга в браузере.
Текущая официальная документация по Python — версия 1.11 и требует Python 3.10 или новее. Закрепите версию, которую вы проверяете, особенно при обновлении поведения хранилища или HTTP-клиента.
Используйте предел страниц и разрешенный домен при первом запуске. Crawlee удаляет дублированные URL из очереди, но вам все равно нужно определить область, извлекать только авторизованные данные и измерять полноту.
Что такое Crawlee для Python?
Crawlee для Python — это фреймовка с открытым исходным кодом для создания веб-сканеров и рабочих процессов извлечения данных. Скрепер начинается с URL-адресов, отправляет каждый запрос через очередь, вызывает обработчик для каждой страницы и сохраняет извлеченные записи в набор данных. Это дает проекту структуру для оркестрации сканирования, которую простой вызов requests.get() не предоставляет. Если вы предпочитаете управляемый сервис для разрешенного сбора URL и сайтов, Nstdata Crawl — это другой вариант; он не заменяет пользовательские обработчики Crawlee или специфическую для приложения логику API.
Практическое отличие заключается в следующем:
Requests + Beautiful Soup: вы контролируете каждый запрос и парсите HTML. Хорошо подходит для небольшой, фиксированной задачи.
Crawlee: вы определяете, как обрабатывать каждый запрос, в то время как фреймворк управляет очередью сканирования, дублированными запросами, обработчиками и хранилищем.
Попробуйте Nstproxy Crawl - Начните Бесплатно Уже Сегодня
Playwright: вы автоматизируете браузер. Он может рендерить JavaScript, но сам по себе не предоставляет полного рабочего процесса сканирования.
Текущий краткий старт Crawlee для Python перечисляет три класса сканеров: BeautifulSoupCrawler, ParselCrawler и PlaywrightCrawler. HTTP-сканеры не рендерят JavaScript; сканер Playwright управляет безголовым браузером.
Crawlee для Python против Scrapy против Playwright
Инструмент
Основная роль
Очередь запросов и рабочий процесс сканирования
Рендеринг JavaScript
Хранение данных
Хорошее соответствие
Crawlee для Python
Фреймворк для сканирования на Python
Встроенная очередь запросов, обработчики, маршрутизация и хранилище
Да, через PlaywrightCrawler
Набор данных и хранилище ключ-значение
Команды Python, которым нужен управляемый цикл сканирования и выбор между HTTP и браузером
Scrapy
Полный фреймворк для сканирования на Python
Встроенный планировщик, загрузчик, промежуточное ПО и конвейеры
Не самостоятельно; добавьте интеграцию браузера, когда это необходимо
Конвейеры и ленты предметов
Более крупные, высоко настроенные проекты по сканированию с установленным стеком Scrapy
Playwright
Библиотека автоматизации браузера
Нет общепurpose очереди сканирования или набора данных самостоятельно
Да
Ваш код приложения
Тесты браузера и страницы, содержащие авторизованный контент, который необходимо рендерить или с которым нужно взаимодействовать
Requests + Beautiful Soup
HTTP-клиент плюс парсер HTML
Нет очереди сканирования самостоятельно
Нет
Ваш код приложения
Несколько известных URL или простой парсер API/страницы
Распространенная ошибка — сравнивать Crawlee и Playwright, как будто они решают один и тот же уровень. Crawlee может использовать Playwright в качестве своего движка браузера; Playwright сам по себе оставляет открытие URL, удаление дубликатов, лимиты работы, вывод и поведение перезапуска на ваше приложение. Смотрите документацию о пауках Scrapy и документацию Playwright для Python для границ этих инструментов.
Как работает Crawlee для Python
Типичное сканирование имеет четыре движущиеся части:
Скрепер: выбирает реализацию на основе HTTP или браузера и запускает задание.
Запрос / RequestQueue: представляет страницы для посещения и хранит список работ. Crawlee удаляет дублированные запросы, используя уникальный ключ, полученный из URL, по умолчанию.
Маршрутизатор и обработчик: решают, как обрабатывать запрос. Одного стандартного обработчика достаточно для первого скрепера; метки и маршрутизаторы помогают отделить страницы списков от страниц деталей позже.
Набор данных: хранит структурированные записи. Хранилище ключ-значение полезно для артефактов, таких как файлы, скриншоты или состояние.
HTTP-сканеры против браузерных сканеров
Используйте HTTP-сканер, когда сервер возвращает данные в HTML-ответе. Это избегает накладных расходов на запуск браузера и обычно проще в развертывании. Используйте PlaywrightCrawler, когда страница нуждается в рендеринге на стороне клиента, чтобы раскрыть контент, который вы имеете право собирать.
Перед тем как перейти к браузеру, проверьте первоначальный ответ страницы и убедитесь, что ее данные доступны в HTML или документированном API. Рендеринг в браузере добавляет нагрузку на ЦП и память, двоичные файлы браузера, более длительную загрузку страницы и больше точек отказа. Это не способ обойти контроль доступа или задачи CAPTCHA.
Очереди запросов, маршрутизация и наборы данных
Очередь полезна, когда страницы ссылаются на большее количество страниц или когда работа начинается с известного списка, но обнаруживает дополнительные задачи в процессе выполнения. Обработчик запроса может извлечь запись и добавить в очередь следующие допустимые ссылки. Очередь обрабатывает дедупликацию URL; ваш код все равно должен определить, какие страницы находятся в области действия, и что квалифицирует как действительную запись.
Для каталога электронной торговли обработчик списка может извлекать карточки продуктов и добавлять единственную ссылку на следующую страницу в очередь. Отдельный обработчик деталей может обрабатывать URL продуктов, если проект требует больше полей, чем предоставляет список. Держите схемы страниц со списками и деталями явными, чтобы пустая запись списка не была ошибочно принята за продукт.
Предварительные требования и установка
Crawlee для Python в настоящее время требует Python 3.10 или новее. Быстрая установка выглядит так:
Для краулера, поддерживаемого браузером, установите зависимости браузера Playwright, как документировано:
playwright install
Закрепите зависимость в файле блокировки для воспроизводимых развертываний. Текущие документы имеют версию 1.11; руководство по обновлению Crawlee 1.0 описывает изменения в хранилище и стандартном HTTP-клиенте, поэтому не предполагается, что более старая выборка кода ведет себя идентично после крупного обновления.
Шаг 1: Создайте свой первый скраппер Crawlee на Python
Этот пример использует Books to Scrape, демонстрационный каталог. Он читает карточки продуктов с страницы списка, следует только по ссылке "следующая страница", ограничивает краул до трех запросов и экспортирует стандартный набор данных в CSV. Запускайте примеры на сайте, предназначенном для тестирования, или на том, на который у вас есть разрешение на краулинг.
Настройка краулера и начальные URL
Сохраните следующее как books_catalog.py:
import asyncio
from crawlee.crawlers import BeautifulSoupCrawler, BeautifulSoupCrawlingContext
asyncdefmain()->None: crawler = BeautifulSoupCrawler(max_requests_per_crawl=3)@crawler.router.default_handlerasyncdefhandle_page(context: BeautifulSoupCrawlingContext)->None: soup = context.soup
for card in soup.select("article.product_pod"): title_link = card.select_one("h3 a") price = card.select_one(".price_color") availability = card.select_one(".availability")if title_link isNone:continueawait context.push_data({"source_url": context.request.url,"title": title_link.get("title")or title_link.get_text(strip=True),"product_url": title_link.get("href"),"price_text": price.get_text(strip=True)if price elseNone,"availability_text": availability.get_text(" ", strip=True)if availability
elseNone,})# Следуйте только по ссылке следующей страницы списка; оставайтесь на том же имени хоста.await context.enqueue_links(selector="li.next a")await crawler.run(["https://books.toscrape.com/"])await crawler.export_data(path="books.csv")if __name__ =="__main__": asyncio.run(main())
Затем запустите его:
python books_catalog.py
Лимит запросов намеренно делает пример небольшим. Для реального проекта установите бюджет на страницы или запросы, который соответствует объему данных, который вам разрешено собирать, и запишите, почему каждый запрос был принят.
Извлечение данных и сохранение результатов
Каждый вызов context.push_data() добавляет одну запись в стандартный набор данных. Шаг экспорта записывает этот набор данных в CSV файл. Представительная строка имеет следующую структуру:
{"source_url":"https://books.toscrape.com/","title":"A Light in the Attic","product_url":"catalogue/a-light-in-the-attic_1000/index.html","price_text":"£51.77","availability_text":"In stock"}
Точные текущие значения могут изменяться на живом сайте; фрагмент показывает поля, а не обещанный захваченный результат. Сохраняйте URL источника с каждой записью. Для эксплуатации нормализуйте относительные ссылки с urljoin(), храните отметку времени краулинга и проверяйте, что у каждого продукта есть поля, которые требуются вашей последующей задаче.
Шаг 2: Краулить несколько страниц с использованием очередей запросов
Пример уже использует неявную очередь запросов Crawlee: crawler.run() добавляет стартовый URL, а обработчик помещает следующую страницу в очередь. Когда у сайта много известных URL, используйте crawler.run(urls) или API очередей для инициализации задания. Официальное введение Crawlee объясняет, как работают очереди запросов и обнаружение ссылок.
Обнаружение и добавление ссылок в очередь
По умолчанию context.enqueue_links() остается на том же имени хоста; селектор уточняет, какие якоря рассматриваются. Для документационных сайтов обход может использовать селектор, такой как a.sidebar-link, и ограничение по страницам, затем применять шаблоны включения/исключения для разделов.
Нормализуйте URL перед их хранением. Также решите, будут ли запросы идентифицировать различные страницы: фильтры и параметры отслеживания могут создавать много URL, которые показывают одно и то же содержимое. Дедупликация в очереди помогает с точными вариантами URL, но не может понять, что два семантически разных URL содержат одну и ту же статью.
Используйте маршрутизаторы для различных типов страниц
Когда страницы списка и детали требуют разных селекторов, присваивайте метки, когда вы добавляете URL в очередь, и регистрируйте отдельные обработчики маршрутов. Это делает логику извлечения более читаемой:
Обработчик списка: собирайте карточки, затем добавляйте ссылки на детали в очередь.
Обработчик деталей: извлекайте поля, которые существуют только на странице продукта.
Обработчик ошибок: записывайте неудавшийся URL, статус и краткую категорию ошибки.
Не помещайте все типы страниц в один гигантский условный оператор, когда краулер разрастается. Отдельные обработчики облегчают тестирование фикстуры страницы с правильной схемой.
Переключайтесь на PlaywrightCrawler, когда разрешенное содержимое страницы отсутствует в HTTP-ответе и появляется только после рендеринга на стороне клиента. Официальный краткий старт показывает тот же базовый интерфейс обработчика с контекстом Playwright:
Это иллюстрирует API браузерного краулера; он не гарантирует, что динамическая цель доступна. Если ваше собственное приложение рендерится после появления известного селектора, дождитесь этого селектора в конкретном обработчике сайта и установите тайм-аут. Избегайте фиксированного продолжительного сна, когда доступно явное условие готовности. Не используйте автоматизацию браузера, чтобы обойти препятствие или ограничения доступа.
Шаг 4: Очистка и проверка извлеченных данных
Краулер может завершить работу успешно, создавая неполные записи. Добавьте проверки, которые завершат задание или перенаправят записи в набор данных на проверку, когда требуемые поля отсутствуют:
Требуйте стабильный идентификатор или исходный URL.
Отклоняйте запись продукта без названия; оставляйте цену необязательной, если страница не предоставляет ее.
Нормализуйте пробелы, валюту и относительные URL на отдельном этапе трансформации.
Дедупликуйте по бизнес-ключу, такому как канонический URL продукта, а не только по названию.
Сохраняйте необработанные или репрезентативные HTML-фикстуры для тестов регрессии парсера.
Отслеживайте обнаруженные URL, обработанные URL, действительные записи и неудачные запросы отдельно.
Руководство по хранению Crawlee документирует наборы данных и хранение ключ-значение. Держите большие артефакты вне реляционной строки; храните вместо этого ссылку или ключ объекта.
Шаг 5: Оценка пропускной способности и надежности
Не оценивайте производственную пропускную способность по прогонам трехстраничного учебника. Оцените ту же авторизованную группу URL на той же машине и запишите:
Измерение
Почему это важно
Действительные записи / запрошенные страницы
Разделяет качество извлечения от успеха HTTP
Медиана и p95 задержки страницы
Улавливает медленные страницы, не скрывая хвост
Запросы в минуту
Измеряет пропускную способность при выбранной конкуренции
ЦП и пиковая память
Браузерные краулеры могут иметь другой профиль ресурсов
Количество повторных попыток и сбоев
Выявляет хрупкие цели или проблемы конфигурации
Выходные байты и рост хранения
Важно для долгосрочных или насыщенных артефактами заданий
Запустите небольшой пилотный проект, вручную проверьте образцы, затем постепенно увеличивайте объем. Установите максимальное количество запросов, конкуренцию по домену и тайм-аут задания, прежде чем переходить к запланированному выполнению.
Шаг 6: Развертывание задания Crawlee на Python
Для небольшого запланированного HTTP-поиска упакуйте среду Python и результаты хранения, затем запустите скрипт из контейнера или планировщика заданий. Запуск с браузером также требует совместимых бинарных файлов браузера и системных зависимостей; включите их в изображение и протестируйте точное изображение базового развертывания.
Планируйте перезапуски процесса и идемпотентность. Присвойте каждому запуску идентификатор, сохраняйте исходные URL и временные метки, а также сделайте записи в downstream безопасными для повторного выполнения. Если поиск должен возобновиться из сохраненной очереди после сбоя, протестируйте это поведение с конфигурацией хранения, которую вы намерены развернуть, а не предполагая, что локальный запуск подтверждает облачную устойчивость.
Когда использовать Crawlee для Python против управляемого API для поиска
Crawlee является хорошим выбором, когда вам нужна кастомная логика извлечения, вы хотите контролировать расписание и хранение, и можете управлять поисковиком самостоятельно. Управляемый API для поиска может уменьшить нагрузку на инфраструктуру браузера и возвращать нормализованный контент страниц, но вы все равно контролируете политику поиска, валидацию данных и обработку downstream.
Nstdata Crawl описывает поиск по URL или уровню сайта с настраиваемыми лимитами страниц и выходами, такими как Markdown и HTML. Это полезно, когда приложению нужен контент страниц, а не кодовая база пользовательского поисковика. Это не подходящий инструмент для каждой задачи: используйте Crawlee, когда требуется кастомный контроль или саморазмещение; используйте управляемую услугу, когда более ценным является уменьшение операций с браузером и инфраструктурой поиска. Связанные руководства Nstdata охватывают JavaScript-рендеренные страницы в Python, безголовое извлечение данных для динамических веб-сайтов и автоматизированный сбор данных.
Заключение
Crawlee для Python предоставляет проекту на Python повторно используемый цикл поиска: запросы попадают в очередь, обработчики извлекают записи, а набор данных хранит результаты. Начните с HTTP-поисковика, сделайте явным допустимый диапазон URL и добавляйте Playwright только при необходимости рендеринга. Лимит страниц и проверки качества данных более полезны, чем большой поиск, который тихо сохраняет неполные строки.
Испытайте Nstdata — начните бесплатную пробную версию сегодня
Если вы предпочитаете управляемую услугу для разрешенных URL и сбора сайтов, ознакомьтесь с документированными входами и выходами Nstdata Crawl перед созданием рабочей версии.
Crawlee является открытым исходным кодом, и его документация описывает его как бесплатный. Вы все равно оплачиваете вычислительные ресурсы,.runtime браузера, хранение и инфраструктуру, которую вы используете.
В: Может ли Crawlee рендерить JavaScript?
Да. Crawlee для Python включает PlaywrightCrawler для страниц с поддержкой браузера. BeautifulSoupCrawler и ParselCrawler используют HTTP-ответы и не рендерят JavaScript.
В: Лучше ли Crawlee, чем Scrapy?
Это зависит от проекта. Crawlee предлагает интегрированную очередь, обработчики и рабочий процесс хранения с выбором поисковика HTTP-to-Playwright; Scrapy является зрелой платформой со своим собственным планировщиком, промежуточным ПО и конвейерами. Сравните интеграции, которые уже используются вашей командой.
В: Избегает ли Crawlee автоматически дублирования URL?
Его очередь запросов исключает дубликаты запросов с использованием уникального ключа, производимого из URL, по умолчанию. Вам все равно следует канонизировать URL и исключать дублирование записей по бизнес-идентификатору, необходимому вашему приложению.
В: Как мне экспортировать данные Crawlee?
Шаблон быстрого старта сохраняет записи в наборе данных под локальным хранилищем. API поисковика также предоставляет метод экспорта, такой как crawler.export_data(path="books.csv"), для форматов, поддерживаемых установленной версией.
Ivy Lin
Oct. 19th 2026
Сканируйте целые сайты одним API-запросом
Успешность 99,8% с рендерингом JavaScript
Получайте чистые данные для LLM в разных форматах
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.