Если вы не собираете данные, как вы собираетесь оставаться конкурентоспособными?

Введение

Данные - это король. Нет никакого способа обойти это. 80% ценности, которую вы получаете от построения модели машинного обучения, может быть получено с помощью простого готового решения. Как с этой современной простотой выделить себя или свою компанию? Ответ - данные. Ваша лучшая модель настолько хороша, насколько хороши предоставленные вами данные. Вы можете добиться серьезных успехов, найдя уникальный источник данных или сумев собрать больше данных, чем ваши конкуренты.

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

  1. Настройте простую задачу сбора данных в облаке.
  2. Сделайте эту задачу по сбору данных надежно и бесплатно каждый день.

В этом руководстве будет использоваться JavaScript, который является родным языком, который используется в большей части документации Apify. В следующем посте я расскажу, как сделать что-то подобное в Python.

Apify

Apify - платформа, построенная на веб-автоматизации с упором на сбор данных. Они предоставляют простые способы надежного размещения и запуска скриптов в облаке. Они сочетают это с довольно простым хранилищем данных типа ключ-значение, так что вы можете легко получить доступ к тому, что вы очищаете. Существует также уровень бесплатного пользования, который, как я обнаружил, позволяет мне без проблем запускать 3–4 различных ежедневных парсера.

В интересах полной прозрачности я подписался на партнерскую программу Apify, и приведенные выше ссылки являются партнерскими ссылками. Если вам это покажется неприятным, просто зайдите на их нормальный сайт без ссылки. Однако у них действительно классный продукт. Я поймал себя на том, что говорю: Ух ты, их документация ужасна, но мне все равно, потому что эта штука такая хорошая. Так что я почувствовал, что должен написать о них.

Скребок цен на криптовалюту

Мы собираемся создать систему, которая будет очищать трехминутные интервалы цен на криптовалюту каждый день. У Binance есть отличный API, который не требует ключей и предоставляет простые конечные точки GET. Вы можете найти документацию здесь. Сам наш код парсинга будет тривиальным, потому что нам просто нужно сделать запрос на получение желаемой конечной точки. Чтобы получить данные о ценах на биткойны в долларах за последние 24 часа с интервалом 3 мес. (BTCUSDT) вы можете запустить следующую команду curl в своей консоли.

curl -X GET "https://api.binance.com/api/v1/klines?&symbol=BTCUSDT&interval=3m"

Это должно вернуть большой вложенный список. Каждая строка представляет собой трехминутный интервал этого обмена за последние 24 часа. Каждый столбец представляет собой отдельный бит информации о цене. Из документации:

[
  [
    1499040000000,      // Open time
    "0.01634790",       // Open
    "0.80000000",       // High
    "0.01575800",       // Low
    "0.01577100",       // Close
    "148976.11427815",  // Volume
    1499644799999,      // Close time
    "2434.19055334",    // Quote asset volume
    308,                // Number of trades
    "1756.87402397",    // Taker buy base asset volume
    "28.46694368",      // Taker buy quote asset volume
    "17928899.62484339" // Ignore.
  ]
]

Мне нравится делать то же самое в JavaScript, используя пакет узлов axios. Мы можем сделать это с помощью следующего кода.

var endpoint = "https://api.binance.com/api/v1/klines?&symbol=BTCUSDT&interval=3m";
axios.get(endpoint).then(async response => {console.log(response.data);});

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

Настроить Apify

Начните с создания учетной записи на Apify.

Это должно быть довольно просто. Оказавшись внутри, вы увидите такой экран:

Он показывает вам некоторую общую информацию о ваших актерах, как долго они работали, возникали ли у них какие-либо проблемы и т. Д. Перейдите на вкладку Actors и давайте соберем нашего первого актера для парсинга веб-страниц! На вкладке актеров щелкните Create New, чтобы создать нового актера.

На вкладке актеров щелкните Create New, чтобы создать нового актера.

Актер - это сценарий или набор сценариев, которые могут выполняться по расписанию внутри платформы Apify. На новой странице актера вы попадете в настройки актера. Здесь следует обратить внимание на две вещи. Первый - это имя актера. Как видите, я назвал свое crypto-scraper. Это то, что вы будете использовать для обозначения этого актера в остальной части платформы, поэтому желательно иметь удобочитаемое имя. Следующее, что мы не будем касаться, - это поле Timeout. Это определяет количество секунд, в течение которых актер может пробежать, прежде чем Apify убьет его. Для простых скребков идеально подходит 300 секунд. Для некоторых более длительных работ вы можете изменить это.

После того, как вы настроите эти два поля, перейдите на вкладку Source на вашем актере.

На вкладке Исходный код мы помещаем код нашего актера. Вы заметите, что он уже содержит пример кода. Код примера захватывает example.com и использует Cheerio для анализа некоторой информации с этой страницы. Этот код, возможно, сложнее того, что мы делаем.

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

В этом руководстве мы будем использовать параметр Один файл JavaScript. Это самый простой вариант, в котором будет использоваться контейнер Node.js в Alpine Linux, описанный в поле Базовое изображение. Вы можете изменить базовое изображение, если хотите что-то другое, но я считаю, что это значение по умолчанию в большинстве случаев работает нормально.

На этом этапе мы готовы добавить код.

Код

Код ниже состоит из трех основных частей.

  1. Он инициализирует материал Apify.
  2. Он отправляет запрос на получение в конечную точку Binance.
  3. Он добавляет очищенные данные в набор данных Apify.

Давайте рассмотрим это подробнее.

  • Строки 4–31 - эта функция превращает строку в списке, возвращаемом конечной точкой Binance, в словарь, в котором назван каждый элемент строки.
  • Строки 33–37 - эта функция приостанавливает выполнение программы на определенное количество миллисекунд. Полезно добавлять задержки при парсинге или использовании бесплатного API.
  • Строка 39 - это начало основного выполнения Apify. Это устанавливает асинхронный процесс, в котором мы будем выполнять наш код.
  • Строка 42 - Здесь мы читаем входные данные нашего парсера. В этом примере это будет словарь, содержащий список имен обмена в форме: {exchanges: ["exchange1", "exchange2", "etc"]}
  • Строка 45 - Инициализирует набор данных Apify. Мы поговорим о наборах данных немного позже, но в основном это просто хранилище ключей и значений.
  • Строки 48–59 - Выполните каждый обмен во входных данных, которые мы передали, сделайте запрос GET на Binance, используя библиотеку axios, и сохраните результаты в инициализированном наборе данных Apify.

Возьмите этот код и скопируйте его в поле Исходный код. Затем нажмите «Сохранить и очистить сборку».

Это займет минуту, пока Apify создаст контейнер для запуска скрипта. По мере создания заполните раздел тела ввода списком бирж Binance, которые вы хотите отслеживать. У меня есть:

{ "exchanges":  ["BNBUSDT", "BTCUSDT"]}

Вы можете добавить любые биржи, которые захотите, но эти два сообщат вам обменный курс между токеном Binance и долларами и биткойнами и долларами.

Когда ваш контейнер завершит сборку, нажмите кнопку запуска, и парсер запустится! Он распечатает обмены на консоли, к которой вы всегда можете получить доступ, щелкнув вкладку Последний запуск.

Чтобы проверить результаты, нажмите на хранилище.

Затем щелкните наборы данных.

Вы попадете на экран, где сможете просмотреть все скопированные вами наборы данных. Для меня их несколько. Для вас вы должны видеть только набор данных binance-kline. Нажмите на ID набора данных в таблице, чтобы открыть представление набора данных.

На панели набора данных вы можете загружать или просматривать только что очищенные данные.

Предварительный просмотр данных покажет последние 100 строк, которые вы очистили. Как вы можете видеть ниже, каждая строка имеет ту же конфигурацию "ключ-значение", что и наша функция convertListToJSON.

Сделайте это запускать ежедневно

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

На вкладке расписания создайте новое расписание

Заполните поля имени, описания и выражения cron. На этой же странице вы можете обновить, как часто вы хотите, чтобы он запускался, изменив поле выражение cron. Daily кажется здесь хорошим, но он подойдет для любого расписания Chron. После того, как вы назвали все, нажмите на вкладку актеров.

Затем добавьте актера. Это будет актер, которого мы создадим в первой части урока. Актеры - это фрагменты кода, которые мы действительно хотим запустить.

Здесь нам нужно выбрать актера. В нашем случае это crypto-scraper. В основном мы можем игнорировать аргумент сборки, он просто определяет, какую сборку докера мы хотим. Это почти всегда самое последнее. Вы можете играть с таймаутом и памятью, но 1000 секунд должно быть более чем достаточно для этого. Когда вы видите, что ваш скребок истекает, вы можете подойти сюда и отредактировать это поле, но я обычно принимаю значения по умолчанию, чтобы начать. Следующее, что нужно изменить, - это поле тела. Здесь вы определяете вход для актера. Для нас это список биржевых тегов Binance в формате JSON. Вы можете положить сюда сколько угодно. У меня куча. Нажмите "Сохранить", и все готово!

Вывод

Если вы оставили время по умолчанию, то в следующие 24 часа вы должны увидеть, что данные автоматически начнут появляться в вашем хранилище. Довольно круто иметь возможность настроить более или менее беспроблемный непрерывный веб-скребок в облаке. Существует ТОННА API-интерфейсов, таких как Binance, и я рекомендую вам осмотреться и найти различные типы данных, которые вы можете очистить или собрать. В следующем сообщении блога я создам парсер Reddit, используя Reddit API и Python :).