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

Платформа Apify

Apify - это платформа, созданная для масштабного и высокопроизводительного веб-скрапинга и автоматизации. Она предоставляет удобный доступ к вычислительным ресурсам (Акторам), удобным хранилищам для запросов и результатов, прокси, планировщику, вебхукам и многому другому, доступному через веб-интерфейс или API.

Хотя мы считаем платформу Apify отличным решением, и определенно стоит зарегистрировать бесплатный аккаунт, Crawlee всегда останется открытым исходным кодом, который можно запускать локально или в любой облачной инфраструктуре.

примечание

Мы не тестируем Crawlee в других облачных средах, таких как Lambda, или на специфических архитектурах, например Raspberry PI. Мы стараемся обеспечить работоспособность, но гарантий нет.

Вход в платформу Apify из Crawlee

Для доступа к вашему аккаунту Apify из Crawlee необходимо предоставить учетные данные - ваш API токен. Это можно сделать либо с помощью Apify CLI, либо через переменные окружения.

После предоставления учетных данных вашему скраперу, вы сможете использовать все функции платформы Apify, такие как вызов акторов, сохранение в облачные хранилища, использование прокси Apify, настройка вебхуков и так далее.

Вход через CLI

Apify CLI позволяет войти в ваш аккаунт Apify на компьютере. Если затем запустить скрапер через CLI, ваши учетные данные будут добавлены автоматически.

npm install -g apify-cli
apify login -t YOUR_API_TOKEN

Вход через переменные окружения

Также вы всегда можете предоставить учетные данные вашему скраперу, установив переменную окружения APIFY_TOKEN со значением вашего API токена.

Существует также переменная окружения APIFY_PROXY_PASSWORD. Актор автоматически получает её из вашего токена, но она может быть полезна, когда вам нужен доступ к прокси с другого аккаунта.

Вход через конфигурацию

Еще один вариант - использовать экземпляр Configuration и установить ваш API токен там.

import { Actor } from 'apify';

const sdk = new Actor({ token: 'your_api_token' });

Что такое актор

При развертывании скрипта на платформе Apify он становится актором. Актор - это бессерверный микросервис, который принимает входные данные и производит выходные. Он может работать от нескольких секунд до нескольких часов или даже бесконечно. Актор может выполнять что угодно: от простых действий, таких как заполнение веб-формы или отправка email, до сложных операций, таких как сканирование целого сайта и удаление дубликатов из большого набора данных.

Акторы можно публиковать в Магазине Apify, чтобы другие пользователи могли их использовать. Не беспокойтесь - если вы опубликуете своего актора в магазине и кто-то его использует, он будет работать под их аккаунтом, а не вашим.

Полезные ссылки

Локальный запуск актора

Сначала создадим шаблон нового актора. Можно использовать Apify CLI и выполнить команду:

apify create my-hello-world

CLI предложит выбрать шаблон проекта - выберем "Hello world". Инструмент создаст директорию my-hello-world с файлами проекта Node.js. Запустить актор можно следующим образом:

cd my-hello-world
apify run

Запуск кода Crawlee в качестве актора

Для запуска кода Crawlee как актора на платформе Apify вам нужно:

ПРИМЕЧАНИЕ
  • Добавление Actor.init() и Actor.exit() в ваш код - единственное важное требование для запуска на платформе Apify в качестве актора. Actor.init() необходим для инициализации актора (например, для установки правильной реализации хранилища), а без Actor.exit() процесс просто никогда не остановится.
  • Actor.main() является альтернативой Actor.init() и Actor.exit(), так как вызывает их обоих внутри себя.

Давайте посмотрим на пример CheerioCrawler из Быстрого старта:

import { Actor } from 'apify';
import { CheerioCrawler } from 'crawlee';

await Actor.main(async () => {
const crawler = new CheerioCrawler({
async requestHandler({ request, $, enqueueLinks }) {
const { url } = request;

// Извлекаем заголовок HTML-страницы
const title = $('title').text();
console.log(`Title of ${url}: ${title}`);

// Добавляем URL-адреса, соответствующие заданному шаблону
await enqueueLinks({
globs: ['https://www.iana.org/*'],
});

// Сохраняем полученные данные в датасет
await Actor.pushData({ url, title });
},
});

// Добавляем начальный запрос и запускаем краулер
await crawler.run(['https://www.iana.org/']);
});

Обратите внимание, что вы также можете запустить своего актора (использующего Crawlee) локально с помощью Apify CLI. Запустить его можно следующей командой в папке проекта:

apify run

Развертывание актора на платформе Apify

Теперь (предполагая, что вы уже вошли в свой аккаунт Apify) вы можете легко развернуть свой код на платформе Apify, выполнив команду:

apify push

Ваш скрипт будет загружен и собран на платформе Apify для последующего запуска. Подробнее смотрите в документации Apify Actor.

Использование на платформе Apify

Вы также можете разрабатывать своего актора в онлайн-редакторе кода прямо на платформе (для этого нужен аккаунт Apify). Перейдите на страницу Акторы, нажмите Create new, затем перейдите на вкладку Source и начните писать код или вставьте один из примеров из раздела Примеры.

Хранилища

Здесь есть несколько важных моментов.

Вспомогательные функции для хранилищ по умолчанию

Для упрощения доступа к хранилищам по умолчанию вместо использования вспомогательных функций соответствующих классов хранилищ можно использовать:

Использование облачного хранилища в локальном акторе

Если вы планируете использовать облачное хранилище при разработке и запуске актора локально, следует использовать Actor.openKeyValueStore(), Actor.openDataset() и Actor.openRequestQueue() для открытия соответствующих хранилищ.

Каждый из этих методов позволяет передать OpenStorageOptions в качестве второго аргумента, который имеет только одно необязательное свойство: forceCloud. Если установлено значение true - будет использоваться облачное хранилище вместо локальной папки.

примечание

Если вы не планируете принудительно использовать облачные хранилища при локальном запуске актора, нет необходимости использовать класс Actor. Варианты Crawlee KeyValueStore.open(), Dataset.open() и RequestQueue.open() будут работать так же.

Получение публичного URL элемента в облачном хранилище

Если вам нужно поделиться ссылкой на файл, хранящийся в Key-Value Store на платформе Apify, вы можете использовать метод getPublicUrl(). Он принимает только один параметр: key - ключ элемента, которым вы хотите поделиться.

import { KeyValueStore } from 'apify';

const store = await KeyValueStore.open();
await store.setValue('your-file', { foo: 'bar' });
const url = store.getPublicUrl('your-file');
// https://api.apify.com/v2/key-value-stores/<your-store-id>/records/your-file

Экспорт данных из датасета

Когда Dataset хранится на платформе Apify, вы можете экспортировать его данные в следующие форматы: HTML, JSON, CSV, Excel, XML и RSS. Датасеты отображаются на странице деталей запуска актора и в разделе Storage в консоли Apify. Фактический экспорт данных осуществляется с помощью API-эндпоинта Get dataset items. Таким образом вы можете легко делиться результатами сканирования.

Полезные ссылки

Переменные окружения

Ниже приведены дополнительные переменные окружения, специфичные для платформы Apify. Больше переменных окружения, связанных с Crawlee, можно найти в руководстве Переменные окружения.

примечание

Важно отметить, что переменные окружения CRAWLEE_ не нужно заменять на эквивалентные APIFY_. Аналогично, Crawlee понимает переменные окружения APIFY_ после вызова Actor.init() или при использовании Actor.main().

APIFY_TOKEN

API токен для вашего аккаунта Apify. Он используется для доступа к API Apify, например, для доступа к облачному хранилищу или запуска актора на платформе Apify. Вы можете найти свой API токен на странице Настройки аккаунта / Интеграции.

Комбинации APIFY_TOKEN и CRAWLEE_STORAGE_DIR

Описание переменной окружения CRAWLEE_STORAGE_DIR можно найти в руководстве Переменные окружения.

Комбинируя переменные окружения различными способами, вы можете значительно влиять на поведение актора.

Переменные окруженияAPIХранилища
нет ИЛИ CRAWLEE_STORAGE_DIRнетлокальные
APIFY_TOKENдаApify платформа
APIFY_TOKEN И CRAWLEE_STORAGE_DIRдалокальные + платформа

При использовании обеих переменных APIFY_TOKEN и CRAWLEE_STORAGE_DIR вы можете использовать все функции платформы Apify, а ваши данные по умолчанию будут храниться локально. Если вы хотите получить доступ к облачным хранилищам, вы можете использовать опцию { forceCloud: true } в соответствующих функциях.

import { Actor } from 'apify';
import { Dataset } from 'crawlee';

// или Dataset.open('my-local-data')
const localDataset = await Actor.openDataset('my-local-data');
// но здесь нам нужен класс `Actor`
const remoteDataset = await Actor.openDataset('my-dataset', { forceCloud: true });

APIFY_PROXY_PASSWORD

Необязательный пароль к Apify Proxy для ротации IP-адресов. Предполагая, что аккаунт Apify уже создан, вы можете найти пароль на странице Proxy в консоли Apify. Пароль автоматически определяется с помощью переменной окружения APIFY_TOKEN, поэтому в большинстве случаев его не нужно указывать. Его следует использовать, когда по какой-то причине вам нужен доступ к Apify Proxy, но не нужен доступ к API Apify, или когда вам нужен доступ к прокси с другого аккаунта.

Управление прокси

В дополнение к вашим собственным прокси-серверам и прокси-серверам, полученным от сторонних провайдеров и используемым вместе с Crawlee, вы также можете положиться на Apify Proxy для ваших задач по скрапингу.

Apify Proxy

Если у вас уже есть подписка на Apify Proxy, вы можете начать использовать его немедленно, написав всего несколько строк кода (для локального использования сначала нужно войти в систему вашего аккаунта Apify).

import { Actor } from 'apify';

const proxyConfiguration = await Actor.createProxyConfiguration();
const proxyUrl = await proxyConfiguration.newUrl();

Обратите внимание, что в отличие от использования собственных прокси в Crawlee, вам не следует использовать конструктор для создания экземпляра ProxyConfiguration. Для использования Apify Proxy вместо этого следует создать экземпляр с помощью функции Actor.createProxyConfiguration().

Конфигурация Apify Proxy

С Apify Proxy вы можете выбирать конкретные группы прокси для использования или страны для подключения. Это позволяет получить лучшую производительность прокси после некоторого начального исследования.

import { Actor } from 'apify';

const proxyConfiguration = await Actor.createProxyConfiguration({
groups: ['RESIDENTIAL'],
countryCode: 'US',
});
const proxyUrl = await proxyConfiguration.newUrl();

Теперь ваши краулеры будут использовать только резидентские прокси из США. Обратите внимание, что сначала вы должны получить доступ к группе прокси, прежде чем сможете её использовать. Вы можете проверить доступные вам группы прокси в панели управления прокси.

Apify Proxy vs. собственные прокси

Класс ProxyConfiguration охватывает как Apify Proxy, так и пользовательские прокси URL, чтобы вы могли легко переключаться между провайдерами прокси. Однако некоторые функции класса доступны только пользователям Apify Proxy, в основном потому, что Apify Proxy - это то, что можно назвать супер-прокси. Это не отдельный прокси-сервер, а API-эндпоинт, который позволяет подключаться через миллионы различных IP-адресов. Таким образом, у класса по сути есть два режима: Apify Proxy или собственный (сторонний) прокси.

Разница проста:

  • Если вы используете собственные прокси - вы должны создать экземпляр с помощью функции конструктора ProxyConfiguration на основе предоставленных ProxyConfigurationOptions.
  • Если вы планируете использовать Apify Proxy - вы должны создать экземпляр с помощью функции Actor.createProxyConfiguration(). ProxyConfigurationOptions.proxyUrls и ProxyConfigurationOptions.newUrlFunction позволяют использовать ваши пользовательские прокси URL, в то время как все остальные опции предназначены для настройки Apify Proxy.

Полезные ссылки