X.com (бывший Twitter) — один из лучших источников данных о том, чем живёт аудитория: какие темы обсуждает, что лайкает и на какие бренды реагирует. Через посты пользователей можно отследить тренды, понять настроение аудитории и даже подсмотреть, как работают конкуренты.
Но у официального API есть ограничения: часть данных недоступна, да и лимиты часто мешают. Поэтому многие используют браузерную автоматизацию — запускают headless-браузер, заходят на страницы X и собирают нужную информацию напрямую.
Разберём, как можно скрейпить твиты, профили и таймлайны с помощью Playwright и антидетект-браузеров вроде Octo.
Скрипт загружает твит через headless-браузер и перехватывает фоновые запросы. Затем фильтрует те, которые содержат данные твита.
Обратите внимание: Для скрейпинга нужно дождаться, когда твиты появятся на HTML-странице. Это знак, что фоновые запросы завершены.
Дальше можно подключить аналитику:
Но у официального API есть ограничения: часть данных недоступна, да и лимиты часто мешают. Поэтому многие используют браузерную автоматизацию — запускают headless-браузер, заходят на страницы X и собирают нужную информацию напрямую.
Разберём, как можно скрейпить твиты, профили и таймлайны с помощью Playwright и антидетект-браузеров вроде Octo.
Зачем вообще парсить X (Twitter)
Twitter — это огромный массив открытых данных, где всё крутится вокруг мнений, эмоций и трендов. Сбор таких данных помогает в разных задачах:- Следить за конкурентами. Можно смотреть, что они постят, какие акции запускают, как реагирует аудитория.
- Отлавливать тренды. По хештегам видно, что сейчас на хайпе. Это помогает вовремя перестроить контент или продукт.
- Понимать клиентов. Отзывы и упоминания — источник инсайтов. Часто именно из таких данных видно, что людям нравится, а что раздражает.
Как не попасть под блокировку
X довольно внимательно следит за подозрительной активностью, поэтому при скрейпинге важно действовать аккуратно. Вот базовые советы:- Делайте паузы между запросами и немного рандомизируйте их, чтобы поведение выглядело “человечнее”.
- Используйте качественные прокси и не шлите слишком много запросов с одного IP.
- Работайте через антидетект-браузер — например, Octo Browser. Он позволяет создавать виртуальные профили с разными цифровыми отпечатками (фингерпринтами), и для X каждый профиль будет выглядеть как отдельный пользователь.
- Для каждого аккаунта лучше завести отдельный профиль + отдельный прокси.
- Если регистрируете новый аккаунт, прогрейте его: соберите куки, немного “поживите” им в сети. Octo Browser это умеет делать автоматически или через импорт готовых cookies.
Пример парсинга твита через Playwright
Чтобы скрейпить посты из X.com, нужно загружать веб-страницы через headless-режим браузера, например Octo, и перехватывать фоновые запросы. Вот как выглядит скрейпинг твитов с помощью опенсорсной бибилиотеки Playwright:
Python:
from playwright.sync_api import sync_playwright
def scrape_tweet(url: str) -> dict:
"""
Scrape a single tweet page for Tweet thread e.g.:
https://twitter.com/Scrapfly_dev/status/1667013143904567296
Return parent tweet, reply tweets and recommended tweets
"""
_xhr_calls = []
def intercept_response(response):
"""capture all background requests and save them"""
# we can extract details from background requests
if response.request.resource_type == "xhr":
_xhr_calls.append(response)
return response
with sync_playwright() as pw:
browser = pw.chromium.launch(headless=False)
context = browser.new_context(viewport={"width": 1920, "height": 1080})
page = context.new_page()
# enable background request intercepting:
page.on("response", intercept_response)
# go to url and wait for the page to load
page.goto(url)
page.wait_for_selector("[data-testid='tweet']")
# find all tweet background requests:
tweet_calls = [f for f in _xhr_calls if "TweetResultByRestId" in f.url]
for xhr in tweet_calls:
data = xhr.json()
return data['data']['tweetResult']['result']
if __name__ == "__main__": print(scrape_tweet("https://twitter.com/Scrapfly_dev/status/1664267318053179398"))
Скрипт загружает твит через headless-браузер и перехватывает фоновые запросы. Затем фильтрует те, которые содержат данные твита.
Обратите внимание: Для скрейпинга нужно дождаться, когда твиты появятся на HTML-странице. Это знак, что фоновые запросы завершены.
Парсинг профилей и таймлайнов
Принцип тот же — открываете нужную страницу и вытягиваете данные. Например, для профиля можно собрать:- имя и описание пользователя,
- количество подписчиков и подписок,
- дату создания аккаунта.
Что делать с собранными данными
После парсинга обычно формируется список словарей (dict), который легко выгрузить в CSV или Excel.Дальше можно подключить аналитику:
- Сентимент-анализ — оценить, положительные или негативные упоминания преобладают.
- Кластеризация — сгруппировать посты по темам (“проблемы с доставкой”, “хвалят продукт” и т.п.).
- Поиск инфлюенсеров — найти активных пользователей с большой аудиторией для сотрудничества.
Чтобы всё работало стабильно
Резюмируем ключевые моменты безопасности:- Используйте прокси и распределяйте запросы.
- Меняйте фингерпринты и работайте через антидетект-браузер.
- Добавляйте случайные задержки между действиями.
- Сохраняйте и используйте cookies, чтобы не терять сессию.
- Прогревайте новые аккаунты перед основным парсингом.