[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-ru-dannye-tovarov-tiktok-shop-issledovanie":3},{"success":4,"payload":5,"related":84,"errors":160},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":15,"og_description":16,"og_image_url":17,"faq_json":18,"key_takeaways":34,"allow_index":4,"noindex_google_only":40,"allow_follow":4,"published_at":41,"updated_at":42,"content_updated_at":43,"featured_image_url":44,"featured_image_alt":45,"card_image_url":46,"reading_time_minutes":47,"author":48,"categories":52,"tags":59,"alternates":76,"locale_paths":82,"views":83},215,"dannye-tovarov-tiktok-shop-issledovanie","Данные о товарах TikTok Shop для маркетинговых исследований","Сначала официальные пути: что на самом деле отдают TikTok Shop Partner API и Research API, когда лицензированные данные выгоднее и как читать публичные страницы товаров медленно и в нужном рынке.","\u003Cp>Если вам нужны данные о товарах TikTok Shop для исследования цен или ассортимента, начинать стоит с официальных путей. TikTok Shop Partner API отдаёт полный каталог и данные заказов, но только по магазинам, которые авторизовали ваше приложение. TikTok Research API возвращает поля товара, цены и числа продаж для магазинов ЕС, но только одобренным некоммерческим исследователям. Большинство коммерческих команд, изучающих конкурентов, в итоге берут лицензированные данные у аналитических сервисов или используют медленный и аккуратный сборщик, который читает структурированные данные, уже опубликованные на публичных страницах товаров, через IP в исследуемом рынке.\u003C\u002Fp>\n\n\u003Cp>Это руководство написано для маркетинговых исследований. Оно не связано с TikTok и не одобрено им, а приватные подписанные внутренние API TikTok в нём не рассматриваются.\u003C\u002Fp>\n\n\u003Ch2>Какие данные о товарах TikTok Shop на самом деле нужны командам\u003C\u002Fh2>\n\n\u003Cp>Большинство исследовательских вопросов сводится примерно к восьми полям: название товара, текущая цена, базовая цена (а значит, и скидка), число продаж, магазин, рейтинг и количество отзывов, категория и то, какие авторы продвигают товар.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Исследование цен. Текущая цена, базовая цена, валюта и действующие акции в сравнении между продавцами одного и того же или аналогичного товара. Нужны согласованные метки времени и фиксированный рынок. Цена с британской витрины и цена с немецкой — это два разных наблюдения, а не одно зашумлённое.\u003C\u002Fli>\n\u003Cli>Анализ ассортимента. Какие категории охватывает магазин, сколько у него SKU и вариантов и где его цены находятся внутри категории. Обычно достаточно еженедельных снимков.\u003C\u002Fli>\n\u003Cli>Выявление трендов. Изменения числа продаж и количества отзывов во времени по категориям. Абсолютные значения важны меньше, чем наклон, и это удачно, потому что отображаемые цифры продаж неточны (подробнее ниже).\u003C\u002Fli>\n\u003Cli>Картирование авторов и партнёров. Какие авторы ссылаются на товар. С юридической точки зрения это самое чувствительное поле, потому что речь о людях, а не о товарах.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Если вы уже строили трекеры цен для других маркетплейсов, схема знакомая. Наши руководства по \u003Ca href=\"\u002Fru\u002Fblog\u002Fmonitoring-konkurentnykh-tsen\">автоматическому мониторингу цен конкурентов\u003C\u002Fa> и \u003Ca href=\"\u002Fru\u002Fblog\u002Fgeotargetirovannyi-monitoring-tsen\">отслеживанию цен на разных рынках\u003C\u002Fa> описывают сам пайплайн. На TikTok Shop отличается то, какая часть каталога закрыта привязкой к рынку и логином.\u003C\u002Fp>\n\n\u003Ch2>Официальные пути к данным TikTok Shop\u003C\u002Fh2>\n\n\u003Cp>Есть три легитимных источника структурированных данных TikTok Shop, и ни один из них не отдаёт коммерческой команде каталоги конкурентов просто так. Всё равно проверьте их первыми: первые два бесплатны, если вы подходите под условия, а третий часто обходится дешевле собственной разработки.\u003C\u002Fp>\n\n\u003Ch3>TikTok Shop Partner Center и TTS API\u003C\u002Fh3>\n\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fpartner.tiktokshop.com\u002Fdocv2\u002Fpage\u002Ftts-api-concepts-overview\" rel=\"noopener noreferrer\">TikTok Shop Partner Center\u003C\u002Fa> — место, где разработчики регистрируют приложения для TikTok Shop Open Platform. Собственный обзор TikTok описывает TTS API как доступ к «authorized TikTok Shop data, including catalogs, orders, shipments, payments, and more» («авторизованным данным TikTok Shop, включая каталоги, заказы, отправки, платежи и другое»). Среди категорий — Product, Order, Fulfillment, Return &amp; Refund, Logistics, Promotion, Finance, Seller, Authorization, Events, Data Reconciliation и Supply Chain API.\u003C\u002Fp>\n\n\u003Cp>Ключевое слово здесь — \u003Cem>авторизованным\u003C\u002Fem>. В документации перечислены три типа авторизации: продавец (магазин даёт вашему приложению доступ), автор и партнёр. Каждый из них требует согласия владельца данных. Если вы продавец или разработчик инструмента, чьи клиенты — продавцы, это лучшие данные, какие можно получить: точные цены, реальные остатки и реальное число заказов по этим магазинам. Но посмотреть на магазины, которые не подключили ваше приложение, так нельзя. В документации также \u003Ca href=\"https:\u002F\u002Fpartner.tiktokshop.com\u002Fdocv2\u002Fpage\u002Fregions-and-languages\" rel=\"noopener noreferrer\">перечислены поддерживаемые регионы и локали\u003C\u002Fa> с пометкой, что доступность меняется по мере открытия рынков.\u003C\u002Fp>\n\n\u003Ch3>TikTok Research API, в котором есть данные магазинов ЕС\u003C\u002Fh3>\n\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fdevelopers.tiktok.com\u002Fproducts\u002Fresearch-api\" rel=\"noopener noreferrer\">TikTok Research API\u003C\u002Fa> известен в основном публичными видео, комментариями и аккаунтами. Но в нём есть и три эндпоинта TikTok Shop, которые многие упускают. Эндпоинт \u003Ca href=\"https:\u002F\u002Fdevelopers.tiktok.com\u002Fdocs\u002Fen\u002Fresearch-api-specs-query-tiktok-shop-info\" rel=\"noopener noreferrer\">shop info\u003C\u002Fa> возвращает рейтинг магазина, количество отзывов, число проданных товаров и показатель эффективности. Эндпоинт \u003Ca href=\"https:\u002F\u002Fdevelopers.tiktok.com\u002Fdocs\u002Fen\u002Fresearch-api-specs-query-tiktok-shop-products\" rel=\"noopener noreferrer\">shop products\u003C\u002Fa> возвращает название товара, цену, описание, число продаж, количество отзывов и распределение оценок от 1 до 5 звёзд. Эндпоинт \u003Ca href=\"https:\u002F\u002Fdevelopers.tiktok.com\u002Fdocs\u002Fen\u002Fresearch-api-specs-query-tiktok-shop-reviews\" rel=\"noopener noreferrer\">product reviews\u003C\u002Fa> возвращает текст отзыва, оценку и метки времени. Все три ограничены магазинами и товарами, доступными в ЕС, и возвращают не более 10 результатов за вызов.\u003C\u002Fp>\n\n\u003Cp>Подвох — в требованиях к участникам. Доступ получают академические учреждения из США, ЕЭЗ, Великобритании, Канады и Швейцарии, некоммерческие исследовательские организации в ЕС и некоторые бразильские учреждения, изучающие безопасность молодёжи. Заявители должны быть «independent of commercial interests» («независимы от коммерческих интересов»). \u003Ca href=\"https:\u002F\u002Fdevelopers.tiktok.com\u002Fdocs\u002Fen\u002Fresearch-api-faq\" rel=\"noopener noreferrer\">FAQ по Research API\u003C\u002Fa> указывает стандартную квоту в 1000 запросов в день. Университетской группе, изучающей социальную коммерцию в ЕС, стоит подать заявку; ценовая команда бренда под условия не подходит и не должна пользоваться чужим исследовательским доступом.\u003C\u002Fp>\n\n\u003Ch3>Лицензированные данные от аналитических сервисов\u003C\u002Fh3>\n\n\u003Cp>Существует целая категория аналитических продуктов для TikTok Shop, которые продают рейтинги товаров, оценки продаж, связи авторов с товарами и тренды по категориям через дашборд или API. Перед покупкой задайте три вопроса. Какие рынки покрыты? Цифры продаж наблюдаемые или смоделированные? Можно ли распространять данные внутри компании? Если сервис не может объяснить, откуда берутся его цифры, он продаёт вам оценки, и относиться к ним стоит именно так.\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\u003Ctr>\u003Cth>Путь\u003C\u002Fth>\u003Cth>Кто может получить\u003C\u002Fth>\u003Cth>Что покрывает\u003C\u002Fth>\u003Cth>Данные конкурентов?\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>TTS API (Partner Center)\u003C\u002Ftd>\u003Ctd>Продавцы и разработчики приложений, авторизованные продавцами, авторами или партнёрами\u003C\u002Ftd>\u003Ctd>Полный каталог, цены, остатки, заказы, акции, финансы авторизованных магазинов\u003C\u002Ftd>\u003Ctd>Нет, только магазины, подключившие ваше приложение\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Research API, эндпоинты TikTok Shop\u003C\u002Ftd>\u003Ctd>Одобренные некоммерческие исследователи\u003C\u002Ftd>\u003Ctd>Магазины ЕС: рейтинг и продажи магазина, цена товара и число продаж, отзывы\u003C\u002Ftd>\u003Ctd>Да, но только для некоммерческих исследований\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Аналитические сервисы\u003C\u002Ftd>\u003Ctd>Любой, кто платит\u003C\u002Ftd>\u003Ctd>Рейтинги, оценки продаж, связи с авторами, история\u003C\u002Ftd>\u003Ctd>Да, в рамках лицензии; точность разная\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Публичные страницы товаров\u003C\u002Ftd>\u003Ctd>Любой, кто находится в обслуживаемом рынке\u003C\u002Ftd>\u003Ctd>То, что страница показывает незалогиненному посетителю\u003C\u002Ftd>\u003Ctd>Да, с учётом ToS и robots.txt\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Ch2>Публичные страницы TikTok Shop: что доступно в открытом вебе\u003C\u002Fh2>\n\n\u003Cp>TikTok Shop — в основном внутриприложенческий опыт, но есть и браузерная витрина на \u003Ccode>shop.tiktok.com\u003C\u002Fcode>, организованная по рынкам, со страницами товаров по пути \u003Ccode>\u002Fpdp\u002F\u003C\u002Fcode>. Какой рынок вы видите, зависит от того, откуда вы подключаетесь. Когда мы запросили URL \u003Ccode>www.tiktok.com\u002Fshop\u002Fpdp\u002F…\u003C\u002Fcode> с сервера в Германии, он вернул редирект 301 на \u003Ccode>shop.tiktok.com\u002Fde\u002Fpdp\u002F…\u003C\u002Fcode>. Голый путь \u003Ccode>www.tiktok.com\u002Fshop\u003C\u002Fcode>, запрошенный с той же машины, редиректил на \u003Ccode>shop.tiktok.com\u002Fus\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Cp>О покрытии рынков: в ньюсруме TikTok объявили, что \u003Ca href=\"https:\u002F\u002Fnewsroom.tiktok.com\u002Ftiktok-shop-expands-across-europe?lang=en-150\" rel=\"noopener noreferrer\">Австрия, Бельгия, Нидерланды и Польша запустятся 15 июня 2026 года\u003C\u002Fa> и присоединятся к Франции, Германии, Ирландии, Италии, Испании и Великобритании. Список регионов в Partner Center (последнее обновление 6 июля 2026 года) также включает США, Мексику, Бразилию, Японию, Индонезию, Малайзию, Филиппины, Сингапур, Таиланд и Вьетнам. Итого 20 рынков с официальным источником. Сторонние списки называют больше, но подтвердить их по собственным страницам TikTok мы не смогли, поэтому здесь они не учтены.\u003C\u002Fp>\n\n\u003Cp>Для сбора из этого следуют три вещи:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>География определяет, что вы видите. У одного и того же товара на каждом рынке могут быть разные цена, валюта, наличие или продавец, а может не быть его вовсе. Чтобы собрать британскую витрину, трафик должен идти из Великобритании. Это главная причина, по которой здесь важны резидентные IP с таргетингом по стране, например \u003Ccode>USERNAME-country-GB\u003C\u002Fcode> на \u003Ca href=\"\u002Fru\u002Fproxy\u002Fresidential\">резидентном прокси\u003C\u002Fa>. К маскировке это не имеет отношения.\u003C\u002Fli>\n\u003Cli>Страницы сильно зависят от JavaScript. Витрина — это приложение с рендерингом на клиенте. Заголовки ответов \u003Ccode>shop.tiktok.com\u003C\u002Fcode> включают \u003Ccode>x-processed-by: Modern.js\u003C\u002Fcode> — это open-source веб-фреймворк ByteDance. Рассчитывайте на то, что понадобится настоящий браузер.\u003C\u002Fli>\n\u003Cli>Есть промежуточная страница. С нашего тестового сервера в дата-центре и \u003Ccode>shop.tiktok.com\u002Fde\u003C\u002Fcode>, и \u003Ccode>shop.tiktok.com\u002Frobots.txt\u003C\u002Fcode> вернули HTML-страницу с заголовком «Security Check», которая загружает скрипт CAPTCHA. На этом мы остановились. Решение или обход этого челленджа выходят за рамки статьи, и если ваш сборщик раз за разом на него натыкается, правильная реакция — замедлиться или остановиться.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Где лежат данные на странице товара\u003C\u002Fh2>\n\n\u003Cp>На современных витринах нужные поля редко лежат в аккуратном HTML. Обычно они находятся в одном из трёх мест, в порядке убывания стабильности: блок JSON-LD по схеме \u003Ca href=\"https:\u002F\u002Fschema.org\u002FProduct\" rel=\"noopener noreferrer\">schema.org Product\u002FOffer\u003C\u002Fa> (публикуется для поисковиков, см. \u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct\" rel=\"noopener noreferrer\">документацию Google по разметке товаров\u003C\u002Fa>), мета-теги Open Graph и товарные мета-теги, а также встроенное состояние гидратации фреймворка — большой JSON внутри тега \u003Ccode>&lt;script&gt;\u003C\u002Fcode>, который приложение использует для рендеринга без дополнительного запроса.\u003C\u002Fp>\n\n\u003Cp>Приём простой: читайте то, что страница уже вам отправила. JSON-LD и мета-теги разбирайте как документированные форматы. Для состояния гидратации составьте перечень JSON-блоков (их ID и размеры), сами посмотрите один из них в браузере и сопоставьте только нужные поля. Две вещи явно вне рамок: вызов приватных XHR-эндпоинтов, которые приложение использует под капотом, и воспроизведение их параметров подписи или токенов. Подделка подписей — это обход защиты, а не сбор данных. Загрузить страницу товара с тестовой машины нам не удалось (см. промежуточную страницу выше), поэтому утверждать, что на страницах TikTok Shop есть JSON-LD, мы не будем. Код ниже работает одинаково в обоих случаях.\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\u003Ctr>\u003Cth>Показатель\u003C\u002Fth>\u003Cth>Где обычно находится\u003C\u002Fth>\u003Cth>Надёжность\u003C\u002Fth>\u003Cth>Примечания\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Название товара\u003C\u002Ftd>\u003Ctd>JSON-LD \u003Ccode>name\u003C\u002Fcode>, \u003Ccode>og:title\u003C\u002Fcode>, состояние гидратации\u003C\u002Ftd>\u003Ctd>Высокая\u003C\u002Ftd>\u003Ctd>Может быть локализовано под рынок; используйте как ключ ID товара, а не название\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Текущая цена\u003C\u002Ftd>\u003Ctd>JSON-LD \u003Ccode>offers.price\u003C\u002Fcode>, состояние гидратации\u003C\u002Ftd>\u003Ctd>Средняя\u003C\u002Ftd>\u003Ctd>Зависит от рынка, варианта и акции; всегда сохраняйте валюту\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Базовая цена \u002F скидка\u003C\u002Ftd>\u003Ctd>Состояние гидратации; в JSON-LD редко\u003C\u002Ftd>\u003Ctd>Ниже средней\u003C\u002Ftd>\u003Ctd>Зачёркнутые цены задаёт продавец; считайте скидки сами\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Число продаж\u003C\u002Ftd>\u003Ctd>Состояние гидратации, видимая подпись; Research API (ЕС)\u003C\u002Ftd>\u003Ctd>От низкой до средней\u003C\u002Ftd>\u003Ctd>Подписи часто сокращены; используйте как тренд, а не как аудированные продажи\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Рейтинг, количество отзывов\u003C\u002Ftd>\u003Ctd>JSON-LD \u003Ccode>aggregateRating\u003C\u002Fcode>, состояние гидратации\u003C\u002Ftd>\u003Ctd>Средняя\u003C\u002Ftd>\u003Ctd>Отзывы могут считаться по-разному на разных рынках; в Research API есть распределение оценок для ЕС\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Название \u002F ID магазина\u003C\u002Ftd>\u003Ctd>Состояние гидратации, видимый блок продавца\u003C\u002Ftd>\u003Ctd>Высокая\u003C\u002Ftd>\u003Ctd>Сохраняйте ID; названия магазинов меняются\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Категория\u003C\u002Ftd>\u003Ctd>JSON-LD хлебных крошек, состояние гидратации\u003C\u002Ftd>\u003Ctd>Средняя\u003C\u002Ftd>\u003Ctd>Деревья категорий различаются по рынкам; сопоставляйте их с собственной таксономией\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Варианты \u002F SKU\u003C\u002Ftd>\u003Ctd>Состояние гидратации\u003C\u002Ftd>\u003Ctd>Средняя\u003C\u002Ftd>\u003Ctd>Диапазоны цен скрывают цену варианта, который покупатели выбирают на самом деле\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Ссылки авторов \u002F партнёров\u003C\u002Ftd>\u003Ctd>В основном в приложении; частично в состоянии гидратации\u003C\u002Ftd>\u003Ctd>Низкая в вебе\u003C\u002Ftd>\u003Ctd>Персональные данные; здесь обычно лучше данные сервисов или партнёров\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Ch2>Аккуратная схема сбора\u003C\u002Fh2>\n\n\u003Cp>Исследовательский сборщик должен вести себя как медленный и честный посетитель. Это значит: по одной странице за раз, фиксированный набор URL, агрессивное кеширование и остановка при челленджах. Условия и правила robots у TikTok обозначают границы яснее, чем у большинства сайтов, так что начнём с них.\u003C\u002Fp>\n\n\u003Ch3>Что на самом деле говорят robots.txt и условия\u003C\u002Fh3>\n\n\u003Cp>\u003Ccode>www.tiktok.com\u002Frobots.txt\u003C\u002Fcode> (получен 3 октября 2026 года) запрещает \u003Ccode>\u002Fshop\u002Fview\u002Fproduct\u002F\u003C\u002Fcode> для всех user agent и закрывает весь сайт для поименного списка краулеров, в который входят GPTBot, ClaudeBot, CCBot, PerplexityBot и Bytespider. Путь \u003Ccode>\u002Fshop\u002Fpdp\u002F\u003C\u002Fcode> в нём не упоминается, строки Sitemap нет. Прочитать \u003Ccode>shop.tiktok.com\u002Frobots.txt\u003C\u002Fcode> с тестовой машины мы не смогли, потому что вместо него вернулась HTML-страница челленджа. Это ловушка: \u003Ccode>urllib.robotparser\u003C\u002Fcode> в Python разбирает HTML-страницу как «нет правил», то есть «разрешено всё». Код ниже доверяет только ответу 200 с обычным текстом.\u003C\u002Fp>\n\n\u003Cp>Условия строже, чем robots.txt. \u003Ca href=\"https:\u002F\u002Fwww.tiktok.com\u002Flegal\u002Fpage\u002Fus\u002Fterms-of-service\u002Fen\" rel=\"noopener noreferrer\">Условия использования для США\u003C\u002Fa> (соглашение с TikTok USDS Joint Venture LLC, последнее обновление 15 июля 2026 года) запрещают скрейпинг или извлечение данных «for any purpose, from the Platform using any automated system or software… except as approved in writing» («с любой целью, с Платформы с помощью любой автоматизированной системы или программы… кроме случаев письменного одобрения»). \u003Ca href=\"https:\u002F\u002Fwww.tiktok.com\u002Flegal\u002Fpage\u002Feea\u002Fterms-of-service\u002Fen\" rel=\"noopener noreferrer\">Условия для ЕЭЗ\u003C\u002Fa> говорят примерно то же. Обязывают ли они незалогиненного посетителя, зависит от юрисдикции, но это веская причина предпочесть официальные и лицензированные пути.\u003C\u002Fp>\n\n\u003Ch3>Правила проектирования и их причины\u003C\u002Fh3>\n\n\u003Col>\n\u003Cli>\u003Cstrong>Начинайте с известного списка URL, а не с обхода.\u003C\u002Fstrong> Исследовательские вопросы касаются конкретных товаров или выборки. Именно при обходе страниц поиска и категорий накапливаются нагрузка и риски по ToS, да и robots.txt у TikTok всё равно запрещает пути \u003Ccode>\u002Fsearch?\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Один рынок на прогон, и зафиксируйте его.\u003C\u002Fstrong> Таргетируйте выходной IP по стране и выставьте в браузере соответствующие локаль и часовой пояс, чтобы все наблюдения в пакете относились к одному рынку.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Держите низкую частоту.\u003C\u002Fstrong> Одной страницы раз в 20–40 секунд на рынок с лихвой хватает для ежедневных ценовых снимков нескольких сотен товаров.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Кешируйте по ключу (ID товара, рынок, день).\u003C\u002Fstrong> Если сегодняшнее британское наблюдение уже есть, не запрашивайте его снова.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Считайте челлендж сигналом остановки.\u003C\u002Fstrong> Залогируйте его, подождите и снизьте частоту. Не ротируйте IP, чтобы обойти ту же блокировку.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Не логиньтесь.\u003C\u002Fstrong> Собирайте только то, что видит незалогиненный посетитель. Сбор под логином привязывает автоматизацию к аккаунту и его условиям и затрагивает персональные данные.\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Ch2>Аккуратный пример на Python с Playwright\u003C\u002Fh2>\n\n\u003Cp>Скрипт ниже открывает каждый URL товара в Chromium через прокси с таргетингом по стране. Сначала он проверяет настоящий robots.txt, останавливается на ответах, отличных от 200, или на заголовке «Security Check» и извлекает данные Product из JSON-LD, несколько мета-тегов и список встроенных JSON-блоков для ручного изучения. Специфичных для TikTok селекторов в нём нет, потому что проверить их мы не смогли, и каждое отсутствующее поле возвращается как \u003Ccode>None\u003C\u002Fcode>. Настройки прокси соответствуют \u003Ca href=\"https:\u002F\u002Fplaywright.dev\u002Fpython\u002Fdocs\u002Fnetwork#http-proxy\" rel=\"noopener noreferrer\">документированной опции proxy в Playwright\u003C\u002Fa>. Логику извлечения и обработки robots мы проверили на локальных фикстурах с Playwright 1.55. На живых страницах TikTok Shop мы его не запускали.\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode class=\"language-python\">import json\nimport random\nimport time\nimport urllib.robotparser\nfrom urllib.parse import urlsplit\n\nfrom playwright.sync_api import sync_playwright\n\n# Страна задаётся в имени пользователя прокси; локаль и часовой пояс подстройте под неё.\nPROXY = {\n    \"server\": \"http:\u002F\u002Fgate.proxyhat.com:8080\",\n    \"username\": \"USERNAME-country-GB\",\n    \"password\": \"PASSWORD\",\n}\nUA_NAME = \"acme-price-research\"  # токен, который стоит искать в группах robots.txt\n\n# URL товаров, которые у вас уже есть (из сопоставления с вашим каталогом, выгрузки\n# партнёра или ручного исследования), а не найденные обходом страниц поиска.\nURLS = [\n    \"https:\u002F\u002Fshop.tiktok.com\u002F...\",  # вставьте реальные URL товаров так, как их показывает браузер\n]\n\n\ndef robots_verdict(context, url):\n    \"\"\"Return True\u002FFalse from a real robots.txt, or None if we couldn't get one.\"\"\"\n    parts = urlsplit(url)\n    resp = context.request.get(f\"{parts.scheme}:\u002F\u002F{parts.netloc}\u002Frobots.txt\")\n    ctype = resp.headers.get(\"content-type\", \"\")\n    # HTML-страница челленджа разбирается в urllib.robotparser как «нет правил»\n    # (= разрешено всё), поэтому доверяем только ответу 200 с text\u002Fplain.\n    if resp.status != 200 or \"text\u002Fplain\" not in ctype:\n        return None\n    rp = urllib.robotparser.RobotFileParser()\n    rp.parse(resp.text().splitlines())\n    return rp.can_fetch(UA_NAME, url)\n\n\ndef _types(node):\n    t = node.get(\"@type\", [])\n    return t if isinstance(t, list) else [t]\n\n\ndef extract(page):\n    \"\"\"Read what the page itself publishes: JSON-LD, Open Graph\u002Fproduct meta,\n    and an inventory of embedded JSON blobs for a human to inspect.\"\"\"\n    jsonld = []\n    for raw in page.locator('script[type=\"application\u002Fld+json\"]').all_text_contents():\n        try:\n            data = json.loads(raw)\n        except json.JSONDecodeError:\n            continue\n        nodes = data if isinstance(data, list) else data.get(\"@graph\", [data])\n        jsonld.extend(n for n in nodes if isinstance(n, dict))\n\n    meta = {}\n    for prop in (\"og:title\", \"og:url\", \"product:price:amount\", \"product:price:currency\"):\n        loc = page.locator(f'meta[property=\"{prop}\"]')\n        if loc.count():\n            meta[prop] = loc.first.get_attribute(\"content\")\n\n    blobs = page.evaluate(\n        \"\"\"() =&gt; [...document.querySelectorAll('script[type=\"application\u002Fjson\"]')]\n                 .map(s =&gt; ({id: s.id || null, chars: s.textContent.length}))\"\"\"\n    )\n\n    product = next((n for n in jsonld if \"Product\" in _types(n)), None)\n    record = {\"name\": None, \"price\": None, \"currency\": None,\n              \"availability\": None, \"rating\": None, \"review_count\": None}\n    if product:\n        record[\"name\"] = product.get(\"name\")\n        offers = product.get(\"offers\") or {}\n        if isinstance(offers, list):\n            offers = offers[0] if offers else {}\n        record[\"price\"] = offers.get(\"price\") or offers.get(\"lowPrice\")\n        record[\"currency\"] = offers.get(\"priceCurrency\")\n        record[\"availability\"] = offers.get(\"availability\")\n        agg = product.get(\"aggregateRating\") or {}\n        record[\"rating\"] = agg.get(\"ratingValue\")\n        record[\"review_count\"] = agg.get(\"reviewCount\") or agg.get(\"ratingCount\")\n    return {\"record\": record, \"meta\": meta, \"json_blobs\": blobs,\n            \"has_jsonld_product\": product is not None}\n\n\ndef main():\n    results = []\n    with sync_playwright() as p:\n        browser = p.chromium.launch(proxy=PROXY)\n        context = browser.new_context(locale=\"en-GB\", timezone_id=\"Europe\u002FLondon\")\n        page = context.new_page()\n        for url in URLS:\n            verdict = robots_verdict(context, url)\n            if verdict is not True:\n                results.append({\"url\": url, \"status\": \"skipped\", \"robots\": verdict})\n                continue\n            resp = page.goto(url, wait_until=\"domcontentloaded\", timeout=45_000)\n            status = resp.status if resp else None\n            if status != 200 or page.title().strip().lower() == \"security check\":\n                # Не пытаемся его решать. Записываем, замедляемся, идём дальше.\n                results.append({\"url\": url, \"status\": \"challenge_or_error\", \"http\": status})\n                time.sleep(120)\n                continue\n            data = extract(page)\n            data.update({\"url\": url, \"final_url\": page.url, \"status\": \"ok\",\n                         \"fetched_at\": time.strftime(\"%Y-%m-%dT%H:%M:%SZ\", time.gmtime()),\n                         \"proxy_country\": \"GB\"})\n            results.append(data)\n            time.sleep(random.uniform(20, 40))  # по одной странице за раз, медленно\n        browser.close()\n    print(json.dumps(results, indent=2, ensure_ascii=False))\n\n\nif __name__ == \"__main__\":\n    main()\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Если \u003Ccode>has_jsonld_product\u003C\u002Fcode> возвращается как false, посмотрите на \u003Ccode>json_blobs\u003C\u002Fcode>. Откройте один товар в обычном браузере, найдите блок, в котором лежит цена, и напишите небольшое явное сопоставление для двух-трёх нужных ключей. Добавьте тест, который громко падает, когда эти ключи переезжают. Более широкий взгляд на сторону JavaScript — в статье о \u003Ca href=\"\u002Fru\u002Fblog\u002Fskraping-saytov-s-javascript\">скрейпинге сайтов, перегруженных JavaScript\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Подводные камни качества данных\u003C\u002Fh2>\n\n\u003Cp>Большинство датасетов по TikTok Shop портятся на этапе анализа, а не сбора. Цены сравнивают между рынками без нормализации, акционные цены принимают за базовые, а округлённые числа продаж — за показатели продаж.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Регион и валюта. В каждой строке храните рынок, валюту и страну выхода. Конвертируйте валюты по курсу на дату наблюдения и никогда не усредняйте цены между рынками.\u003C\u002Fli>\n\u003Cli>Флеш-распродажи и акции. Короткие акции могут на часы сдвинуть отображаемую цену. Делайте снимки в одно и то же время каждый день и записывайте и показанную цену, и базовую, чтобы распродажу не приняли за постоянное снижение.\u003C\u002Fli>\n\u003Cli>Округление числа продаж. Отображаемые числа часто сокращены, и даже точное целое в данных страницы — это цифра платформы, а не аудированное значение. Используйте разницу во времени и ожидайте ступенек, а не плавных кривых.\u003C\u002Fli>\n\u003Cli>Каталоги под конкретный рынок. Товар, которого нет на одном рынке, не обязательно закончился. Возможно, его там просто не продают. Разделяйте «недоступен на рынке» и «нет в наличии».\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Те же проблемы встречаются и на других маркетплейсах, о которых мы писали. В \u003Ca href=\"\u002Fru\u002Fblog\u002Fskrejping-shein-v-masshtabe-2026\">руководстве по ценовой аналитике Shein\u003C\u002Fa> разобраны региональные витрины, в \u003Ca href=\"\u002Fru\u002Fblog\u002Fkak-skrejpit-tovary-ceny-temu-2026\">руководстве по данным товаров Temu\u003C\u002Fa> — встроенный JSON, а в \u003Ca href=\"\u002Fru\u002Fblog\u002Fproksi-dlya-skrapinga-shopify\">руководстве по Shopify\u003C\u002Fa> — документированные публичные эндпоинты товаров, что полезно для сравнения с платформами, где их нет.\u003C\u002Fp>\n\n\u003Ch2>Правовые и этические границы\u003C\u002Fh2>\n\n\u003Cp>Публичные карточки товаров — наименее рискованная часть этого датасета. Авторы — самая рискованная. Цена товара — коммерческая информация, а никнейм автора, его профиль и партнёрская активность являются персональными данными по \u003Ca href=\"https:\u002F\u002Feur-lex.europa.eu\u002Feli\u002Freg\u002F2016\u002F679\u002Foj\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa>, если относятся к идентифицируемому человеку. Для работы в ЕС или Великобритании их сбор требует законного основания, минимизации данных и ограничения срока хранения, даже если профиль публичный. Где можно, агрегируйте — например, «товары, которые продвигают более 50 авторов», — вместо того чтобы строить профили отдельных людей.\u003C\u002Fp>\n\n\u003Cp>Сверху ложатся условия TikTok, процитированные выше, и вопрос товарных знаков: описывайте TikTok Shop фактически и не выдавайте свой датасет или инструмент за связанный с ним. Если исследование коммерческое и постоянное, официальный или лицензированный путь почти всегда надёжнее в долгую. Сборщик публичных страниц лучше всего подходит для узких проверок небольшого объёма, которые официальные пути не покрывают, — например, чтобы подтвердить, что британский покупатель видит именно сегодня.\u003C\u002Fp>\n\n\u003Ch2>Чего этот подход не решает\u003C\u002Fh2>\n\n\u003Cp>Аккуратный сборщик публичных страниц не даст полного покрытия категорий, атрибуции авторов, продаж в прямых эфирах или контента, доступного только в приложении. Он не пройдёт промежуточные страницы и не должен пытаться. За несколько месяцев он к тому же сломается по мере изменений фронтенда. Если вам нужно что-то из этого, это вопрос лицензирования данных, а не инженерии. Для сетевой части того, что остаётся, на нашей \u003Ca href=\"\u002Fru\u002Fuse-cases\u002Fweb-scraping\">странице о веб-скрейпинге\u003C\u002Fa> и в \u003Ca href=\"\u002Fru\u002Flocations\">списке локаций\u003C\u002Fa> указано, через какие страны можно направлять трафик.\u003C\u002Fp>","Данные о товарах TikTok Shop для исследований рынка | ProxyHat","Как получить данные о товарах TikTok Shop для анализа цен: Partner API, эндпоинты магазинов ЕС в Research API, лицензированные данные и аккуратный сбор.","\u002Fru\u002Fblog\u002Fdannye-tovarov-tiktok-shop-issledovanie",null,"Данные о товарах TikTok Shop для исследований рынка","Данные о товарах TikTok Shop для анализа цен: Partner API, эндпоинты магазинов ЕС в Research API, лицензированные данные и аккуратный сбор.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fru\u002Fdannye-tovarov-tiktok-shop-issledovanie-og.webp",[19,22,25,28,31],{"question":20,"answer":21},"Есть ли официальный API для данных о товарах TikTok Shop?","Да. TikTok Shop TTS API, доступный через Partner Center, отдаёт каталог, цены, остатки и заказы, но только по магазинам, авторам или партнёрам, которые авторизовали ваше приложение. Читать магазины конкурентов через него нельзя.",{"question":23,"answer":24},"Есть ли данные TikTok Shop в TikTok Research API?","Для ЕС — да. В Research API есть эндпоинты для информации о магазине, товаров магазина (включая цену и число продаж) и отзывов на товары, но только для магазинов и товаров, доступных в ЕС. Доступ есть только у одобренных некоммерческих исследователей, например академических учреждений и некоммерческих исследовательских организаций.",{"question":26,"answer":27},"Почему цены в TikTok Shop отличаются в другой стране?","У TikTok Shop отдельные витрины для каждого рынка, и запросы направляются на рынок по местоположению. Цена, валюта, продавец и наличие могут различаться, поэтому собирайте каждый рынок с IP в этой стране и сохраняйте рынок вместе с каждым наблюдением.",{"question":29,"answer":30},"Разрешают ли условия TikTok автоматический сбор со страниц TikTok Shop?","Условия TikTok для США и ЕЭЗ запрещают автоматическое извлечение данных без письменного одобрения, а robots.txt на www.tiktok.com запрещает \u002Fshop\u002Fview\u002Fproduct\u002F для всех краулеров. Для коммерческого использования предпочитайте официальные или лицензированные данные, а сбор с публичных страниц держите минимальным, медленным и без логина.",{"question":32,"answer":33},"Насколько точны числа продаж в TikTok Shop?","Их лучше считать ориентировочными. Отображаемые значения часто сокращены, и даже точные цифры сообщает сама платформа, а не аудитор. Используйте изменения во времени, чтобы замечать тренды, а не как данные о выручке.",[35,36,37,38,39],"TTS API отдаёт данные только магазинов, авторов или партнёров, авторизовавших ваше приложение, а не конкурентов.","Research API отдаёт данные магазинов, товаров, цен и продаж в ЕС, но только некоммерческим исследователям.","Витрины TikTok Shop отдельны для каждого рынка, поэтому собирайте каждую страну с IP в этой стране.","Читайте JSON-LD и встроенные данные страницы; приватные подписанные эндпоинты и челленджи не трогайте.","Условия TikTok запрещают автоматическое извлечение без одобрения, поэтому лучше официальные или лицензированные данные.",false,"2026-10-29T09:00:00+00:00","2026-10-29T09:00:19+00:00","2026-10-03T09:41:40+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fru\u002Fdannye-tovarov-tiktok-shop-issledovanie-master.webp","Collecting TikTok Shop Product Data for Market Research","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fru\u002Fdannye-tovarov-tiktok-shop-issledovanie-card.webp",16,{"name":49,"slug":50,"bio":51,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[53],{"id":54,"slug":55,"name":56,"description":14,"meta_title":57,"meta_description":58,"parent_id":14},5,"ecommerce-i-konkurentnyj-analiz","E-commerce и конкурентный анализ","Руководства по парсингу e-commerce | Блог ProxyHat","Руководства по парсингу данных интернет-магазинов, мониторингу цен и конкурентной разведке.",[60,64,68,72],{"id":61,"slug":62,"name":63},1,"veb-skraping","Веб-скрапинг",{"id":65,"slug":66,"name":67},14,"ecommerce","E-commerce",{"id":69,"slug":70,"name":71},15,"monitoring-tsen","Мониторинг цен",{"id":73,"slug":74,"name":75},18,"geotargeting","Геотаргетинг",{"ko":77,"zh":78,"tr":79,"ru":13,"en":80,"de":81,"x-default":80},"\u002Fko\u002Fblog\u002Ftiktok-shop-sangpum-data-sujip","\u002Fcn\u002Fblog\u002Ftiktok-shop-shangpin-shuju-caiji","\u002Ftr\u002Fblog\u002Ftiktok-shop-urun-verisi-pazar-arastirmasi","\u002Fblog\u002Ftiktok-shop-product-data-research","\u002Fde\u002Fblog\u002Ftiktok-shop-produktdaten-marktforschung",{"ko":77,"zh":78,"tr":79,"ru":13,"en":80,"de":81},2,[85,105,126,143],{"id":86,"slug":87,"title":88,"excerpt":89,"featured_image_url":90,"featured_image_alt":14,"card_image_url":91,"og_image_url":92,"published_at":93,"updated_at":94,"content_updated_at":95,"reading_time_minutes":96,"is_featured":40,"indexable":40,"views":97,"author":98,"categories":99,"tags":101},52,"geotargetirovannyi-monitoring-tsen","Геотаргетированный мониторинг цен: отслеживание цен по рынкам","Практическое руководство по настройке геотаргетированного мониторинга цен с помощью прокси. Узнайте, как парсить цены в разных регионах, избегать блокировок и сравнивать рынки.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fgeotargetirovannyi-monitoring-tsen-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fgeotargetirovannyi-monitoring-tsen-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fgeotargetirovannyi-monitoring-tsen-og.webp","2026-02-26T03:50:37+00:00","2026-07-19T03:13:07+00:00","2026-10-03T08:57:47+00:00",9,34,{"name":49,"slug":50,"bio":51,"avatar_url":14,"website_url":14,"social_links":14},[100],{"id":54,"slug":55,"name":56,"description":14,"meta_title":57,"meta_description":58,"parent_id":14},[102,103,104],{"id":65,"slug":66,"name":67},{"id":69,"slug":70,"name":71},{"id":73,"slug":74,"name":75},{"id":96,"slug":106,"title":107,"excerpt":108,"featured_image_url":109,"featured_image_alt":14,"card_image_url":110,"og_image_url":111,"published_at":112,"updated_at":94,"content_updated_at":113,"reading_time_minutes":114,"is_featured":4,"indexable":40,"views":115,"author":116,"categories":117,"tags":119},"proksi-dlya-skrapinga-ecommerce","Прокси для скрапинга данных интернет-магазинов: полное руководство","Узнайте, как использовать резидентные прокси для скрапинга e-commerce. Стратегии для Amazon, Shopify и Walmart, примеры кода на Python и Node.js, геотаргетированный мониторинг цен и масштабирование инфраструктуры.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-ecommerce-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-ecommerce-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-ecommerce-og.webp","2026-01-12T01:55:44+00:00","2026-02-25T22:54:26+00:00",17,197,{"name":49,"slug":50,"bio":51,"avatar_url":14,"website_url":14,"social_links":14},[118],{"id":54,"slug":55,"name":56,"description":14,"meta_title":57,"meta_description":58,"parent_id":14},[120,121,122,123],{"id":65,"slug":66,"name":67},{"id":69,"slug":70,"name":71},{"id":61,"slug":62,"name":63},{"id":83,"slug":124,"name":125},"rezidentskie-proksi","Резидентские прокси",{"id":127,"slug":128,"title":129,"excerpt":130,"featured_image_url":131,"featured_image_alt":14,"card_image_url":132,"og_image_url":133,"published_at":134,"updated_at":94,"content_updated_at":135,"reading_time_minutes":96,"is_featured":40,"indexable":40,"views":136,"author":137,"categories":138,"tags":140},40,"infrastruktura-monitoringa-tsen-realtime","Инфраструктура мониторинга цен в реальном времени: практическое руководство","Узнайте, как построить надёжную инфраструктуру мониторинга цен в реальном времени с резидентными прокси ProxyHat. Архитектура, код, сравнение типов прокси и лучшие практики.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Finfrastruktura-monitoringa-tsen-realtime-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Finfrastruktura-monitoringa-tsen-realtime-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Finfrastruktura-monitoringa-tsen-realtime-og.webp","2026-02-13T13:33:22+00:00","2026-10-03T08:29:53+00:00",63,{"name":49,"slug":50,"bio":51,"avatar_url":14,"website_url":14,"social_links":14},[139],{"id":54,"slug":55,"name":56,"description":14,"meta_title":57,"meta_description":58,"parent_id":14},[141,142],{"id":65,"slug":66,"name":67},{"id":69,"slug":70,"name":71},{"id":144,"slug":145,"title":146,"excerpt":147,"featured_image_url":148,"featured_image_alt":14,"card_image_url":149,"og_image_url":150,"published_at":151,"updated_at":94,"content_updated_at":152,"reading_time_minutes":96,"is_featured":40,"indexable":40,"views":153,"author":154,"categories":155,"tags":157},26,"proksi-dlya-skrapinga-shopify","Как парсить магазины Shopify с помощью прокси: полное руководство","Узнайте, как парсить данные магазинов Shopify через JSON API эндпоинты и резидентные прокси. Полные примеры кода на Python и Node.js для извлечения товаров, цен и данных о наличии.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-shopify-master.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-shopify-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog\u002Fproksi-dlya-skrapinga-shopify-og.webp","2026-01-30T00:06:37+00:00","2026-10-03T08:21:26+00:00",762,{"name":49,"slug":50,"bio":51,"avatar_url":14,"website_url":14,"social_links":14},[156],{"id":54,"slug":55,"name":56,"description":14,"meta_title":57,"meta_description":58,"parent_id":14},[158,159],{"id":65,"slug":66,"name":67},{"id":61,"slug":62,"name":63},[]]