На самом деле, конечно, UrlFetchApp
срабатывает. Просто надо немножко разобраться.
Wildberries
Год назад Wildberries поддавался importxml
, но всё течёт, всё изменяется и теперь даже стандартный UrlFetchApp
по ссылке не выдает ничего.
Итак. Иду на вышеупомянутый сайт:
Как и писал выше, UrlFetchApp
просто по ссылке https://www.wildberries.ru/catalog/16034937/detail.aspx не сработает.
Для того, чтобы все «взлетело» делаю следующее:
- Открываю код:
2. Перехожу в «Сеть»:
3. Нажимаю F5, обновляю страницу:
4. Нахожу details?spp:
5. Перехожу по URL запроса:
И это ни что иное, как объект, содержащий всю информацию по товару.
Script editor
Дальше все стандартно:
const link = "https://card.wb.ru/cards/detail?spp=0®ions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0®=0&appType=1&emp=0&locale=ru&lang=ru&curr=rub&couponsGeo=12,3,18,15,21&dest=-1029256,-51490,12358263,123585548&nm=16034937;43603695;43604494;49286601;75008593;119123172"
function parseWBPrice() {
const response = UrlFetchApp.fetch(link, { muteHttpExceptions: true }).getContentText();
const parsedResponse = JSON.parse(response);
const itemName = parsedResponse.data.products[2]['name']
const itemPrice = parsedResponse.data.products[2]['salePriceU'] / 100
console.log(itemName + " стоит: "+ itemPrice)
return itemPrice
}
запускаю, проверяю:
Комментарии к коду
const response = UrlFetchApp.fetch(link, { muteHttpExceptions: true }).getContentText();
const parsedResponse = JSON.parse(response);
Так как UrlFetchApp
возвращает текст, а по ссылке это объект, то через JSON.parse
делаю его в скрипте так же объектом.
const itemName = parsedResponse.data.products[2]['name']
const itemPrice = parsedResponse.data.products[2]['salePriceU'] / 100
Нахожу в массиве объектов нужную цену salePriceU
.
return itemPrice
— возвращаю цену, как результат работы функции.
Гугл таблицы
Чтобы парсить не в редакторе скриптов, а в таблицах, необходимо чуть-чуть поправить код:
function parseWBPrice(link) {
const response = UrlFetchApp.fetch(link, { muteHttpExceptions: true }).getContentText();
const parsedResponse = JSON.parse(response);
const itemPrice = parsedResponse.data.products[2]['salePriceU'] / 100
return itemPrice
}
Убираю жестко прописанный const link
и передаю его как параметр функции function parseWBPrice(link)
Перехожу в таблицы:
в ячейку А1 вставляю ссылку запроса, в В1 — формулу =parseWBPrice(A2)
:
Вот и всё. Теперь здесь будет актуальная цена при каждом открытии таблицы или обращению по триггеру.
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!
Дорый день!
Спасибо за отдельную статью.
Не смог сделать по аналогии с WB. Так как у ламоды просто не нахожу такого же fetch файла. С ВБ отлично работает, но ламода…
https://www.lamoda.ru/b/33036/brand-2mood/
На самом деле можно.
Вот к примеру https://www.lamoda.ru/p/mp002xw0jyoz/shoes-instreet-tufli/
если покопаться внутри то можно найти такую штуку:
https://www.lamoda.ru/api/v1/product/recommendations?sku=mp002xw0jyoz&similar=true&alsobuy=true&recently=MP002XW0JYOZ,MP002XW0D4JE,RTLABD265001,MP002XM1HSKK&limit=60
Это рекомендации к товару. Они же включают и сам товар
Если копировать урл фотографии — https://a.lmcdn.ru/img600x866/M/P/MP002XW0JYOZ_17617883_1_v2.jpg
Соот-но картинка: MP002XW0JYOZ_17617883_1_v2
По поиску в АПИ такая фотка есть, а под ней и цена тоже
«gallery»: [
«/M/P/MP002XW0JYOZ_17617883_1_v2.jpg»,
«/M/P/MP002XW0JYOZ_17617884_2_v2.jpg»,
«/M/P/MP002XW0JYOZ_17617885_3_v2.jpg»,
«/M/P/MP002XW0JYOZ_17617886_4_v2.jpg»,
«/M/P/MP002XW0JYOZ_17617887_5_v2.jpg»,
«/M/P/MP002XW0JYOZ_17617888_6_v2.jpg»
],
«gender»: «women»,
«image_attributes»: null,
«is_in_stock»: true,
«is_sellable»: true,
«long_attributes»: null,
«old_price»: 3499,
«photoreviews»: null,
«price»: 2099,
«если покопаться внутри то можно найти такую штуку:» — понял это до момента, что эта ссылка находится в цепочке инициатора(вкладка инициатор). Но как достать от туда сылки — не понятно. Они никак не копируются в инициаторе.
Дмитрий, большое спасибо! Это был бы следующие вопрос, но вы статьёй опередили!)
Есть задача собрать в единую таблицу данные по наименованию и ценам с нескольких маркетплейсов. OZON, WB, Sber, Yandex и т.д. и сбор цен по триггерам раз в сутки, условно
Везде разные принципы сбора, что работает на WB, не работает на других…
Есть какой-то код, как можно «унифицировать» сбор или под каждый ресурс нужно отдельный скрипт (файл *.gs) создать будет?
У меня нет такого кода — это полноценный проект по разработке. Можно попробовать поискать на гихабе разрозненные решения (они там есть) и потом свести все воедино.
Попробовал, но о пять ошибки. ссылка в примере работает, но как только добавляешь другие ссылки дальше, то идут ошибки или не те цены.
Например, разные категории товаров:
https://card.wb.ru/cards/detail?spp=0®ions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0®=0&appType=1&emp=0&locale=ru&lang=ru&curr=rub&couponsGeo=12,3,18,15,21&dest=-1029256,-102269,-2162196,-1257786&nm=93333291;93333292
https://card.wb.ru/cards/detail?spp=0®ions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0®=0&appType=1&emp=0&locale=ru&lang=ru&curr=rub&couponsGeo=12,3,18,15,21&dest=-1029256,-102269,-2162196,-1257786&nm=118201630
https://card.wb.ru/cards/detail?spp=0®ions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0®=0&appType=1&emp=0&locale=ru&lang=ru&curr=rub&couponsGeo=12,3,18,15,21&dest=-1029256,-102269,-2162196,-1257786&nm=36176145;36176146;36176147;36176148;49839464
Товары из разных категорий, но уже не отображаются, пишет ERROR в ячейке
Сначала подумал, что достаточно менять ID товара, на который заканчивается ссылка, но нет…
Как собрать в WB по списку так же и по остальным товарам цены с этим скриптом?
Код в посте нацелен на решение одной определенной задачи в качестве примера и не претендует на универсальность.
Далее надо разбираться что возвращает та или иная ссылка и смотреть где стоит нужная цена.
подскажите как сделать чтоб запросы кэшировались или отправлялись скриптом по таймингу.. когда много строк в таблице.. то получаю ошибку
Exception: Service invoked too many times for one day: urlfetch. (строка 3).
Добрый день, эта распространенная ошибка, связанная с лимитами и квотами гугл сервисов на количество соединений —
https://developers.google.com/apps-script/guides/services/quotas?hl=ru
Решение проблемы:
1) Для того, чтобы как-то в них «втиснуться» используйте триггеры в скриптах — слева на боковой панели «Мои триггеры», обычно их выставляют по времени запуска.
2) Используйте скриптовые самописные ограничивающие триггеры на встроенные триггеры (п.1) — https://dmitriizhuk.ru/2022/01/25/trigger-google-apps-script/
как можно с вами связаться? есть пару вопросов
А можно зашить ссылку на страницу в сам скрипт, чтобы поиск осуществлялся по артикулу?
Добрый день, да конечно, вроде как в статье пример — она и зашита в скрипт через const link =