Сценарии использования

Сбор данных исследований в социальных сетях с обработкой CAPTCHA

Платформы социальных сетей используют CAPTCHA для защиты от автоматического сбора данных. Исследователям рынка, специалистам по мониторингу брендов и академическим исследователям необходимо решать эти проблемы, чтобы собрать общедоступные социальные данные для анализа.


CAPTCHA на социальных платформах

Платформа Тип капчи При срабатывании Контекст
Инстаграм reCAPTCHA v2 Вход, поиск, доступ к профилю Ограничение скорости
Фейсбук reCAPTCHA v2 Вход, повторные поиски Контрольно-пропускной пункт безопасности
Твиттер/X Cloudflare Turnstile Вход, доступ к API Предотвращение ботов
ТикТок reCAPTCHA v3 Просмотры профиля, поиск Качество трафика
LinkedIn страница Cloudflare-защиты в staging Парсинг профиля Обнаружение ботов
Реддит reCAPTCHA v2 Войти, тяжелый просмотр Предотвращение злоупотреблений

Парсер для исследований в социальных сетях

import requests
import time
import re

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_captcha(method, sitekey, pageurl, **kwargs):
    data = {
        "key": CAPTCHAAI_KEY,
        "method": method,
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    }
    data.update(kwargs)
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data=data)
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        r = result.json()
        if r["request"] != "CAPCHA_NOT_READY":
            return r["request"]
    raise TimeoutError("Solve timeout")


class SocialMediaResearcher:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) "
            "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 "
            "Mobile/15E148 Safari/604.1",
            "Accept-Language": "en-US,en;q=0.9",
        })

    def authenticate(self, login_url, credentials, sitekey):
        """Login with CAPTCHA handling."""
        # Load login page
        self.session.get(login_url)

        # Solve CAPTCHA
        token = solve_captcha("userrecaptcha", sitekey, login_url)

        # Submit login
        resp = self.session.post(login_url, data={
            **credentials,
            "g-recaptcha-response": token,
        })
        return resp.status_code == 200

    def collect_profiles(self, profile_urls):
        """Collect public profile data with CAPTCHA handling."""
        profiles = []

        for url in profile_urls:
            try:
                resp = self.session.get(url, timeout=30)

                # Handle CAPTCHA if triggered
                if self._has_captcha(resp.text):
                    resp = self._handle_captcha(resp.text, url)

                profiles.append({
                    "url": url,
                    "data": self._parse_profile(resp.text),
                    "status": "success",
                })
                time.sleep(5)  # Slow down between profiles

            except Exception as e:
                profiles.append({
                    "url": url,
                    "error": str(e),
                    "status": "failed",
                })

        return profiles

    def _has_captcha(self, html):
        return any(tag in html.lower() for tag in [
            'data-sitekey', 'g-recaptcha', 'cf-turnstile',
            'challenge-platform', 'captcha',
        ])

    def _handle_captcha(self, html, url):
        match = re.search(r'data-sitekey="([^"]+)"', html)
        if not match:
            return self.session.get(url)

        sitekey = match.group(1)

        if 'cf-turnstile' in html:
            token = solve_captcha("turnstile", sitekey, url)
            return self.session.post(url, data={"cf-turnstile-response": token})
        else:
            token = solve_captcha("userrecaptcha", sitekey, url)
            return self.session.post(url, data={"g-recaptcha-response": token})

    def _parse_profile(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")
        return {
            "name": self._safe_text(soup, "h1, .profile-name"),
            "bio": self._safe_text(soup, ".bio, .profile-bio"),
            "followers": self._safe_text(soup, "[data-followers], .followers"),
            "posts": self._safe_text(soup, "[data-posts], .posts-count"),
        }

    def _safe_text(self, soup, selector):
        el = soup.select_one(selector)
        return el.get_text(strip=True) if el else ""

Хэштег и исследование тенденций

def research_hashtag(hashtag, platform_url, pages=5):
    """Collect posts for a specific hashtag."""
    researcher = SocialMediaResearcher(
        proxy="http://user:pass@mobile.proxy.com:5000"
    )

    all_posts = []
    for page in range(pages):
        url = f"{platform_url}/explore/tags/{hashtag}?page={page}"
        resp = researcher.session.get(url, timeout=30)

        if researcher._has_captcha(resp.text):
            resp = researcher._handle_captcha(resp.text, url)

        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        posts = soup.select(".post-item, article")
        for post in posts:
            all_posts.append({
                "text": post.get_text(strip=True)[:500],
                "hashtag": hashtag,
                "page": page,
            })

        time.sleep(5)

    return all_posts

Мониторинг упоминаний бренда

import json
from datetime import datetime


class BrandMonitor:
    def __init__(self, brand_name, keywords, proxy=None):
        self.brand = brand_name
        self.keywords = keywords
        self.researcher = SocialMediaResearcher(proxy=proxy)

    def daily_scan(self, platform_urls):
        """Run daily brand mention scan across platforms."""
        report = {
            "brand": self.brand,
            "date": datetime.now().isoformat(),
            "platforms": {},
        }

        for name, url in platform_urls.items():
            mentions = []
            for keyword in self.keywords:
                search_url = f"{url}/search?q={keyword}"
                try:
                    resp = self.researcher.session.get(search_url, timeout=30)

                    if self.researcher._has_captcha(resp.text):
                        resp = self.researcher._handle_captcha(
                            resp.text, search_url,
                        )

                    from bs4 import BeautifulSoup
                    soup = BeautifulSoup(resp.text, "html.parser")
                    results = soup.select(".search-result, .post")
                    mentions.append({
                        "keyword": keyword,
                        "count": len(results),
                    })
                    time.sleep(5)
                except Exception as e:
                    mentions.append({
                        "keyword": keyword,
                        "error": str(e),
                    })

            report["platforms"][name] = mentions

        return report


# Usage
monitor = BrandMonitor(
    brand_name="CaptchaAI",
    keywords=["captchaai", "captcha ai", "captcha solver"],
    proxy="http://user:pass@mobile.proxy.com:5000",
)
report = monitor.daily_scan({
    "twitter": "https://twitter-alternative.example.com",
    "reddit": "https://www.reddit.com",
})
print(json.dumps(report, indent=2))

Рекомендации по прокси

Платформа подходящий прокси Почему
Инстаграм Мобильная связь (4G) Ожидается трафик мобильных устройств
Фейсбук Жилой Агрессивно помечает IP-адреса DC
Твиттер/X Жилой Cloudflare блокирует DC
ТикТок Мобильная связь (4G) Создан для мобильного доступа
LinkedIn Интернет-провайдер для жилых помещений Ожидает настольные IP-адреса /corporate
Реддит Жилой вращающийся Ограничения скорости на IP

Рекомендации по ограничению ставок

Платформа Безопасная скорость запросов Продолжительность сеанса
Инстаграм 1 запрос / 10 сек. Макс 5 минут, затем отдых
Фейсбук 1 запрос / 5 сек. Макс 10 мин.
Твиттер/X 1 запрос / 3 секунды Макс 15 мин.
ТикТок 1 запрос / 5 сек. Макс 5 минут
LinkedIn 1 запрос / 10 сек. Макс 5 минут
Реддит 1 запрос/2 сек. Макс 30 мин.

Поиск неисправностей

Проблема Причина Исправить
CAPTCHA каждый запрос IP отмечен Меняйте IP, используйте авторизованный сетевой выход
Аккаунт заблокирован Слишком много действий Сократите частоту, используйте несколько учетных записей.
Возвратилась пустая страница Содержимое входа в систему Сначала пройдите аутентификацию
Цикл испытаний Cloudflare Несовпадение сигналы браузера в браузере Используйте браузер, ориентированный на конфиденциальность, или стандартная конфигурация браузера Puppeteer.
Содержимое, отличное от браузера Местоположение/cookie различия Сопоставьте геопрокси с целевой аудиторией

Часто задаваемые вопросы

Разрешено ли собирать данные из социальных сетей для исследований?

Сбор публичных данных для некоммерческих исследований является обычным явлением. Суды постановили, что сбор общедоступных данных не нарушает CFAA. Однако всегда соблюдайте Условия обслуживания и ограничения скорости платформы.

Почему социальные платформы так быстро проверяют меня CAPTCHA?

Социальные платформы вкладывают значительные средства в обнаружение ботов. Они анализируют шаблоны просмотра, частоту запросов и сигналы браузера устройств. Используйте авторизованный сетевой выход и реалистичные шаблоны просмотра.

Должен ли я использовать API вместо парсинга?

Если платформа предлагает API с необходимыми вам данными, отдайте предпочтение этому. API более надежны и соответствуют ToS. Используйте очистку + CaptchaAI только для данных, недоступных через официальные API.


Связанные руководства


Надежный сбор данных исследований в социальных сетях —получите ключ CaptchaAIи автоматически обрабатывать CAPTCHA платформы.

Комментарии для этой статьи отключены.