Anwendungsfälle

Erfassung von Social-Media-Forschungsdaten mit CAPTCHA-Verwaltung

Social-Media-Plattformen nutzen CAPTCHAs zum Schutz vor automatisierter Datenerfassung. Marktforscher, Markenbeobachter und akademische Forscher müssen diese Herausforderungen meistern, um öffentliche soziale Daten für die Analyse zu sammeln.


CAPTCHAs auf allen sozialen Plattformen

Plattform CAPTCHA-Typ Wenn ausgelöst Kontext
Instagram reCAPTCHA v2 Login, Suche, Profilzugriff Ratenbegrenzung
Facebook reCAPTCHA v2 Login, wiederholte Suche Sicherheitskontrollpunkt
Twitter/X Cloudflare Turnstile Login, API-Zugriff Bot-Prävention
TikTok reCAPTCHA v3 Profilansichten, Suche Verkehrsqualität
LinkedIn Cloudflare Challenge Profilschaben Bot-Erkennung
Reddit reCAPTCHA v2 Anmelden, intensives Surfen Missbrauchsprävention

Social-Media-Recherche-Scraper

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- und Trendforschung

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

Überwachung der Markenerwähnung

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

Netzwerkempfehlungen

Plattform Bester Proxy Warum
Instagram Mobil (4G) Erwartet Datenverkehr über Mobilgeräte
Facebook Wohnen Markiert DC-IPs aggressiv
Twitter/X Wohnen Cloudflare blockiert DCs
TikTok Mobil (4G) Entwickelt für den mobilen Zugriff
LinkedIn ISP-Wohngebiet Erwartet Desktop/corporate-IPs
Reddit Wohnrotation Ratenlimits pro IP

Richtlinien zur Ratenbegrenzung

Plattform Sichere Anforderungsrate Sitzungsdauer
Instagram 1 Anforderung / 10 Sek Maximal 5 Minuten, dann ruhen
Facebook 1 Anforderung / 5 Sek Maximal 10 Min
Twitter/X 1 Anforderung / 3 Sek Maximal 15 Min
TikTok 1 Anforderung / 5 Sek Maximal 5 Min
LinkedIn 1 Anforderung / 10 Sek Maximal 5 Min
Reddit 1 Anforderung / 2 Sek Maximal 30 Min

Fehlerbehebung

Problem Ursache Lösung
CAPTCHA für jede Anfrage IP markiert IP rotieren, mobilen Proxy verwenden
Konto gesperrt Zu viele Aktionen Reduzieren Sie die Häufigkeit, verwenden Sie mehrere Konten
Es wurde eine leere Seite zurückgegeben Inhalt hinter der Anmeldung Authentifizieren Sie sich zuerst
Cloudflare-Herausforderungsschleife Nicht übereinstimmender Browser-Signalprofil Verwenden Sie einen datenschutzorientierten Browser oder konfiguriertes Puppeteer-Profil
Anderer Inhalt als Browser Location/cookie Unterschiede Passen Sie den Geo-Proxy an die Zielgruppe an

FAQ

Ist Social-Media-Scraping zu Forschungszwecken erlaubt?

Die öffentliche Datenerhebung für nichtkommerzielle Forschungszwecke ist üblich. Gerichte haben entschieden, dass das Scraping öffentlicher Daten keinen Verstoß gegen die CFAA darstellt. Beachten Sie jedoch immer die Nutzungsbedingungen und die Tarifbeschränkungen der Plattform.

Warum CAPTCHA ich auf sozialen Plattformen so schnell?

Soziale Plattformen investieren stark in die Bot-Erkennung. Sie analysieren Browsing-Muster, Anforderungshäufigkeit und Geräte-Browser-Signalprofile. Verwenden Sie mobile Proxys und realistische Browsing-Muster.

Sollte ich eine API anstelle von Scraping verwenden?

Wenn die Plattform eine API mit den von Ihnen benötigten Daten bietet, bevorzugen Sie diese. APIs sind zuverlässiger und ToS-konform. Verwenden Sie Scraping + CaptchaAI nur für Daten, die nicht über offizielle APIs verfügbar sind.


Verwandte Leitfäden

  • Mobile Proxys zur CAPTCHA-Lösung
  • Persistenz der Browsersitzung
  • Browser-Profil-Isolation + CaptchaAI

Erfassen Sie zuverlässig Social-Media-Forschungsdaten – Holen Sie sich Ihren CaptchaAI-Schlüsselund Plattform-CAPTCHAs automatisch verarbeiten.

Kommentare sind für diesen Artikel deaktiviert.