Парсер на node.js
Пытаюсь спарсить интернет-магазин, чтобы вытащить оттуда товары. Создаю массив с нужными мне категориями:
const categories = ['kompyutery', 'noutbuki', 'smartfony', 'televizory'];
export default categories;
Далее пытаюсь перебрать этот самый массив, сгенерировать нужную ссылку, спарсить товары:
import categories from './categories.js';
import getData from './citilink.js';
const urlGeneration = (category) => {
const url = `https://www.citilink.ru/catalog/${category}/?sorting=price_asc&view_type=list`;
return url;
};
categories.map((item) => {
getData(urlGeneration(item), item);
});
То есть, программа берет сразу весь массив, сразу все 4 категории подставляет, по итогу что-то записывается, но не в свои файлы, а вперемешку. Как мне сделать, чтобы сначала полностью отрабатывала 1 категория, а уже только потом приступало ко второй и так далее? Сам код парсера:
import cheerio from 'cheerio';
import axios from 'axios';
import chalk from 'chalk';
import { Parser } from 'json2csv';
import fs from 'fs';
let total = 0;
let currentValue = 0;
let page = 1;
const data = [];
const start = performance.now();
const getData = async (url, category) => {
const baseUrl = 'https://www.citilink.ru';
console.log(category);
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
const results = $('.product_data__gtm-js');
total = $('.Subcategory__title-container')
.find('.Subcategory__count')
.text()
.replace(/\D/g, '');
console.log(chalk.bgCyan('Всего позиций для парсинга:') + ' ' + total);
console.log(chalk.bgCyan('В очереди на парсинг: ') + ' ' + currentValue);
results.each(function () {
const title = $(this)
.find('a.ProductCardHorizontal__title')
.text()
.trim();
const path = $(this)
.find('.ProductCardHorizontal__header-block a')
.attr('href');
const link = baseUrl + path;
const price = $(this)
.find('span.ProductCardHorizontal__price_current-price')
.text()
.replace(/\D/g, '');
data.push({ title, link, price });
});
if ($('.PaginationWidget__show-more').length > 0) {
page += 1;
currentValue = total - (page - 1) * 48;
console.log(chalk.bgGreen('Перешел на страницу:') + ' ' + page);
console.log(chalk.bgGreen('Осталось спарсить:') + ' ' + currentValue);
const next_page = `https://www.citilink.ru/catalog/${category}/?sorting=price_asc&view_type=list&p=${page}`;
setTimeout(function () {
getData(next_page, category);
}, 3500);
} else {
const parser = new Parser();
const csv = parser.parse(data);
fs.writeFileSync(`./${category}.csv`, csv);
const end = performance.now();
const time = (end - start) / 1000;
console.log('Execution time: ' + time + ' seconds');
}
} catch (error) {
console.error(error);
}
};
export default getData;
