应用场景

使用验证码处理进行社交媒体研究数据收集

社交媒体平台使用验证码来防止自动数据收集。市场研究人员、品牌监测者和学术研究人员需要应对这些挑战,收集公共社交数据进行分析。


跨社交平台的验证码

平台 验证码类型 触发时 语境
Instagram reCAPTCHA v2 登录、搜索、个人资料访问 速率限制
Facebook reCAPTCHA v2 登录,重复搜索 安全检查站
Twitter/X Cloudflare Turnstile 登录、API访问 机器人预防
抖音 reCAPTCHA v3 个人资料浏览、搜索 交通质量
领英 Cloudflare 验证流程 轮廓刮削 机器人检测
红迪网 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))

代理推荐

平台 最佳代理 为什么
Instagram 移动(4G) 预计移动设备流量
Facebook 住宅 积极标记 DC IP
Twitter/X 住宅 Cloudflare 阻止 DC
抖音 移动(4G) 专为移动访问而设计
领英 ISP 住宅 需要桌面/corporate IP
红迪网 住宅旋转 每个 IP 的速率限制

速率限制指南

平台 安全请求率 会话持续时间
Instagram 1 请求/10 秒 最多5分钟然后休息
Facebook 1 请求/5 秒 最长 10 分钟
Twitter/X 1 请求/3 秒 最长 15 分钟
抖音 1 请求/5 秒 最长 5 分钟
领英 1 请求/10 秒 最长 5 分钟
红迪网 1 请求/2 秒 最长 30 分钟

故障排除

问题 原因 处理方式
每个请求都验证码 IP 标记 轮换IP,使用自有服务器基础设施
帐户被锁定 动作太多 减少频率,使用多个帐户
返回空页 登录后的内容 首先进行身份验证
Cloudflare 挑战循环 浏览器特征不一致 使用标准 QA 浏览器或 Puppeteer 隐形浏览器
内容与浏览器不同 位置/cookie差异 将地理代理与目标受众相匹配

常问问题

是否允许社交媒体抓取研究内容?

用于非商业研究的公共数据收集很常见。法院裁定抓取公共数据并不违反 CFAA。但是,请始终遵守服务条款和平台速率限制。

为什么社交平台验证码这么快?

社交平台在机器人检测方面投入巨资。他们分析浏览模式、请求频率和设备特征。使用自有服务器基础设施和现实的浏览模式。

我应该使用 API 而不是抓取吗?

如果该平台提供包含您需要的数据的 API,则更佳。 API 更加可靠且符合 ToS。仅对于无法通过官方 API 获取的数据使用抓取 + CaptchaAI。


相关指南


可靠地收集社交媒体研究数据 -获取您的 CaptchaAI 密钥并自动处理平台验证码。

该文章已禁用评论。