社交媒体平台使用验证码来防止自动数据收集。市场研究人员、品牌监测者和学术研究人员需要应对这些挑战,收集公共社交数据进行分析。
跨社交平台的验证码
| 平台 | 验证码类型 | 触发时 | 语境 |
|---|---|---|---|
| reCAPTCHA v2 | 登录、搜索、个人资料访问 | 速率限制 | |
| 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))
代理推荐
| 平台 | 最佳代理 | 为什么 |
|---|---|---|
| 移动(4G) | 预计移动设备流量 | |
| 住宅 | 积极标记 DC IP | |
| Twitter/X | 住宅 | Cloudflare 阻止 DC |
| 抖音 | 移动(4G) | 专为移动访问而设计 |
| 领英 | ISP 住宅 | 需要桌面/corporate IP |
| 红迪网 | 住宅旋转 | 每个 IP 的速率限制 |
速率限制指南
| 平台 | 安全请求率 | 会话持续时间 |
|---|---|---|
| 1 请求/10 秒 | 最多5分钟然后休息 | |
| 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 密钥并自动处理平台验证码。