Блокировка запросов
Начиная с мая 2024 (версия crawlee
3.10.0
), этот эксперимент включен по умолчанию! Если у вас возникнут проблемы, вы можете:
- установить
requestLocking
в значениеfalse
в объектеexperiments
в настройках краулера - обновить все импорты с
RequestQueue
наRequestQueueV1
- создать issue в нашем GitHub репозитории
Содержание ниже сохранено для документации. Если вам интересно узнать о изменениях, прочитайте статью о новой системе хранения очереди запросов в блоге Apify.
Это экспериментальная функция. Мы приветствуем тестировщиков, но имейте в виду, что использование в продакшене пока не рекомендуется.
API может измениться, и в будущем возможны критические изменения.
Если вы используете эту функцию, не стесняйтесь создавать issues в нашем GitHub репозитории.
Начиная с версии crawlee
3.5.5
, мы добавили новую опцию краулера, которая позволяет включить использование нового API блокировки запросов. С помощью этого API вы сможете передавать один RequestQueue
нескольким краулерам для распараллеливания процесса сканирования.
Очередь запросов с поддержкой блокировки в настоящее время экспортируется через класс RequestQueueV2
. После завершения эксперимента этот класс заменит текущий класс RequestQueue
Как включить эксперимент
В краулерах
Этот пример показывает, как включить эксперимент в CheerioCrawler
,
но это применимо к любому типу краулера.
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
experiments: {
requestLocking: true,
},
async requestHandler({ $, request }) {
const title = $('title').text();
console.log(`Заголовок "${request.url}": ${title}.`);
},
});
await crawler.run(['https://crawlee.dev']);
Вне краулеров (для настройки собственной очереди запросов с поддержкой блокировки)
Раньше вы импортировали RequestQueue
из crawlee
. Чтобы перейти на очередь с поддержкой блокировки, нужно импортировать RequestQueueV2
.
import { RequestQueueV2 } from 'crawlee';
const queue = await RequestQueueV2.open('my-locking-queue');
await queue.addRequests([
{ url: 'https://crawlee.dev' },
{ url: 'https://crawlee.dev/docs' },
{ url: 'https://crawlee.dev/api' },
]);
Использование новой очереди запросов в краулерах
Если вы создаете собственную очередь запросов с поддержкой блокировки, вам также нужно включить эксперимент в краулерах.
Если вы не включите эксперимент, возникнет ошибка времени выполнения, и краулер не запустится.
import { CheerioCrawler, RequestQueueV2 } from 'crawlee';
const queue = await RequestQueueV2.open('my-locking-queue');
const crawler = new CheerioCrawler({
experiments: {
requestLocking: true,
},
requestQueue: queue,
async requestHandler({ $, request }) {
const title = $('title').text();
console.log(`Заголовок "${request.url}": ${title}.`);
},
});
await crawler.run();
Другие изменения
Этот раздел полезен только если вы хотите разобраться в том, как всё работает изнутри.
Для реализации нового API блокировки запросов и поддержки как текущей, так и новой логики очереди запросов, мы создали общую отправную точку под названием RequestProvider
.
Этот класс по умолчанию реализует почти все функции, но ожидает, что разработчик реализует следующие методы:
fetchNextRequest
и ensureHeadIsNotEmpty
. Эти методы отвечают за загрузку и возврат запросов для обработки,
а также сообщают краулерам о наличии дополнительных запросов для обработки.
Вы можете использовать этот базовый класс для реализации собственных провайдеров запросов, если вам нужно получать запросы из другого источника.
Мы рекомендуем использовать TypeScript при реализации собственного провайдера запросов, так как он предоставляет подсказки для абстрактных методов и точные типы, которые нужно возвращать.