npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

async-parser

v1.0.1

Published

Library for parse JSON API's and not only.

Downloads

3

Readme

async-parser

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&currency=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, которая будет выполнена после окончания парсинга, тогда результаты парсинга будут выведены в консоль, см. скриншот ниже.

async-parser

Примеры использования

См. папку examples.