Для парсинга контента, товаров каталога, использую NODE.JS. Написанный парсер работает. Однако, в процессе парсинга получаю битые изображения товаров.
Сам парсер собирает данные из HTML – кода сайта производителя: названия, описания, цены, характеристики товаров в том числе и ссылки на файлы изображений товаров.
По ссылкам на файлы изображений товаров - прохожу в цикле и скачиваю каждое изображение с помощью функции:
/**
* url - ссылка на файл с изображением
* dir - Директория, папка для скаченного файла
* prefix - строка для названия файла
* getString(10) - функция для формирования подстроки из сислучайных символов для уникального названия файла
*/
function getFile(url, dir='images', prefix=''){
//Определяем расширение файла, формируем путь из дирикторий и названия файла
let extension = url.slice(url.lastIndexOf('.') + 1);
dir = `./upload/${dir}`;
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
let filePath = `${dir}/${prefix}_${getString(10)}.${extension}`;
//Функция для скачиванеи файла на диск
function doRequest(url, filePath) {
https.get(url, function(res) {
res.on('data', function(data) {
require('fs').createWriteStream(filePath, {flags:'a+'}).write(data);
});
});
}
//Функция для проверки неаличия скаченного файла на дикске
async function exists (path) {
try {
await Fs.access(path)
return true
} catch {
return false
}
}
//Скачиваем файл по ссылке
doRequest(url, filePath);
//Проверяем, если файл скачен на диск возвращаем строку - путь к файлу
return exists(filePath) ? filePath : false
}
Однако часть полученных файлов изображений битые, с артефактами. Возможно, в связи с асинхронностью. Возможно, проблема в логике скрипта.
Как поправить? Что сделать, чтобы получать корректные изображения?