Trường Hợp Sử Dụng

Thu thập dữ liệu nghiên cứu truyền thông xã hội bằng cách xử lý CAPTCHA

Các nền tảng truyền thông xã hội sử dụng CAPTCHA để bảo vệ khỏi việc thu thập dữ liệu tự động. Các nhà nghiên cứu thị trường, người giám sát thương hiệu và nhà nghiên cứu học thuật cần phải giải quyết những thách thức này để thu thập dữ liệu xã hội công khai để phân tích.


CAPTCHA trên các nền tảng xã hội

Nền tảng Loại CAPTCHA Khi được kích hoạt Bối cảnh
Instagram reCAPTCHA v2 Đăng nhập, tìm kiếm, truy cập hồ sơ Giới hạn tỷ lệ
Facebook reCAPTCHA v2 Đăng nhập, tìm kiếm lặp lại Trạm kiểm soát an ninh
Twitter/X Cloudflare Turnstile Đăng nhập, truy cập API Phòng chống bot
TikTok reCAPTCHA v3 Lượt xem hồ sơ, tìm kiếm Chất lượng giao thông
LinkedIn Cloudflare Challenge Quét hồ sơ Phát hiện bot
Reddit reCAPTCHA v2 Đăng nhập, duyệt web nặng Phòng chống lạm dụng

Công cụ quét nghiên cứu truyền thông xã hội

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 và nghiên cứu xu hướng

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

Giám sát đề cập đến thương hiệu

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

Đề xuất ủy quyền

Nền tảng Proxy tốt nhất tại sao
Instagram Di động (4G) Dự kiến lưu lượng truy cập thiết bị di động
Facebook Khu dân cư Gắn cờ IP DC một cách tích cực
Twitter/X Khu dân cư Cloudflare chặn DC
TikTok Di động (4G) Được thiết kế để truy cập di động
LinkedIn khu dân cư ISP Yêu cầu IP/corporate dành cho máy tính để bàn
Reddit Khu dân cư xoay vòng Giới hạn tỷ lệ trên mỗi IP

Nguyên tắc giới hạn tỷ lệ

Nền tảng Tỷ lệ yêu cầu an toàn Thời lượng phiên
Instagram 1 yêu cầu / 10 giây Tối đa 5 phút sau đó nghỉ ngơi
Facebook 1 yêu cầu / 5 giây Tối đa 10 phút
Twitter/X 1 yêu cầu / 3 giây Tối đa 15 phút
TikTok 1 yêu cầu / 5 giây Tối đa 5 phút
LinkedIn 1 yêu cầu / 10 giây Tối đa 5 phút
Reddit 1 yêu cầu / 2 giây Tối đa 30 phút

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
CAPTCHA mọi yêu cầu IP được gắn cờ Xoay IP, sử dụng đa dạng nguồn yêu cầu
Tài khoản bị khóa Quá nhiều hành động Giảm tần suất, sử dụng nhiều tài khoản
Trang trống được trả lại Nội dung đằng sau đăng nhập Xác thực đầu tiên
Vòng lặp thử thách Cloudflare Dấu vân tay của trình duyệt không khớp Sử dụng trình duyệt tập trung vào quyền riêng tư hoặc tính năng tàng hình của Puppeteer
Nội dung khác với trình duyệt Vị trí/cookie sự khác biệt Kết hợp proxy địa lý với đối tượng mục tiêu

Câu hỏi thường gặp

Phương tiện truyền thông xã hội có được phép nghiên cứu không?

Việc thu thập dữ liệu công khai cho nghiên cứu phi thương mại là phổ biến. Các tòa án đã phán quyết rằng việc thu thập dữ liệu công khai không vi phạm CFAA. Tuy nhiên, hãy luôn tôn trọng Điều khoản dịch vụ và giới hạn tỷ lệ nền tảng.

Tại sao nền tảng xã hội CAPTCHA cho tôi nhanh như vậy?

Nền tảng xã hội đầu tư rất nhiều vào việc phát hiện bot. Họ phân tích các kiểu duyệt web, tần suất yêu cầu và dấu vân tay của thiết bị. Sử dụng đa dạng nguồn yêu cầu và các kiểu duyệt thực tế.

Tôi có nên sử dụng API thay vì thu thập dữ liệu không?

Nếu nền tảng cung cấp API với dữ liệu bạn cần, hãy ưu tiên điều đó. API đáng tin cậy hơn và tuân thủ ToS. Chỉ sử dụng tính năng cạo + CaptchaAI cho dữ liệu không có sẵn thông qua API chính thức.


Hướng dẫn liên quan


Thu thập dữ liệu nghiên cứu truyền thông xã hội một cách đáng tin cậy —lấy khóa CaptchaAI của bạnvà tự động xử lý CAPTCHA của nền tảng.

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