Парсинг с помощью Crawlee
Парсинг — это когда извлекают данные данные с сайтов и сохраняют в удобные таблицы. Информацию собирают разную:
- Цены;
- Отзывы;
- Оценки;
- Наименования товаров.
Это может быть любая информация. Суть в механизме: на сайте множество данных, а ты достаешь из этого массива нужные.
Так вот, Crawlee — библиотека, которая помогает собрать данные быстро. В статье покажем шаблон, по которому пишут парсеры для сбора информации с сайтов. Но сперва проясним разницу между парсерами и краулерами. Без этого не понять суть Crawlee.
Разница между краулерами и парсерами
В теме сбора данных термины "краулер" и "парсер" используют как синонимы. Однако это ошибка.
Краулер (от англ. crawl — ползать)
Краулер — программа, которая "обходит" сайты. Чтобы собрать данные, она переходит по ссылкам внутри страниц.
Задача краулера — найти страницы, с которых собирать данные. Краулер двигается по сайтам как паук по паутине (отсюда название web crawler), переходит от одной страницы к другой, исходя из логики, заданной разработчиком.
Например: краулер начинает путь с главной страницы сайта, переходит по ссылкам на подстраницы, загружает HTML-код.
Краулинг — то, что делают поисковики при индексации страниц.
Парсер (от англ. parse — разбирать)
Парсер — программа, которая берет данные краулера (список страниц сайта) и структурирует их. Задача парсера — извлечь нужную информацию из HTML-кода. Он работает только с тем, что собрал краулер.
Пример: из страницы интернет-магазина парсер выделяет названия товаров, цены и отзывы. Он берет только нужную инфу и только с тех страниц, что дал ему краулер.
Crawlee все-таки — “краулер” или “парсер”?
Фишка Crawlee в том, что он сочетает обе роли:
- Запускает краулеры для обхода сайтов.
- Использует встроенные парсеры или пользовательские скрипты, чтобы извлекать данные.
Пример:
- Краулер находит все страницы каталога товаров.
- Парсер извлекает название, цену и рейтинг с каждой страницы.
- Crawlee сохраняет данные в базе.
Что такое Crawlee и почему стоит парсить с ним
Crawlee — JavaScript-библиотека для создания парсеров. Ее фишки:
- Управление очередями задач;
- Автоматическое сохранение данных;
- Возможность парсить сложные сайты. Crawlee незаменим, когда нужно собрать данные с динамических сайтов с контентом, который загружается через JavaScript. Как пример: извлекать отзывы с Amazon, игнорируя подгружаемые блоки рекламы.
Crawlee также полезен тем, кто собирает большие объемы данных. Посмотрим, как его установить и начать работать.
Как установить Crawlee
Чтобы установить Crawlee, делайте следующее.
- Установите Node.js. Скачать можно на официальном сайте.
- В терминале выполните команду:
npm install crawlee
- Создайте проект:
mkdir crawlee-project && cd crawlee-project
npm init -y
В результате у вас появится рабочая среда для парсинга.
Начало работы с Crawlee
Создайте в текстовом редакторе (хоть в том же “Блокноте”) файл index.js. В нем напишите базовый скрипт для парсинга. Типа такого:
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
requestHandler: async ({ request, $ }) => {
const title = $('title').text();
console.log(`Title of ${request.url}: ${title}`);
},
});
await crawler.run(['https://example.com']);
Этот код отправляет запрос на сайт и выводит заголовок страницы. Crawlee автоматически обрабатывает ответы и использует краулер Cheerio.
Cheerio извлекает данные с HTML-страниц, а Crawlee решает проблему с динамическими сайтами, обрабатывая их через встроенные браузеры. Для вас это значит, что с Crawlee соберете данные даже со сложных сайтов.
Обработка динамических сайтов
Для сайтов, использующих JavaScript, стандартных запросов недостаточно. Crawlee поддерживает Puppeteer и Playwright для работы с такими ресурсами.
Пример:
import { PlaywrightCrawler } from 'crawlee';
const crawler = new PlaywrightCrawler({
requestHandler: async ({ page }) => {
const data = await page.evaluate(() => document.querySelector('h1').innerText);
console.log(data);
},
});
await crawler.run(['https://example.com']);
Этот скрипт использует браузер Playwright, чтобы загрузить сайт, дождаться выполнения скриптов и извлечь данные.
Обработка капчи и блокировок
Crawlee поддерживает работу с прокси. Арендуйте и добавьте пул прокси в ваш код:
const crawler = new CheerioCrawler({
proxyConfiguration: { proxyUrls: ['http://proxy1', 'http://proxy2'] },
requestHandler: async ({ request, $ }) => {
console.log(`Processing ${request.url}`);
},
});
Чтобы использовать свои прокси в коде, нужно заменить ['http://proxy1', 'http://proxy2'] на список URL-адресов прокси, составленных из предоставленных при аренде данных: IP, порт, логин и пароль.
То есть каждый прокси в вашем пуле должен быть записан в формате:
http://логин:пароль@IP:порт
Например, если:
- IP: 192.168.0.1
- Порт: 8080
- Логин: user123
- Пароль: pass123
Тогда строка будет:
http://user123:pass123@192.168.0.1:8080
Если у вас несколько прокси, запишите их в массиве. Пример:
const proxies = [
'http://user1:pass1@192.168.0.1:8080',
'http://user2:pass2@192.168.0.2:8080',
'http://user3:pass3@192.168.0.3:8080',
];
Теперь подставьте массив proxies в параметр proxyUrls:
const crawler = new CheerioCrawler({
proxyConfiguration: { proxyUrls: proxies },
requestHandler: async ({ request, $ }) => {
console.log(`Processing ${request.url}`);
},
});
Вот что будет в результате
- Crawlee будет брать случайный прокси из массива proxyUrls для каждого запроса.
- Прокси автоматически добавятся к запросам, а логин и пароль передаются серверу для авторизации.
Сохранение данных
Собранные данные можно сохранить в файл или базу данных. Crawlee поддерживает встроенный Dataset. Пример:
import { Dataset } from 'crawlee';
await Dataset.pushData({ title: 'Example', url: 'https://example.com' });
С помощью этой функции можно собирать сотни тысяч записей без потерь.
Crawlee превращает сложный процесс парсинга в последовательность понятных шагов. Естественно, в статье мы не беремся рассказать про то, как написать работающий парсер, но мы рассказали последовательность и возможности использования Crawlee.