Комментарии к публичному видео на TikTok, это окно в реакцию аудитории: язык, который она использует, тональность высказываний и повторяющиеся темы. Исследователи, аналитики и контент-команды читают этот сигнал в совокупности, чтобы понять тренды, а не для отслеживания конкретных авторов комментариев. В этом руководстве показано, как парсить публичные комментарии TikTok с помощью Python так, чтобы это действительно работало с JavaScript-рендеренной страницей.
Сразу уточним: всё, что описано здесь, ограничено публичными комментариями к публичным видео. Цель, агрегированный анализ: текст комментариев, количество лайков и ответов, которые можно обобщить в тематические и тональные сводки. Речь не о создании профилей отдельных авторов комментариев. Имена пользователей и тексты комментариев являются персональными данными, поэтому всё руководство обращается с ними бережно, а раздел о правовых аспектах в конце охватывает правила, прежде чем применять это к чему-либо реальному. Если сначала вы хотите ознакомиться с более широким руководством, смотрите нашу статью о парсинге TikTok.
Что вы создадите
Небольшой Python-скрипт, который принимает публичный URL видео TikTok, получает полностью отрисованную страницу через Crawling API с JavaScript-токеном, прокручивает страницу для загрузки дополнительных комментариев и извлекает несколько публичных, преимущественно агрегированных полей:
- Comment text, видимый текст каждого публичного комментария.
- Like count, суммарное количество лайков у комментария, а не данные о людях, которые их поставили.
- Reply count, суммарное количество ответов на комментарий.
- Video metadata, публичный URL видео, к которому относятся комментарии, для указания источника.
Обратите внимание, чего намеренно нет в результатах анализа: никаких профилей авторов комментариев, данных о подписчиках, попыток связать имя пользователя с реальной личностью. Это персональные данные конкретных людей, и их сбор здесь намеренно не рассматривается. Мы считываем имя пользователя со страницы, поскольку оно присутствует в разметке, но раздел о конфиденциальности объясняет, почему не следует хранить или публиковать его в связке с личными данными.
Почему обычный запрос не работает на TikTok
Запросите публичный URL видео TikTok обычным HTTP-клиентом, и вы получите технически успешный, но практически пустой ответ. TikTok рендерит контент на стороне клиента: реальная разметка, включая комментарии, появляется только после того, как JavaScript страницы запускается в браузере и получает данные из внутренних точек доступа. Один статичный запрос никогда не выполнит этот JavaScript, поэтому нужных вам комментариев просто нет в теле ответа.
Кроме того, TikTok загружает комментарии асинхронно и по мере прокрутки, а также быстро выявляет трафик, характерный для скраперов. IP-диапазоны датацентров, отсутствие браузерного поведения и повторяющиеся паттерны запросов подвергаются ограничению скорости или проверке ещё до того, как загружается интересующий контент. Значит, рабочий скрапер комментариев должен решать в одном запросе две задачи: настоящий браузер, который рендерит и прокручивает страницу, и IP-адрес, который платформа воспринимает как обычного посетителя. Можно собрать это самостоятельно с помощью headless-браузера и пула ротирующихся резидентских прокси, но поддержание этого стека в рабочем состоянии, основная часть работы. Crawling API объединяет оба компонента в одном вызове: вы отправляете URL с JavaScript-токеном, он рендерит и прокручивает страницу за доверенным резидентским IP-адресом и возвращает готовый HTML для парсинга. Более подробно об основах этого подхода см. в статье о сканировании JavaScript-сайтов.
Crawlbase предлагает два типа токенов. Обычный токен получает статичный HTML; JavaScript (JS) токен сначала рендерит страницу в настоящем браузере. TikTok активно использует рендеринг на стороне клиента, поэтому здесь нужен JS-токен. Обычный токен возвращает ту же почти пустую оболочку, что и обычный запрос, в которой нет комментариев для парсинга.
Предварительные требования
Для начала необходимо подготовить несколько вещей. Ни одна не займёт много времени.
Базовые знания Python, HTML и CSS. Вы должны уметь запускать скрипт, устанавливать пакеты с помощью pip и читать CSS-селекторы, чтобы адаптировать селекторы комментариев при изменении разметки TikTok.
Python 3.8 или новее. Проверьте версию командой python --version. Если Python не установлен, установите его с сайта python.org и убедитесь, что pip доступен в PATH.
Аккаунт Crawlbase и JS-токен. Зарегистрируйтесь, откройте дашборд и скопируйте токен JavaScript (JS) со страницы документации аккаунта. Бесплатный уровень включает до 20 000 бесплатных запросов, чего достаточно для прохождения этого руководства. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.
Настройка проекта
Создайте изолированное виртуальное окружение, затем установите необходимые библиотеки.
python --version python -m venv tiktok_env source tiktok_env/bin/activate pip install crawlbase beautifulsoup4 pandas
В Windows активируйте окружение командой tiktok_env\Scripts\activate вместо строки с source. Три зависимости выполняют всю работу: crawlbase, официальный клиент для Crawling API, beautifulsoup4 парсит возвращаемый HTML, позволяя извлекать поля по селекторам, а pandas помогает агрегировать результаты для последующего анализа.
Шаг 1: Получение отрисованной страницы видео
Начните с получения готовой страницы. Импортируйте CrawlingAPI, инициализируйте его вашим JS-токеном и запросите публичный URL видео. Для цели, рендеринг которой происходит на стороне клиента, важны два параметра: ajax_wait указывает API дождаться завершения загрузки асинхронного контента, а page_wait выдерживает фиксированное количество миллисекунд, чтобы поздно рендеримые комментарии появились до захвата страницы. Проверка статуса перед парсингом позволяет сразу замечать ошибки.
from crawlbase import CrawlingAPI crawling_api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) options = { "ajax_wait": "true", "page_wait": 10000, "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", } def fetch_html(url): try: response = crawling_api.get(url, options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch. Crawlbase status: {response['headers']['cb_status']}") return None except Exception as e: print(f"An error occurred: {str(e)}") return None if __name__ == "__main__": video_url = "https://www.tiktok.com/@nasa/video/7255327059302419738" html = fetch_html(video_url) print(html[:500] if html else "No HTML returned")
Crawling API считывает cb_status (legacy pc_status) из заголовков ответа, который сообщает результат вышестоящего запроса независимо от прокси-транспорта. Десять секунд page_wait, разумная отправная точка для TikTok; увеличьте значение, если комментарии возвращаются пустыми. Пример указывает на аккаунт публичной организации именно потому, что он публичный и безличный. Запустите скрипт, и вы должны увидеть реальную отрисованную разметку, что подтверждает работу рендеринга ещё до написания первого селектора.
TikTok требует отрисованной, прокрученной страницы за доверенным IP-адресом в одном вызове. Crawling API принимает JS-токен, запускает страницу в настоящем браузере, прокручивает её для загрузки ленивых комментариев и ротирует резидентские IP-адреса на стороне сервера, что избавляет вас от необходимости самостоятельно управлять парком headless-браузеров и пулом прокси. Попробуйте на одном публичном видео на бесплатном уровне.
Шаг 2: Парсинг комментариев в структурированные данные
Получив отрисованный HTML, загрузите его в BeautifulSoup и извлеките публичные поля. TikTok размечает свои компоненты стабильными атрибутами data-e2e, которые намного надёжнее глубоко вложенных и часто переименовываемых CSS-классов. Список комментариев находится внутри контейнера комментариев; каждый элемент комментария содержит текст, количество лайков и количество ответов. Мы также считаем имя пользователя-автора видео из заголовка страницы для контекста атрибуции.
from bs4 import BeautifulSoup def text_or_none(node): return node.text.strip() if node else None def scrape_video_info(soup): username = soup.select_one("span[data-e2e='browse-username']") return {"Video Author": text_or_none(username)} def scrape_comments_listing(soup): return soup.select( "div[data-e2e='search-comment-container'] > " "div[class*='CommentListContainer'] > " "div[class*='DivCommentItemContainer']" ) def parse_comment(comment): text = comment.select_one( "div[class*='DivCommentContentContainer'] " "p[data-e2e='comment-level-1'] > span" ) likes = comment.select_one("div[class*='DivLikeContainer'] span") replies = comment.select_one("div[class*='DivReplyContainer']") return { "Comment Text": text_or_none(text), "Like Count": text_or_none(likes), "Reply Count": text_or_none(replies), }
Каждый вспомогательный метод защищён от отсутствующего узла: переименованный или отсутствующий элемент возвращает None, а не вызывает исключение. Селектор списка комментариев отражает вложенную структуру TikTok: контейнер комментариев, затем контейнер списка, затем отдельные элементы комментариев. Из каждого элемента мы извлекаем текст комментария, количество лайков и количество ответов. Последние два, агрегированные числа, именно тот не-персональный сигнал, который нужен для тематического и тонального анализа.
TikTok меняет разметку и обфусцированные имена классов без предупреждения, поэтому данный код опирается на стабильные атрибуты data-e2e и частичные совпадения class*=, а не на хрупкие точные классы. Когда поле возвращается как None, заново изучите страницу в инструментах разработчика браузера и обновите селектор. Периодическое обслуживание, норма для любого производственного скрапера.
Шаг 3: Обработка пагинации комментариев с прокруткой
TikTok использует бесконечную прокрутку для динамической загрузки комментариев, поэтому один рендер захватывает только первую партию. Crawling API предоставляет параметр scroll, который указывает headless-браузеру прокрутить страницу и загрузить больше контента перед возвратом. По умолчанию интервал прокрутки составляет 10 секунд; параметр scroll_interval позволяет его увеличить для загрузки большего количества партий комментариев. Добавьте эти параметры к запросу с пагинацией.
def fetch_html_with_scroll(url): scroll_options = { "ajax_wait": "true", "user_agent": options["user_agent"], "scroll": "true", "scroll_interval": 20000, } try: response = crawling_api.get(url, scroll_options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch. Crawlbase status: {response['headers']['cb_status']}") return None except Exception as e: print(f"An error occurred: {str(e)}") return None
scroll_interval в 20 секунд даёт ленивым комментариям время на рендеринг между прокрутками. Более длинные интервалы загружают больше комментариев, но увеличивают время ожидания на запрос, поэтому настройте параметр в зависимости от того, сколько партий вам действительно нужно. Держите объём скромным: для агрегированного анализа обычно достаточно репрезентативной выборки, и вам редко нужны все комментарии к видео.
Шаг 4: Сборка полного скрапера
Теперь соедините получение данных, прокрутку и парсинг в один рабочий скрипт. Он рендерит страницу видео с прокруткой, считывает публичного автора видео для контекста, парсит каждый загруженный комментарий в текст, количество лайков и количество ответов и выводит чистый JSON, пригодный для анализа.
import json from crawlbase import CrawlingAPI from bs4 import BeautifulSoup crawling_api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) options = { "ajax_wait": "true", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", } def fetch_html_with_scroll(url): scroll_options = {**options, "scroll": "true", "scroll_interval": 20000} try: response = crawling_api.get(url, scroll_options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch. Crawlbase status: {response['headers']['cb_status']}") return None except Exception as e: print(f"An error occurred: {str(e)}") return None def text_or_none(node): return node.text.strip() if node else None def scrape_comments_listing(soup): return soup.select( "div[data-e2e='search-comment-container'] > " "div[class*='CommentListContainer'] > " "div[class*='DivCommentItemContainer']" ) def parse_comment(comment): text = comment.select_one( "div[class*='DivCommentContentContainer'] " "p[data-e2e='comment-level-1'] > span" ) likes = comment.select_one("div[class*='DivLikeContainer'] span") replies = comment.select_one("div[class*='DivReplyContainer']") return { "Comment Text": text_or_none(text), "Like Count": text_or_none(likes), "Reply Count": text_or_none(replies), } def main(): video_url = "https://www.tiktok.com/@nasa/video/7255327059302419738" html = fetch_html_with_scroll(video_url) if not html: return soup = BeautifulSoup(html, "html.parser") comments = [parse_comment(c) for c in scrape_comments_listing(soup)] output = {"Video URL": video_url, "Comments": comments} print(json.dumps(output, indent=2, ensure_ascii=False)) if __name__ == "__main__": main()
Скрипт ключирует результат по URL видео, а не по конкретному человеку, что является правильным подходом по умолчанию для агрегированной работы. Каждая запись комментария содержит только текст и два счётчика. Если вы хотите сохранять результаты, запишите их в CSV или базу данных, но сначала прочитайте раздел о конфиденциальности: текст комментариев и имена пользователей, персональные данные, и вопрос о том, как долго вы их храните и что с ними делаете, является правовым, а не только техническим.
Как выглядит результат
Запустите полный скрипт и получите чистую запись публичных полей комментариев, готовую для обобщения в тональный или тематический анализ.
{ "Video URL": "https://www.tiktok.com/@nasa/video/7255327059302419738", "Comments": [ { "Comment Text": "this is incredible", "Like Count": "1243", "Reply Count": "18" }, { "Comment Text": "how was this filmed?", "Like Count": "87", "Reply Count": "4" } ] }
Дальнейший шаг, агрегирование. Группируйте текст комментариев для выявления общих тем, анализируйте тональность корпуса для оценки общей реакции и взвешивайте по количеству лайков и ответов, чтобы определить, какие настроения нашли отклик. Это покажет, как аудитория отреагировала на видео, не составляя досье на каждого конкретного автора комментария. Если вы планируете подавать данные в модель, наше руководство по структурированию и очистке данных, полученных веб-скрапингом, для AI и ML охватывает нормализацию и обезличивание текста перед обучением.
Как оставаться незаблокированным
Даже при обработке рендеринга Crawling API TikTok отслеживает трафик, характерный для скраперов. Несколько привычек помогают поддерживать работоспособность запуска; они применимы к любой трудной, хорошо защищённой цели.
- Дозируйте запросы. Рендеринг с прокруткой занимает больше времени, чем статические запросы, поэтому не запускайте их в тесном цикле. Оставляйте паузы и избегайте агрессивного параллелизма.
- Используйте ротацию. Пул резидентских IP-адресов распределяет запросы по множеству адресов реальных пользователей, не позволяя ни одному из них превысить лимит скорости. Crawling API берёт это на себя; если вы строите собственный стек, именно в эту часть стоит вкладываться.
- Читайте коды статусов. Запуск, который начинает возвращать проверки или ошибки, сигнализирует о том, что текущая скорость или уровень IP больше недостаточны. Замедляйтесь, а не усиливайте нагрузку.
- Держите объём низким. Репрезентативная выборка комментариев обычно достаточна для агрегированного анализа. Вам редко нужны все комментарии к вирусному видео.
Более подробный план действий см. в руководстве по обходу блокировок при скрапинге. Если вы предпочитаете маршрутизировать собственный трафик через ротирующийся пул вместо использования управляемого API, Smart AI Proxy предоставляет ту же резидентскую ротацию как прямой прокси-эндпоинт.
Законно ли парсить комментарии TikTok?
Этот раздел нужно прочитать перед написанием производственного кода. Скрапинг сам по себе не является незаконным, и публичные комментарии к публичному видео видны всем без входа в аккаунт. Однако Условия использования TikTok ограничивают автоматизированный сбор данных, а комментарии являются персональными данными: это контент, написанный идентифицируемыми людьми, часто привязанный к имени пользователя. Поэтому законность здесь зависит меньше от того, являются ли данные публичными, и больше от того, что вы собираете, зачем и что делаете с этим впоследствии. Ознакомьтесь с Условиями использования TikTok и файлом robots.txt и воспринимайте оба как границы того, что вы затрагиваете.
Если вы работаете с данными о людях в ЕС или Великобритании, применяется GDPR, а Калифорнийский закон CCPA распространяется на жителей Калифорнии. Оба рассматривают имена пользователей и написанные ими комментарии как персональные данные, даже если они публичны. На практике это означает необходимость законного основания для обработки данных, минимизацию хранимого объёма и соблюдение запросов на удаление и возражений. Наиболее безопасная позиция для подобной работы, агрегированный анализ: извлечение тональности, тем и счётчиков с последующим удалением или обезличиванием исходных комментариев и имён пользователей. Не создавайте профили отдельных авторов комментариев, не публикуйте повторно чужой комментарий в связке с его личностью и не храните имена пользователей, привязанные к выведенным вами мнениям о них. Скрипт в этом руководстве считывает имя пользователя, поскольку страница его раскрывает, но хранить его в связке с личными данными не следует.
Строго оставайтесь на публичной стороне и никогда не переходите её. Не парсите закрытые аккаунты, контент за логином, прямые сообщения или что-либо скрытое за подпиской. Не обходите аутентификацию или лимиты скорости и не распространяйте защищённые авторским правом видео или медиа. Для любого реального, постоянного или коммерческого использования правильным инструментом является официальный API TikTok, включая Research API при наличии квалификации. Это санкционированный путь, предоставляющий чётко определённые условия и структуру и позволяющий соблюдать правила TikTok. Данная статья является техническим руководством, ограниченным публичными комментариями для агрегированного анализа, а не одобрением массового сбора персональных данных.
Ключевые выводы
- TikTok рендерится на стороне клиента и защищён от ботов. Обычный запрос возвращает почти пустую оболочку без комментариев, поэтому необходимо рендерить и прокручивать страницу перед парсингом.
-
Рендеринг, прокрутка и доверенный IP должны быть в одном вызове. Crawling API с JS-токеном делает всё три;
ajax_wait,page_waitиscroll_intervalуправляют временем ожидания и загрузки. -
Парсите стабильные сигналы. Атрибуты
data-e2eTikTok и частичные совпаденияclass*=гораздо надёжнее хрупких обфусцированных имён классов. - Агрегируйте, а не профилируйте. Извлекайте текст комментариев, количество лайков и ответов для тонального и тематического анализа; никогда не создавайте профили отдельных авторов и не храните имена пользователей, привязанные к личным данным.
- Соблюдайте правила и предпочитайте официальный API. Условия использования TikTok ограничивают скрапинг, GDPR и CCPA рассматривают комментарии как персональные данные, а официальный API TikTok, санкционированный путь для всего реального.
Часто задаваемые вопросы
Почему обычный запрос не возвращает комментарии с TikTok?
Потому что TikTok рендерит контент на стороне клиента с помощью JavaScript и лениво загружает комментарии по мере прокрутки. Исходный HTML, это оболочка, которая заполняется только после запуска скриптов страницы в браузере, поэтому обычный HTTP-запрос возвращает почти пустое тело. Чтобы получить реальные публичные комментарии, необходимо рендерить и прокрутить страницу, что делают JS-токен и параметр scroll Crawling API.
Нужен обычный токен или JS-токен для TikTok?
JS-токен. Обычный токен получает статичный HTML, который на TikTok представляет собой ту же пустую оболочку, что и обычный запрос. JS-токен рендерит страницу в настоящем браузере перед возвратом HTML, поэтому элементы комментариев присутствуют при парсинге BeautifulSoup.
Как загрузить больше, чем первую партию комментариев?
Передайте scroll: "true" в Crawling API, чтобы headless-браузер прокрутил страницу и запустил бесконечную загрузку TikTok. Параметр scroll_interval в миллисекундах управляет временем ожидания между прокрутками; больший интервал загружает больше партий комментариев за счёт увеличения времени ожидания на запрос. Настройте параметр под нужное количество комментариев и держите объём скромным.
Какие данные комментариев TikTok безопасно собирать?
Только публичные комментарии к публичным видео, в идеале только в агрегированном виде: текст комментариев, обобщённый по темам и тональности, плюс количество лайков и ответов в виде чисел. Закрытые аккаунты, контент за логином, прямые сообщения и любые попытки профилирования отдельных авторов комментариев, вне допустимой области. Имена пользователей и текст комментариев, персональные данные, поэтому минимизируйте хранимый объём и по возможности обезличивайте данные.
Стоит ли использовать официальный API TikTok вместо скрапинга?
Для любого реального, постоянного или коммерческого использования, да. Официальный API TikTok, включая Research API при наличии квалификации, является санкционированным путём: он предоставляет чётко определённые условия, гарантированную структуру и позволяет соблюдать правила TikTok. Скрапинг небольшой выборки публичных комментариев подходит для лёгких агрегированных исследований без API-доступа при условии соблюдения условий использования, robots.txt, лимитов скорости и законодательства о конфиденциальности.
Как избежать блокировок при парсинге комментариев TikTok?
Держите скорость запросов на IP низкой, оставляйте паузы между рендерингами с прокруткой вместо их тесного цикличного выполнения, ограничивайте объём репрезентативной выборкой и маршрутизируйте через ротирующиеся резидентские IP-адреса, чтобы ни один адрес не превысил лимит скорости. Crawling API управляет ротацией и доверенным пулом IP для вас. Отслеживайте значения cb_status и замедляйтесь при первых признаках проверок. Более подробный обзор см. в нашей подборке лучших скраперов TikTok для сбора данных.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
