Kasus Penggunaan

Scraping Data Riset Media Sosial dengan Penanganan CAPTCHA

Platform media sosial menggunakan CAPTCHA untuk melindungi terhadap pengumpulan data otomatis. Peneliti pasar, pemantau merek, dan peneliti akademis perlu mengatasi tantangan ini untuk mengumpulkan data sosial publik untuk dianalisis.


CAPTCHA di Seluruh Platform Sosial

Peron Jenis CAPTCHA Saat Dipicu Konteks
Instagram reCAPTCHA v2 Login, pencarian, akses profil Pembatasan tarif
Facebook reCAPTCHA v2 Masuk, pencarian berulang Pos pemeriksaan keamanan
Twitter/X Cloudflare Turnstile Masuk, akses API Pencegahan bot
TikTok reCAPTCHA v3 Tampilan profil, pencarian Kualitas lalu lintas
LinkedIn Cloudflare Challenge Scraping profil Deteksi bot
reddit reCAPTCHA v2 Masuk, penjelajahan berat Pencegahan penyalahgunaan

Scraper Riset Media Sosial

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

Riset Hashtag dan Tren

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

Pemantauan Penyebutan Merek

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

Rekomendasi Proxy

Peron Proxy Terbaik Mengapa
Instagram Seluler (4G) Mengharapkan lalu lintas perangkat seluler
Facebook Perumahan Menandai IP DC secara agresif
Twitter/X Perumahan Cloudflare memblokir DC
TikTok Seluler (4G) Dirancang untuk akses seluler
LinkedIn perumahan ISP Mengharapkan IP desktop/corporate
reddit Rotasi perumahan Batasan tarif per IP

Pedoman Pembatasan Tarif

Peron Tingkat Request Aman Durasi Sesi
Instagram 1 request / 10 detik Maks 5 menit lalu istirahat
Facebook 1 request / 5 detik Maks 10 menit
Twitter/X 1 request / 3 detik Maks 15 menit
TikTok 1 request / 5 detik Maks 5 menit
LinkedIn 1 request / 10 detik Maks 5 menit
reddit 1 request / 2 detik Maks 30 menit

Pemecahan Masalah

Masalah Penyebab Solusi
CAPTCHA setiap request IP ditandai Putar IP, gunakan proxy seluler
Akun terkunci Terlalu banyak tindakan Kurangi frecookiensi, gunakan banyak akun
Halaman kosong dikembalikan Konten di balik login Otentikasi terlebih dahulu
Lingkaran tantangan Cloudflare Ketidakcocokan sinyal browser browser Gunakan browser yang berfokus pada privasi atau mode standar Dalang
Konten berbeda dari browser Perbedaan Lokasi/cookie Cocokkan proxy geografis dengan audiens target

Pertanyaan Umum

Apakah media sosial yang digunakan untuk penelitian diperbolehkan?

Pengumpulan data publik untuk penelitian non-komersial adalah hal biasa. Pengadilan telah memutuskan bahwa menghapus data publik tidak melanggar CFAA. Namun, selalu hormati Ketentuan Layanan dan batasan tarif platform.

Mengapa platform sosial CAPTCHA saya begitu cepat?

Platform sosial berinvestasi besar dalam deteksi bot. Mereka menganalisis pola penelusuran, frecookiensi request, dan sinyal browser perangkat. Gunakan proxy seluler dan pola penjelajahan yang realistis.

Haruskah saya menggunakan API daripada menggores?

Jika platform menawarkan API dengan data yang Anda butuhkan, pilihlah itu. API lebih andal dan sesuai ToS. Gunakan scraping + CaptchaAI hanya untuk data yang tidak tersedia melalui API resmi.


Panduan Terkait

  • Proxy Seluler untuk Pemecahan CAPTCHA
  • Kegigihan Sesi Browser
  • Integrasi Browser yang Dikonfigurasi Secara Tersembunyi

Kumpulkan data penelitian media sosial dengan andal –dapatkan kunci CaptchaAI Andadan menangani CAPTCHA platform secara otomatis.

Komentar dinonaktifkan untuk artikel ini.