Платформа 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()
; - либо обернуть код в функцию
Actor.main()
.
- Добавление
Actor.init()
иActor.exit()
в ваш код - единственное важное требование для запуска на платформе Apify в качестве актора.Actor.init()
необходим для инициализации актора (например, для установки правильной реализации хранилища), а безActor.exit()
процесс просто никогда не остановится. Actor.main()
является альтернативойActor.init()
иActor.exit()
, так как вызывает их обоих внутри себя.
Давайте посмотрим на пример CheerioCrawler
из Быстрого старта:
- Использование Actor.main()
- Использование Actor.init() и Actor.exit()
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/']);
});
import { Actor } from 'apify';
import { CheerioCrawler } from 'crawlee';
await Actor.init();
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/']);
await Actor.exit();
Обратите внимание, что вы также можете запустить своего актора (использующего Crawlee) локально с помощью Apify CLI. Запустить его можно следующей командой в папке проекта:
apify run
Развертывание актора на платформе Apify
Теперь (предполагая, что вы уже вошли в свой аккаунт Apify) вы можете легко развернуть свой код на платформе Apify, выполнив команду:
apify push
Ваш скрипт будет загружен и собран на платформе Apify для последующего запуска. Подробнее смотрите в документации Apify Actor.
Использование на платформе Apify
Вы также можете разрабатывать своего актора в онлайн-редакторе кода прямо на платформе (для этого нужен аккаунт Apify). Перейдите на страницу Акторы, нажмите Create new, затем перейдите на вкладку Source и начните писать код или вставьте один из примеров из раздела Примеры.
Хранилища
Здесь есть несколько важных моментов.
Вспомогательные функции для хранилищ по умолчанию
Для упрощения доступа к хранилищам по умолчанию вместо использования вспомогательных функций соответствующих классов хранилищ можно использовать:
Actor.setValue()
,Actor.getValue()
,Actor.getInput()
дляKey-Value Store
Actor.pushData()
дляDataset
Использование облачного хранилища в локальном акторе
Если вы планируете использовать облачное хранилище при разработке и запуске актора локально, следует использовать 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
- Просмотр хранилищ в консоли Apify
- Справочник API Key-value stores
- Справочник API Datasets
- Справочник API Request queues
Переменные окружения
Ниже приведены дополнительные переменные окружения, специфичные для платформы 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.
Полезные ссылки