Перейти к основному содержимому

Блокировка запросов

Объявление о выпуске

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