Как получить url изображения товара с wildberries по ссылке на товар?
Если перейти в карточку товара на вб и через inspect посмотреть ссылку на изображение, то она будет выглядеть следующим образом: https://basket-10.wb.ru/vol1425/part142562/142562537/images/big/1.webp, где 142562537 будет артикул товара, но вот откуда берется basket-10 не понятно. При этом для разных товаров номер basket будет разный. Можно ли как-то не используя selenium определить номер баскета? Поиск по запросам из network ничего не дал.
Ответы (4 шт):
Номер "basket" в URL, скорее всего, представляет собой какой-то внутренний идентификатор корзины или сервера, и он может изменяться для разных сессий или разных товаров. Этот номер, вероятно, генерируется динамически и может быть связан с вашей сессией на веб-сайте.
Ниже код на 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}`;
}
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));
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("Быстрый поиск не дал результатов. "+
"Возможно, картинки нет или у нее редкий номер.");
}
})();