Как получить url изображения товара с wildberries по ссылке на товар?

Если перейти в карточку товара на вб и через inspect посмотреть ссылку на изображение, то она будет выглядеть следующим образом: https://basket-10.wb.ru/vol1425/part142562/142562537/images/big/1.webp, где 142562537 будет артикул товара, но вот откуда берется basket-10 не понятно. При этом для разных товаров номер basket будет разный. Можно ли как-то не используя selenium определить номер баскета? Поиск по запросам из network ничего не дал.


Ответы (4 шт):

Автор решения: KerD

Номер "basket" в URL, скорее всего, представляет собой какой-то внутренний идентификатор корзины или сервера, и он может изменяться для разных сессий или разных товаров. Этот номер, вероятно, генерируется динамически и может быть связан с вашей сессией на веб-сайте.

→ Ссылка
Автор решения: Shilgen

Ниже код на js, но думаю вы разберетесь: берем артикул vol это артикул деленный на 100000

переменная vol - по сути номер basket

значения подобраны эмпирически, не являются истиной в последней инстанции

// Делает картинки для артикулов
function wb_img_url(input) {
  const nm = parseInt(input, 10),
    vol = ~~(nm / 1e5),
    part = ~~(nm / 1e3);
  let host;
  if (vol >= 0 && vol <= 143) {
    host = "//basket-01.wb.ru";
  } else if (vol >= 144 && vol <= 287) {
    host = "//basket-02.wb.ru";
  } else if (vol >= 288 && vol <= 431) {
    host = "//basket-03.wb.ru";
  } else if (vol >= 432 && vol <= 719) {
    host = "//basket-04.wb.ru";
  } else if (vol >= 720 && vol <= 1007) {
    host = "//basket-05.wb.ru";
  } else if (vol >= 1008 && vol <= 1061) {
    host = "//basket-06.wb.ru";
  } else if (vol >= 1062 && vol <= 1115) {
    host = "//basket-07.wb.ru";
  } else if (vol >= 1116 && vol <= 1169) {
    host = "//basket-08.wb.ru";
  } else if (vol >= 1170 && vol <= 1313) {
    host = "//basket-09.wb.ru";
  } else if (vol >= 1314 && vol <= 1601) {
    host = "//basket-10.wb.ru";
  } else if (vol >= 1602 && vol <= 1655) {
    host = "//basket-11.wb.ru";
  } else if (vol >= 1656 && vol <= 1919) {
    host = "//basket-12.wb.ru";
  } else if (vol >= 1920 && vol <= 2045) {
    host = "//basket-13.wb.ru";
  } else {
    host = "//basket-14.wb.ru";
  }

  return `${host}/vol${vol}/part${part}/${nm}`;
}

→ Ссылка
Автор решения: Jora Xazaryan

V2

function makeProductImageUrl(productId) {
  const nm = parseInt(productId, 10);
        const vol = ~~(nm / 1e5);
        const part = ~~(nm / 1e3);
        let host = '';
        if (vol >= 0 && vol <= 143) host = '01';
        else if (vol >= 144 && vol <= 287) host = '02';
        else if (vol >= 288 && vol <= 431) host = '03';
        else if (vol >= 432 && vol <= 719) host = '04';
        else if (vol >= 720 && vol <= 1007) host = '05';
        else if (vol >= 1008 && vol <= 1061) host = '06';
        else if (vol >= 1062 && vol <= 1115) host = '07';
        else if (vol >= 1116 && vol <= 1169) host = '08';
        else if (vol >= 1170 && vol <= 1313) host = '09';
        else if (vol >= 1314 && vol <= 1601) host = '10';
        else if (vol >= 1602 && vol <= 1655) host = '11';
        else if (vol >= 1656 && vol <= 1919) host = '12';
        else if (vol >= 1920 && vol <= 2045) host = '13';
        else if (vol >= 1920 && vol <= 2189) host = '14';
        else if (vol >= 1920 && vol <= 2405) host = '15';
        else if (vol >= 1920 && vol <= 2621) host = '16';
        else if (vol >= 1920 && vol <= 2837) host = '17';
        else host = '18';
        return `https://basket-${host}.wbbasket.ru/vol${vol}/part${part}/${nm}`;
}
document.write(makeProductImageUrl(225671314));

→ Ссылка
Автор решения: kirlz
const https = require('https');

async function getFastImageUrl(nmId) {
    const nm = parseInt(nmId, 10);
    if (isNaN(nm)) {
        console.error("Неверный артикул");
        return null;
    }

    // 1. Точно вычисляем хост по самой полной логике
    const vol = ~~(nm / 1e5);
    let hostNumStr;
    if (vol >= 0 && vol <= 143) hostNumStr = '01';
    else if (vol >= 144 && vol <= 287) hostNumStr = '02';
    else if (vol >= 288 && vol <= 431) hostNumStr = '03';
    else if (vol >= 432 && vol <= 719) hostNumStr = '04';
    else if (vol >= 720 && vol <= 1007) hostNumStr = '05';
    else if (vol >= 1008 && vol <= 1061) hostNumStr = '06';
    else if (vol >= 1062 && vol <= 1115) hostNumStr = '07';
    else if (vol >= 1116 && vol <= 1169) hostNumStr = '08';
    else if (vol >= 1170 && vol <= 1313) hostNumStr = '09';
    else if (vol >= 1314 && vol <= 1601) hostNumStr = '10';
    else if (vol >= 1602 && vol <= 1655) hostNumStr = '11';
    else if (vol >= 1656 && vol <= 1919) hostNumStr = '12';
    else if (vol >= 1920 && vol <= 2045) hostNumStr = '13';
    else if (vol >= 2046 && vol <= 2189) hostNumStr = '14';
    else if (vol >= 2190 && vol <= 2405) hostNumStr = '15';
    else if (vol >= 2406 && vol <= 2621) hostNumStr = '16';
    else if (vol >= 2622 && vol <= 2837) hostNumStr = '17';
    else hostNumStr = '18';

    const part = ~~(nm / 1e3);
    const basePath = `https://basket-${hostNumStr}.wbbasket.ru/`+
                     `vol${vol}/part${part}/${nm}/images/big/`;

    // 2. Быстро проверяем самые вероятные варианты
    for (let imgNum = 1; imgNum <= 3; imgNum++) {
        for (const ext of ['webp', 'jpg']) {
            const url = `${basePath}${imgNum}.${ext}`;
            const code = await checkUrl(url);
            if (code === 200) {
                return url; // Нашли, сразу возвращаем
            }
        }
    }

    return null; // Не нашли после быстрой проверки
}

function checkUrl(url) {
    return new Promise(resolve => {
        const request = https.get(url, (res) => {
            resolve(res.statusCode);
            res.resume(); // Потребляем данные для освобождения памяти
        });
        request.on('error', () => resolve(0));
        request.setTimeout(1500, () => {
            request.destroy();
            resolve(0);
        });
    });
}

// --- Запуск ---
(async () => {
    const args = process.argv.slice(2);
    if (args.length === 0) {
        console.error("Укажите артикул (nmId). "+
                      "Пример: node getFastImageUrl.js 12345678");
        process.exit(1);
    }
    const imageUrl = await getFastImageUrl(args[0]);
    if (imageUrl) {
        console.log("Найдена быстрая ссылка:");
        console.log(imageUrl);
    } else {
        console.log("Быстрый поиск не дал результатов. "+
                    "Возможно, картинки нет или у нее редкий номер.");
    }
})(); 
→ Ссылка