Парсинг позиций товаров по запросу Wildberries

Еще недавно парсинг позиций не вызывал никаких проблем, по обычному запросу search.wb.ru/exactmatch/ru/common/v... отображались все товары и их позиции, с рекламными данными (log и logs, где перечислялась рекламная позиция, cpm и прочее).

С недавних пор ВБ ужесточил политику, связанную с рекламными данными и добавил анти-бот систему. Судя по моим наблюдениям - система связана с одним, конкретным, хедером x-pow

Вот конкретный пример с рабочим x-pow (у него, судя по всему, короткое время жизни)

const resp = await httpGetWithRetry(url, {
    headers: {
      "Accept": "*/*",
      "Accept-Language": "ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7",
      "Origin": "https://www.wildberries.ru",
      "Referer": "https://www.wildberries.ru/catalog/0/search.aspx?search=" + encodeURIComponent(query),
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0",
      "x-pow": "2|site_e73e953d7c85460891f8ac6d7b72ccc9|1761337855|6,8,1,6566ca000000000,25d5428f-35ee-4066-a07b-8018affb9417,8f62c52e-b3d2-46e3-a307-c9e71508e686,1761337912,1,yJxTDStTwwYu20+iETlh4TrGWeR2uqYgJ3DkFVBg5vk=,c7f733386fb4cb95f6547664cb1d4490f5f7009d90a63946b2f9bd0e776a486928b90f3eda4fa954ea574e06d43784774a4e60235e8ac05d5263a7075f15b20e|30",
      "x-queryid": "qid" + Date.now(),
      "x-userid": "0",
      "priority": "u=1, i"
    },
    signalParent
  });

Если убрать этот параметр, или проверить через время - ответ выглядит совершенно по другому. Если кто-нибудь сталкивался с этим и знает, как обойти, (вариант с puppeteer не хочу рассматривать, т.к. время выполнения увеличиться многократно для каждого запроса) буду очень рад услышать хоть что то :)


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

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

Они начали защищаться.

Пример кода для вдохновения:

const puppeteer = require('puppeteer');

async function getPowToken() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.wildberries.ru');

    await page.waitForNavigation({waitUntil: 'networkidle0'});

    await page.waitForFunction(() => {
        return localStorage.getItem('session-pow-token') !== null;
    }, {
        timeout: 5000
    });

    let token = await page.evaluate(() => {
        return localStorage.getItem('session-pow-token')
    });

    console.log('Token:', token)

    await browser.close();
}

getPowToken();

Можно на его основе в фоне не спеша обновлять x-pow значения, а парсерами использовать его. Пока что защита крайне примитивная.

→ Ссылка