Как парсить, если importxml и UrlFetchApp не срабатывает

На самом деле, конечно, UrlFetchApp срабатывает. Просто надо немножко разобраться.

Wildberries

Год назад Wildberries поддавался importxml, но всё течёт, всё изменяется и теперь даже стандартный UrlFetchApp по ссылке не выдает ничего.

Итак. Иду на вышеупомянутый сайт:

wildberries goods

Как и писал выше, UrlFetchApp просто по ссылке https://www.wildberries.ru/catalog/16034937/detail.aspx не сработает.

Для того, чтобы все «взлетело» делаю следующее:

  1. Открываю код:

2. Перехожу в «Сеть»:

3. Нажимаю F5, обновляю страницу:

4. Нахожу details?spp:

5. Перехожу по URL запроса:

И это ни что иное, как объект, содержащий всю информацию по товару.

Script editor

Дальше все стандартно:

const link = "https://card.wb.ru/cards/detail?spp=0&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0&reg=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):

Вот и всё. Теперь здесь будет актуальная цена при каждом открытии таблицы или обращению по триггеру.


Ваше мнение важно и может улучшить блог

Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!

У этой записи 12 комментариев

  1. Sava

    Дорый день!
    Спасибо за отдельную статью.
    Не смог сделать по аналогии с WB. Так как у ламоды просто не нахожу такого же fetch файла. С ВБ отлично работает, но ламода…
    https://www.lamoda.ru/b/33036/brand-2mood/

    1. На самом деле можно.
      Вот к примеру 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,

      1. Sava

        «если покопаться внутри то можно найти такую штуку:» — понял это до момента, что эта ссылка находится в цепочке инициатора(вкладка инициатор). Но как достать от туда сылки — не понятно. Они никак не копируются в инициаторе.

  2. Илья

    Дмитрий, большое спасибо! Это был бы следующие вопрос, но вы статьёй опередили!)
    Есть задача собрать в единую таблицу данные по наименованию и ценам с нескольких маркетплейсов. OZON, WB, Sber, Yandex и т.д. и сбор цен по триггерам раз в сутки, условно
    Везде разные принципы сбора, что работает на WB, не работает на других…
    Есть какой-то код, как можно «унифицировать» сбор или под каждый ресурс нужно отдельный скрипт (файл *.gs) создать будет?

    1. У меня нет такого кода — это полноценный проект по разработке. Можно попробовать поискать на гихабе разрозненные решения (они там есть) и потом свести все воедино.

  3. Илья

    Попробовал, но о пять ошибки. ссылка в примере работает, но как только добавляешь другие ссылки дальше, то идут ошибки или не те цены.
    Например, разные категории товаров:
    https://card.wb.ru/cards/detail?spp=0&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0&reg=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&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0&reg=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&regions=68,64,83,4,38,80,33,70,82,86,75,30,69,22,66,31,40,1,48,71&pricemarginCoeff=1.0&reg=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 по списку так же и по остальным товарам цены с этим скриптом?

    1. Код в посте нацелен на решение одной определенной задачи в качестве примера и не претендует на универсальность.
      Далее надо разбираться что возвращает та или иная ссылка и смотреть где стоит нужная цена.

  4. Екатерина

    подскажите как сделать чтоб запросы кэшировались или отправлялись скриптом по таймингу.. когда много строк в таблице.. то получаю ошибку
    Exception: Service invoked too many times for one day: urlfetch. (строка 3).

    1. Добрый день, эта распространенная ошибка, связанная с лимитами и квотами гугл сервисов на количество соединений —
      https://developers.google.com/apps-script/guides/services/quotas?hl=ru

      Решение проблемы:
      1) Для того, чтобы как-то в них «втиснуться» используйте триггеры в скриптах — слева на боковой панели «Мои триггеры», обычно их выставляют по времени запуска.
      2) Используйте скриптовые самописные ограничивающие триггеры на встроенные триггеры (п.1) — https://dmitriizhuk.ru/2022/01/25/trigger-google-apps-script/

  5. Павел

    как можно с вами связаться? есть пару вопросов

  6. Екатерина

    А можно зашить ссылку на страницу в сам скрипт, чтобы поиск осуществлялся по артикулу?

    1. Добрый день, да конечно, вроде как в статье пример — она и зашита в скрипт через const link =

Добавить комментарий