async-parser
v1.0.1
Published
Library for parse JSON API's and not only.
Downloads
2
Readme
async-parser
Обертка над библиотекой async для парсинга.
Основное предназначение - парсинг API. Но можно парсить и другие вещи. Для этого понадобятся массивы или объекты, которые будут содержать информацию о том, как формировать ссылку для парсинга. Это не самый удобный способ, который требует подготовки и для больших объемов и удобства лучше взять специальный софт для парсинга - например Content Downloader, но если вам вдруг нужно удобно парсить что-то на JS, например регулярно парсить какое-то API, у которого не меняется структура url'ов, то эта библиотека может вам пригодиться.
Также можно просто парсить по списку URL или массиву меняющихся в URL частей (читайте ниже).
Установка
npm install --save async-parser
Использование
На примере API Travelpayouts.
const parser = require('async-parser'); // импортируем библиотеку
const customHandler = require('./custom-handler-for-response-data'); // кастомный обработчик ответа парсинга, не обязательно
const resultsCallback = (response) => console.log(response);
const assetsListWithObjects = [
{ origin: 'MOW', destination: 'LED' },
{ origin: 'MOW', destination: 'ROM' },
{ origin: 'MOW', destination: 'FRA' },
{ origin: 'MOW', destination: 'BKK' },
{ origin: 'MOW', destination: 'BER' }
];
parser({
writeToFile: true,
outputPath: './output',
outputFileName: 'results.json',
operationsLimit: 2,
assets: assetsListWithObjects,
urlSchema: {
baseUrl: 'http://api.travelpayouts.com',
prefix: '/v2/prices/latest',
query: {
currency: 'rub',
show_to_affiliates: true,
token: "token"
},
changingAssets: ['origin', 'destination']
},
handler: customHandler
}, resultsCallback);
Пройдемся по-порядку.
writeToFile
Определяет нужно ли записывать результаты парсинга в файл. По-умолчанию: true
. Записывает все спаршенные результаты в один файл после окончания парсинга, так что если вам нужно записывать результат парсинга каждой страницы в отдельный файл - в этом случае лучше написать кастомный обработчик который будет писать каждый ответ в файл и отключить запись в файл.
outputPath
Путь к папке, куда будет записан файл с результатами парсинга. По-умолчанию ./output
. Если директории нет - она будет создана.
outputFileName
Имя файла для результатов парсинга. Будет сохранено в папку указанную в outputPath
. По-умолчанию results.json
.
operationsLimit
Определяет максимальное одновременное количество асинхронных операций (если можно так выразиться - потоков парсинга). См. документацию async.mapLimit. По-умолчанию - 5
assets
Массив со значениями меняющихся в URL параметров. Может быть массивом со строками, числами или объектами (одновременно в массиве могут быть смешанные значения).
Для ссылок с одним меняющимся параметром массив может выглядеть так:
const assets = ["MOW", "BKK", "FRA", "LED", "BER"]; // list of airport IATA codes
Будут спаршены ссылки такого вида, если меняется параметр origin
:
http://api.travelpayouts.com/v2/prices/latest?origin=MOW
http://api.travelpayouts.com/v2/prices/latest?origin=BKK
Для ссылок у которых меняются два и более параметра - параметры для каждой ссылки должны быть переданы в виде объекта, ключами которого являются названия query-параметров URL, а значение - соответственно значением этого query-параметра. Например:
const assetsListWithObjects = [
{ origin: 'MOW', destination: 'LED', currency: 'usd' },
{ origin: 'MOW', destination: 'ROM' },
{ origin: 'MOW', destination: 'FRA' },
{ origin: 'MOW', destination: 'BKK' },
{ origin: 'MOW', destination: 'BER' }
];
Будут спаршены ссылки такого вида:
http://api.travelpayouts.com/v2/prices/latest?origin=MOW&destination=LED¤cy=usd
http://api.travelpayouts.com/v2/prices/latest?origin=MOW&destination=ROM
http://api.travelpayouts.com/v2/prices/latest?origin=MOW&destination=FRA
Как вы видите, можно в каких-то объектах указывать дополнительный параметр, главное при этом не забыть указать в настройках парсера все возможные подобные параметры в опции urlSchema.changingAssets
. При этом, даже если эти параметры указаны там, но в каких-то объектах их нет - они не будут подставлены в url для парсинга. Внимание! Такая же логика не работает с параметрами urlSchema.changingParams
(по причине того, что в этом случае в url подставляется часть которая определяется параметром urlSchema.template
, и в случае отсутствия параметра - вы получите ссылку вида http://some/templatepart/undefined
).
plainUrls
Если у вас уже есть список ссылок который нужно спарсить, то нужно кинуть их как массив assets
(описан выше) и передать параметр plainUrls: true
. В этом случае не нужен параметр urlSchema
, описанный ниже, скрипт просто пропарсит ваш список ссылок как есть.
urlSchema
Определяет как будет выглядеть ссылка для парсинга. Использует под капотом для сборки url библиотеку safe-url-assembler.
baseUrl
Базовый url, к которому будут подставляться остальные параметры.
prefix
Подставляется сразу после baseUrl
.
query
Предустановленные query-параметры для каждого url (используются для не изменяющихся частей url).
template
Часть url, которая может содержать динамические части, обозначенные как /:dynamic-param
. При установке шаблона должен быть передан параметр urlSchema.changingParams
с виде массива с названиями меняющихся частей, например: ['dynamic-param']
. Также в случае если это постоянные параметры URL - можно передавать их через параметр params
(см. документацию safe-url-assembler).
addSegments
Добавляет сегменты ссылки, должен быть передан в виде массива вида: ['/segment-of-url1', '/segment2', '/segment3/:segment3']
. Сегменты будут подставлены в порядке указанном в массиве. В них также можно указать динамическую часть, которую нужно указать в urlSchema.changingParams
и передавать с каждым объектом для парсинга или через параметр params
(см. документацию safe-url-assembler).
changingAssets
Список названий изменяющихся query-параметров URL, передается в виде массива: ['origin', 'destination']
. Значения для этих параметров передаются в виде массива строк/чисел/объектов в параметре assets
(описан выше).
changingParams
Список названий изменяющихся частей URL (/some/:path
), передается в виде массива: ['origin', 'destination']
. Если указан, то необходимо обязательно передавать его с каждым объектом для парсинга, иначе получите undefined в части url. Значения для этих параметров передаются в виде массива строк/чисел/объектов в параметре assets
(описан выше).
handler
Кастомный обработчик, применяется к каждому отдельному результату парсинга. В обработчике есть доступ к двум параметрам: response
и asset
. Первый - результат парсинга, второй - переданные для парсинга параметры.
В кастомном обработчике можно, например, переформатировать полученные с сервера данные как вам нужно и/или записать в отдельный файл каждый результат. Можно, к примеру, подключить cheerio
в обработчике и парсить HTML полученный с сервера, выдирать нужные части и писать в файл.
customAxiosConfig
Здесь можно передать кастомные параметры для запросов в axios (см. раздел Request Config документации). Естественно, не стоит передавать параметры типа url, baseUrl, method и другие, относящиеся к модификации ссылки запроса, потому что этим занимается моя библиотека.
Вывод результатов парсинга
Вторым параметром после объекта с настройками парсинга можно передать опциональную callback функцию с одним параметром, например response
, которая будет выполнена после окончания парсинга, тогда результаты парсинга будут выведены в консоль, см. скриншот ниже.
Примеры использования
См. папку examples
.