0 р.
Оформить заказ- Артикул: MH3*21 001
- Производители American Tourister
- Код Товара: 7702-01
- Наличие: В наличии
До окончания акции
Основные характеристики
Все характеристикиРазмеры:40 × 55 × 20 см
Объём:35 л
Вес:2.4 кг
Материал:полипропилен
Цвет:бирюзовый
function parseProductLinks() {// Находим контейнер с классом RelationModel__AllModelsconst container = document.querySelector('div.RelationModel__AllModels');const productData = [];// Функция для извлечения чистого числа из ценыfunction extractPriceNumber(priceText) {if (!priceText || priceText === 'Нет в продаже') {return null;}// Убираем все символы кроме цифр, запятых и пробелов, затем заменяем запятые на точки и пробелы на пустотуconst cleanPrice = priceText.replace(/[^\d,]/g, '').replace(',', '.').replace(/\s/g, '');return parseFloat(cleanPrice) || null;}// Функция для определения приоритета цветаfunction getColorPriority(url) {const lowerUrl = url.toLowerCase();if (lowerUrl.includes('chern')) {return 1; // Черный — самый высокий приоритет} else if (lowerUrl.includes('sery')) {return 2; // Серый — второй приоритет} else {return 3; // Остальные цвета — самый низкий приоритет}}// Функция для извлечения базового названия товара и проверки наличия "международная версия"function extractBaseProductName() {const titleElement = document.querySelector('h1.Page__TitleActivePage');if (!titleElement) return { baseName: 'Неизвестный товар', hasInternationalVersion: false };let title = titleElement.textContent.trim();// Проверяем наличие "международная версия"const hasInternationalVersion = /международная\s+версия/i.test(title);// Убираем "Смартфон" в начале, если естьtitle = title.replace(/^Смартфон\s*/, '');// Убираем всё после памяти (до цвета или конца)const memoryMatch = title.match(/^(.*?)(?:\s+\d+GB|\s+\d+Гб|\s+\d+TB|\s+\(\w+\))/i);if (memoryMatch) {return { baseName: memoryMatch[1].trim(), hasInternationalVersion };}// Если памяти нет, убираем цветconst colorMatch = title.match(/^(.*?)(?:\s+\(\w+\))/i);if (colorMatch) {return { baseName: colorMatch[1].trim(), hasInternationalVersion };}return { baseName: title.trim(), hasInternationalVersion };}// Функция для создания полного названия с памятью для конкретной конфигурацииfunction createProductNameWithMemory(baseName, ram, storage, hasInternationalVersion) {const ramGB = ram === 999999 ? '' : ram + 'GB';// Для названия показываем 1TB или 2TB, если storage = 1000 или 2000const storageDisplay = storage === 1000 ? '1TB' :(storage === 2000 ? '2TB' :(storage === 999999 ? '' : storage + 'GB'));let memoryPart = '';if (ramGB && storageDisplay) {memoryPart = `${ramGB}/${storageDisplay}`;} else if (storageDisplay) {memoryPart = storageDisplay;}let fullName = baseName;if (memoryPart) {fullName += ` ${memoryPart}`;}if (hasInternationalVersion) {fullName += ' международная версия';}return fullName;}// Добавляем текущий URL страницы (для выбранного товара)const currentPageUrl = window.location.href;if (currentPageUrl) {// Для текущего товара (selected) извлекаем цену из span.RelationModel__ItemModels.selected .RelationModel__ContainerPriceconst selectedItem = document.querySelector('span.RelationModel__ItemModels.selected');let currentPrice = null;if (selectedItem) {const priceSpan = selectedItem.querySelector('span.RelationModel__ContainerPrice span');if (priceSpan) {const priceText = priceSpan.textContent.trim();currentPrice = extractPriceNumber(priceText);}}productData.push({ url: currentPageUrl, price: currentPrice });}if (container) {// Находим все элементы внутри контейнераconst links = container.querySelectorAll('a[href]');// Собираем href и цену из каждого элементаlinks.forEach(link => {const href = link.href;let price = null;if (href) {// Извлекаем цену из span.RelationModel__ContainerPrice внутри этого const priceSpan = link.querySelector('span.RelationModel__ContainerPrice span');if (priceSpan) {const priceText = priceSpan.textContent.trim();price = extractPriceNumber(priceText);}productData.push({ url: href, price: price });}});} else {console.warn('Контейнер с классом RelationModel__AllModels не найден');}// Удаляем дубликаты по URL, если они естьconst uniqueData = productData.filter((item, index, self) =>index === self.findIndex(t => t.url === item.url));// Функция для извлечения объёма встроенной и оперативной памятиfunction getMemorySizes(url) {// Ищем все вхождения чисел перед 'gb' или 'tb'const matches = url.match(/(\d+)(gb|tb)/gi) || [];// Если два вхождения (например, 12gb_256gb), берём обаlet ram = matches.length === 2 ? matches[0] : null;let storage = matches.length === 2 ? matches[1] : matches[0];// Если ничего не найдено, возвращаем большие числа для конца спискаif (!storage) return { ram: 999999, storage: 999999 };// Конвертируем storage (tb в gb) - для сортировки используем 1000GB или 2000GBlet storageMatch = storage.match(/(\d+)(gb|tb)/i);let storageSize = storageMatch ? parseInt(storageMatch[1], 10) : 999999;if (storageMatch && storageMatch[2].toLowerCase() === 'tb') {storageSize *= 1000; // 1tb = 1000gb, 2tb = 2000gb для сортировки}// Извлекаем ram, если естьlet ramSize = ram ? parseInt(ram.match(/(\d+)(gb)/i)?.[1] || 999999, 10) : 999999;return { ram: ramSize, storage: storageSize };}// Сортируем по встроенной памяти, затем по оперативной, затем по цветуconst sortedData = uniqueData.sort((a, b) => {const sizesA = getMemorySizes(a.url);const sizesB = getMemorySizes(b.url);// Сначала сравниваем по встроенной памятиif (sizesA.storage !== sizesB.storage) {return sizesA.storage - sizesB.storage;}// Если встроенная память одинакова, сравниваем по оперативнойif (sizesA.ram !== sizesB.ram) {return sizesA.ram - sizesB.ram;}// Если оперативная память тоже одинакова, сравниваем по приоритету цветаconst colorPriorityA = getColorPriority(a.url);const colorPriorityB = getColorPriority(b.url);return colorPriorityA - colorPriorityB;});// ПЕРВЫЙ ВЫВОД: Обычный список ссылок с ценамиlet output1 = 'Найденные ссылки на товары: [\n';let lastStorage = null;sortedData.forEach((item, index) => {const { storage } = getMemorySizes(item.url);// Добавляем пустую строку перед новой группой (кроме первой)if (lastStorage !== null && storage !== lastStorage && storage !== 999999) {output1 += '\n';}// Выводим ссылку с ценой в формате "ссылка[TAB]число" или просто "ссылка"if (item.price !== null) {output1 += item.url + '\t' + Math.round(item.price) + '\n';} else {output1 += item.url + '\n';}lastStorage = storage;});output1 += ']\n\n';// ВТОРОЙ ВЫВОД: Группировка для личного сайтаlet output2 = 'Найденные ссылки для личного сайта: [\n';let currentGroup = [];let lastConfig = null; // Для отслеживания изменения конфигурации (ram + storage)const { baseName, hasInternationalVersion } = extractBaseProductName(); // Базовое название и флагsortedData.forEach((item, index) => {const sizes = getMemorySizes(item.url);const currentConfig = `${sizes.ram}_${sizes.storage}`; // Уникальный ключ для группы (ram_storage)// Если конфигурация изменилась, обрабатываем предыдущую группуif (currentGroup.length > 0 && currentConfig !== lastConfig) {// Создаём название с памятью для этой группы (с 1TB или 2TB для отображения)const groupName = createProductNameWithMemory(baseName,currentGroup[0].sizes?.ram || 999999,currentGroup[0].sizes?.storage || 999999,hasInternationalVersion);// Извлекаем минимальную цену из группыconst minPrice = Math.min(...currentGroup.map(g => g.price || 9999));const finalMinPrice = minPrice === 9999 ? 9999 : Math.round(minPrice);// Собираем ссылки группы через ;const groupLinks = currentGroup.map(g => g.url).join(';');// Добавляем строку группыoutput2 += groupName + ';' + finalMinPrice + ';' + groupLinks + '\n';// Очищаем группуcurrentGroup = [];}// Добавляем текущий элемент в группу с его размерамиitem.sizes = sizes;currentGroup.push(item);lastConfig = currentConfig;// Если это последний элемент, обрабатываем последнюю группуif (index === sortedData.length - 1 && currentGroup.length > 0) {const groupName = createProductNameWithMemory(baseName,currentGroup[0].sizes?.ram || 999999,currentGroup[0].sizes?.storage || 999999,hasInternationalVersion);const minPrice = Math.min(...currentGroup.map(g => g.price || 9999));const finalMinPrice = minPrice === 9999 ? 9999 : Math.round(minPrice);const groupLinks = currentGroup.map(g => g.url).join(';');output2 += groupName + ';' + finalMinPrice + ';' + groupLinks + '\n';}});output2 += ']';// Выводим оба результатаconsole.log(output1);console.log(output2);}// Выполняем парсингparseProductLinks()
Характеристики
Общие
Размеры40 × 55 × 20 см
Объём35 л
Вес2.4 кг
Материалполипропилен
Цветбирюзовый
ДетскийДа
Чемодан
Количество колёс4
Отзывов (0)
Нет отзывов об этом товаре.









