Casos de Uso

Coleta de dados de pesquisa em mídias sociais com tratamento de CAPTCHA

As plataformas de mídia social usam CAPTCHAs para proteção contra a coleta automatizada de dados. Pesquisadores de mercado, monitores de marcas e pesquisadores acadêmicos precisam enfrentar esses desafios para coletar dados sociais públicos para análise.


CAPTCHAs em plataformas sociais

Plataforma Tipo CAPTCHA Quando acionado Contexto
Instagram reCAPTCHA v2 Login, pesquisa, acesso ao perfil Limitação de taxa
Facebook reCAPTCHA v2 Login, pesquisas repetidas Ponto de verificação de segurança
Twitter/X Cloudflare Turnstile Login, acesso à API Prevenção de bots
TikTok reCAPTCHA v3 Visualizações de perfil, pesquisa Qualidade do tráfego
LinkedIn Cloudflare Turnstile em staging Raspagem de perfil Detecção de bots
Reddit reCAPTCHA v2 Login, navegação pesada Prevenção de abusos

Raspador de pesquisa de mídia social

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 ""

Hashtag e pesquisa de tendências

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

Monitoramento de menção à marca

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))

Recomendações de proxy

Plataforma mais adequado proxy Por que
Instagram Móvel (4G) Espera tráfego de dispositivos móveis
Facebook Residencial Sinaliza IPs DC agressivamente
Twitter/X Residencial Cloudflare bloqueia DCs
TikTok Móvel (4G) Projetado para acesso móvel
LinkedIn ISP residencial Espera IPs de desktop/corporate
Reddit Rotativo residencial Limites de taxa por IP

Diretrizes de limitação de taxa

Plataforma Taxa de solicitação segura Duração da sessão
Instagram 1 solicitação/10 seg. Máx. 5 minutos e depois descanse
Facebook 1 solicitação / 5 seg. Máx. 10 minutos
Twitter/X 1 solicitação / 3 seg. Máx. 15 minutos
TikTok 1 solicitação / 5 seg. Máx. 5 minutos
LinkedIn 1 solicitação/10 seg. Máx. 5 minutos
Reddit 1 solicitação / 2 seg. Máx. 30 minutos

Solução de problemas

Problema Causa Correção
CAPTCHA cada solicitação IP sinalizado Gire o IP, use rede mobile autorizada
Conta bloqueada Muitas ações Reduza a frequência, use várias contas
Página vazia retornada Conteúdo por trás do login Autenticar primeiro
Ciclo de desafio Cloudflare Incompatibilidade de sinal de navegador do navegador Use um navegador com foco na privacidade ou o Puppeteer QA de navegador
Conteúdo diferente do navegador Diferenças de localização/cookie Combine o proxy geográfico com o público-alvo

Perguntas frequentes

A coleta de mídia social para pesquisa é permitida?

A recolha pública de dados para investigação não comercial é comum. Os tribunais decidiram que a recolha de dados públicos não viola a CFAA. No entanto, sempre respeite os Termos de Serviço e os limites de taxas da plataforma.

Por que as plataformas sociais me CAPTCHA tão rapidamente?

As plataformas sociais investem pesadamente na detecção de bots. Eles analisam padrões de navegação, frequência de solicitações e impressões digitais de dispositivos. Use proxies móveis e padrões de navegação realistas.

Devo usar uma API em vez de raspagem?

Se a plataforma oferece uma API com os dados que você precisa, prefira essa. APIs são mais confiáveis ​​e compatíveis com ToS. Use scraping + CaptchaAI apenas para dados não disponíveis por meio de APIs oficiais.


Guias Relacionados


Colete dados de pesquisa de mídia social de forma confiável -obtenha sua chave CaptchaAIe lidar com CAPTCHAs da plataforma automaticamente.

Os comentários estão desativados para este artigo.