CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart,全自动区分计算机与人类的公开图灵测试)由网站部署,用于区分人类用户和自动化机器人,主要目的是防止滥用并维护服务的完整性;在自动化流程中应对 CAPTCHA,通常需要 IP 轮换、高级浏览器指纹缓解,以及与第三方 CAPTCHA 打码服务集成等策略。
网站为什么部署 CAPTCHA
网站部署 CAPTCHA 机制,是为了保护自身资源和用户体验,抵御各种形式的自动化滥用。这类系统相当于一道门禁:设置一项人类容易通过、机器人却难以通过的测试。
防止自动化滥用
部署 CAPTCHA 的主要动机包括:
- 防垃圾信息: 机器人常被用来在博客、论坛发布垃圾评论,或注册用于邮件群发垃圾信息的虚假账号。CAPTCHA 可以拦截这些自动提交。
- 撞库与账号盗用(ATO): 自动化脚本会使用被盗凭据列表尝试登录用户账号。CAPTCHA 可阻止大规模自动登录尝试。
- 网页抓取与数据窃取: 未经授权的机器人能快速抓取大量数据,例如商品列表、价格信息或用户数据,这会占用服务器资源并违反服务条款。
- 拒绝服务(DoS)攻击: 应用层 DoS 攻击中,机器人会反复访问特定页面或执行计算量很大的操作,以拖垮服务器。CAPTCHA 通过对每个请求要求验证来缓解此类攻击。
- 欺诈性注册: 机器人批量注册虚假账号,以滥用免费试用、促销优惠或从事其他欺诈活动。
- 广告欺诈: 机器人模拟人类与广告的交互,制造虚假展示或点击,影响广告收入和数据分析。
- 黄牛抢购与囤货: 机器人被用来抢在真人用户之前快速购买限量商品(如演唱会门票、限量版产品),并常常以高价转售。
CAPTCHA 验证的类型
CAPTCHA 技术已从简单的文本识别演进为复杂的行为分析。
传统 CAPTCHA
早期形式要求用户输入扭曲的文字或数字。
* 文本型: 扭曲的字母/数字,有时带有背景噪点。
* 音频型: 面向视障用户的一段含失真语音的音频。
图像型 CAPTCHA
要求用户在一组图片中识别出特定物体。
* reCAPTCHA v2(“我不是机器人”复选框): 通常先显示一个复选框。如果用户行为可疑,会升级为图像验证(例如“选出所有包含红绿灯的方格”)。
* hCaptcha: 与 reCAPTCHA v2 类似,出于隐私方面的考虑常被用作替代方案。
隐形 CAPTCHA
在后台运行,分析用户行为;除非可疑度很高,否则不需要用户显式交互。
* reCAPTCHA v3: 根据用户在整个站点的交互给出评分(0.0 到 1.0)。分数低表示行为像机器人。
* hCaptcha Enterprise: 提供高级风险分析、自定义模型以及面向企业级机器人检测的集成能力。
* 行为型 CAPTCHA: 分析鼠标移动、打字习惯、滚动行为等遥测数据,以区分人类与机器人。
自动化操作中如何应对 CAPTCHA
在自动化工作流中应对 CAPTCHA,尤其是使用代理服务时,需要多管齐下。代理主要帮助避免触发 CAPTCHA,而破解它们通常需要外部服务。
通过代理选型与管理避免 CAPTCHA
代理基础设施的类型与管理方式,很大程度上决定了遇到 CAPTCHA 的概率。网站通常依据 IP 信誉、单个 IP 的请求量以及 user-agent 数据的一致性来标记请求。
- 住宅代理: 这些 IP 来自真实用户设备(ISP 分配),看上去与正常用户无异。相比数据中心代理更不容易被标记,在敏感目标上尤其如此。
- 轮换代理: 把请求分散到庞大的 IP 池中(自动轮换),可避免任何单个 IP 积累可疑的请求量或被限速。这模拟了多样化的真人流量。
- 独享代理: 它提供稳定的 IP 身份,适合特定且稳定的使用场景,让 IP 随时间积累干净的信誉。但一旦被检测到滥用,单个独享 IP 很容易被封。
- 移动代理: 移动运营商的 IP 因其动态特性和移动流量成本,通常被视为可信度极高。面对高强度反机器人系统时,它触发 CAPTCHA 的概率最低。
各类代理在规避 CAPTCHA 方面的对比:
| 代理类型 | 触发 CAPTCHA 的概率 | 主要缓解策略 | 规避 CAPTCHA 的最佳场景 |
|---|---|---|---|
| 数据中心代理 | 高 | 快速 IP 轮换 | 低风险目标、大批量任务,IP 信誉不那么关键的场景。 |
| 住宅代理 | 低到中 | 模拟真实用户流量 | 高价值抓取、账号管理、社交媒体。 |
| 移动代理 | 极低 | 表现为真实移动 ISP 用户 | 高度敏感目标、强力反机器人系统。 |
浏览器指纹与 header 管理
除 IP 地址之外,网站还会分析浏览器特征和请求 header 来识别机器人。
- User-Agent 字符串: 确保 User-Agent 字符串保持一致,并模拟常见的浏览器/操作系统组合。必要时轮换 User-Agent。
- HTTP header: 加入真实浏览器会发送的标准 header(例如
Accept、Accept-Language、Referer)。 - 浏览器模拟: 使用可渲染页面并执行 JavaScript 的无头浏览器框架(例如 Puppeteer、Playwright、Selenium),让请求更接近真人。同时进行配置,避开常见的机器人检测特征(例如
navigator.webdriver属性)。 - Canvas 指纹: 机器人的 canvas 渲染结果往往是可预测的。高级模拟可以解决这一问题。
- WebGL 指纹: 与 canvas 类似,确保 WebGL 参数与真实浏览器一致。
import requests
proxies = {
"http": "http://user:password@proxy_ip:port",
"https": "http://user:password@proxy_ip:port",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.google.com/",
# ... 其他相关 header
}
try:
response = requests.get("https://example.com/protected-page", proxies=proxies, headers=headers, timeout=10)
response.raise_for_status() # HTTP 错误时抛出异常
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
# 如果可以,检查响应中是否含有 CAPTCHA 特征
外部 CAPTCHA 打码服务
当 CAPTCHA 无法避免时,外部服务提供了破解它们的手段。这些服务独立于您的代理基础设施运行,但通常与其配合使用。
- 人工打码: 这类服务把 CAPTCHA 转交给人工坐席实时处理。准确率很高,但会带来延迟,单次成本也更高。
- AI/ML 打码: 自动化系统使用机器学习模型破解常见的 CAPTCHA 类型,尤其是图像识别类。速度更快、成本更低,但在复杂或全新的 CAPTCHA 变体上准确率可能较低。
- 集成方式: 多数打码服务都提供 API,便于接入自动化流程。您的机器人检测到 CAPTCHA 后,把验证参数(例如 site key、图像数据)发送到打码 API,收到解答 token 或文本,再提交给目标网站。
# 与 CAPTCHA 打码服务 API 集成的伪代码
import requests
import json
def solve_captcha(site_key, page_url, service_api_key):
# reCAPTCHA v2 验证示例
payload = {
"clientKey": service_api_key,
"task": {
"type": "NoCaptchaTaskProxyless", # 若打码方使用代理,则用 NoCaptchaTask
"websiteURL": page_url,
"websiteKey": site_key
}
}
# 向 CAPTCHA 打码服务发送请求
create_task_url = "https://api.captchasolver.com/createTask"
response = requests.post(create_task_url, json=payload).json()
if response["errorId"] == 0:
task_id = response["taskId"]
print(f"CAPTCHA task created with ID: {task_id}")
# 轮询结果
get_result_url = "https://api.captchasolver.com/getTaskResult"
while True:
result_payload = {
"clientKey": service_api_key,
"taskId": task_id
}
result_response = requests.post(get_result_url, json=result_payload).json()
if result_response["errorId"] == 0 and result_response["status"] == "ready":
return result_response["solution"]["gRecaptchaResponse"] # 要提交的 token
elif result_response["status"] == "processing":
import time
time.sleep(3) # 等待后再次轮询
else:
print(f"Error solving CAPTCHA: {result_response}")
return None
else:
print(f"Error creating CAPTCHA task: {response}")
return None
# 使用示例:
# captcha_token = solve_captcha("YOUR_SITE_KEY", "https://target-site.com", "YOUR_SOLVER_API_KEY")
# if captcha_token:
# # 将 captcha_token 连同表单数据一起提交到目标网站
# pass
限速与自然交互
即便代理稳健、指纹处理到位,过高的请求速率或不自然的交互模式仍会触发 CAPTCHA。
- 节流: 在请求之间加入延迟,模拟真人的浏览速度。
- 随机化: 引入随机延迟和多样化的浏览路径,避免可预测的机器人模式。
- Cookie 与会话: 保留会话 cookie 及其他状态信息,让访问看起来是一次连续的用户会话。
把智能代理管理与高级浏览器模拟结合起来,并在必要时配合外部 CAPTCHA 打码服务,是在自动化环境中访问受 CAPTCHA 保护网站的最稳健方案。
