Bright Data(以前称为 Luminati)提供最大的代理网络 - 遍布 195 个国家/地区的 7200 万多个住宅 IP。与 CaptchaAI 结合,您可以获得用于浏览的干净 IP,并在出现挑战时自动解决验证码问题。
建筑学
Your Script ──▶ Bright Data Proxy ──▶ Target Site
│
CAPTCHA appears
│
CaptchaAI API ──▶ Solved token
│
Inject token ◀─┘
CaptchaAI 不会通过您的代理进行路由 - 它使用自己的基础设施解决服务器端问题。您的代理处理浏览;CaptchaAI 处理验证码。
Bright 数据代理类型
| 类型 | 知识产权 | 速度 | 成本 | 验证码率 |
|---|---|---|---|---|
| 数据中心 | 77万+ | 快速地 | 低的 | 更高 |
| 住宅 | 72M+ | 中等的 | 中等的 | 降低 |
| ISP | 70万+ | 快速地 | 高的 | 最低 |
| 移动的 | 7M+ | 慢的 | 高的 | 很低 |
Python集成
请求+明亮数据+CaptchaAI
import requests
import time
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
# Bright Data proxy credentials
BRIGHT_DATA_PROXY = {
"http": "http://brd-customer-CUSTOMER_ID-zone-ZONE:PASSWORD@brd.superproxy.io:22225",
"https": "http://brd-customer-CUSTOMER_ID-zone-ZONE:PASSWORD@brd.superproxy.io:22225",
}
def fetch_with_proxy(url):
"""Fetch a page through Bright Data proxy."""
resp = requests.get(
url,
proxies=BRIGHT_DATA_PROXY,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/126.0.0.0 Safari/537.36"
},
timeout=30,
)
return resp
def solve_recaptcha(site_url, sitekey):
"""Solve reCAPTCHA v2 via CaptchaAI."""
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
data = resp.json()
if data["status"] != 1:
raise Exception(f"Submit: {data['request']}")
task_id = data["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY,
"action": "get",
"id": task_id,
"json": 1,
})
data = resp.json()
if data["request"] == "CAPCHA_NOT_READY":
continue
if data["status"] == 1:
return data["request"]
raise Exception(f"Solve: {data['request']}")
raise TimeoutError("Solve timeout")
def solve_turnstile(site_url, sitekey):
"""Solve Cloudflare Turnstile via CaptchaAI."""
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": site_url,
"json": 1,
})
data = resp.json()
task_id = data["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY,
"action": "get",
"id": task_id,
"json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Solve timeout")
硒+光明数据+CaptchaAI
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
BRIGHT_DATA_HOST = "brd.superproxy.io"
BRIGHT_DATA_PORT = 22225
BRIGHT_DATA_USER = "brd-customer-CUSTOMER_ID-zone-residential"
BRIGHT_DATA_PASS = "PASSWORD"
def create_driver_with_proxy():
options = webdriver.ChromeOptions()
options.add_argument(
f"--proxy-server=http://{BRIGHT_DATA_HOST}:{BRIGHT_DATA_PORT}"
)
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
return driver
def scrape_with_captcha_solving(url, sitekey=None):
driver = create_driver_with_proxy()
try:
driver.get(url)
time.sleep(3)
# Auto-detect sitekey if not provided
if not sitekey:
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')"
"?.getAttribute('data-sitekey')"
)
if sitekey:
token = solve_recaptcha(url, sitekey)
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
document.querySelectorAll('[name="g-recaptcha-response"]')
.forEach(el => {{ el.value = '{token}'; }});
""")
# Trigger callback
driver.execute_script("""
if (typeof ___grecaptcha_cfg !== 'undefined') {
const clients = ___grecaptcha_cfg.clients;
for (const key in clients) {
for (const prop in clients[key]) {
const val = clients[key][prop];
if (val && typeof val === 'object') {
for (const p in val) {
if (typeof val[p]?.callback === 'function') {
val[p].callback(arguments[0]);
}
}
}
}
}
}
""")
return driver.page_source
finally:
driver.quit()
针对特定国家/地区的定位
Bright Data 支持国家、州和城市定位:
# Country targeting
proxy_us = "http://brd-customer-ID-zone-residential-country-us:PASS@brd.superproxy.io:22225"
proxy_uk = "http://brd-customer-ID-zone-residential-country-gb:PASS@brd.superproxy.io:22225"
proxy_de = "http://brd-customer-ID-zone-residential-country-de:PASS@brd.superproxy.io:22225"
# City targeting
proxy_nyc = "http://brd-customer-ID-zone-residential-country-us-city-newyork:PASS@brd.superproxy.io:22225"
# Use the geo-matched proxy for lower CAPTCHA rates
def scrape_localized(url, country="us"):
proxy = f"http://brd-customer-ID-zone-residential-country-{country}:PASS@brd.superproxy.io:22225"
resp = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
return resp
会话管理
# Sticky session (same IP for entire session)
proxy_sticky = (
"http://brd-customer-ID-zone-residential"
"-session-abc123:PASS@brd.superproxy.io:22225"
)
# Rotating (new IP each request)
proxy_rotating = (
"http://brd-customer-ID-zone-residential:PASS@brd.superproxy.io:22225"
)
对于验证码工作流程: 使用粘性会话。 CAPTCHA 令牌与加载页面的 IP 绑定 - 使用不同的 IP 提交将会失败。
Node.js 集成
const axios = require("axios");
const https = require("https");
const CAPTCHAAI_KEY = "YOUR_API_KEY";
const CAPTCHAAI_URL = "https://ocr.captchaai.com";
const proxyAgent = new (require("https-proxy-agent"))(
"http://brd-customer-ID-zone-residential:PASS@brd.superproxy.io:22225"
);
async function fetchWithProxy(url) {
return axios.get(url, {
httpsAgent: proxyAgent,
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0",
},
});
}
async function solveCaptcha(siteUrl, sitekey) {
const submit = await axios.post(`${CAPTCHAAI_URL}/in.php`, null, {
params: {
key: CAPTCHAAI_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: siteUrl,
json: 1,
},
});
const taskId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get(`${CAPTCHAAI_URL}/res.php`, {
params: {
key: CAPTCHAAI_KEY,
action: "get",
id: taskId,
json: 1,
},
});
if (result.data.request === "CAPCHA_NOT_READY") continue;
if (result.data.status === 1) return result.data.request;
}
throw new Error("Timeout");
}
明亮的数据区配置
| 区域设置 | 推荐用于验证码 | 为什么 |
|---|---|---|
| 代理类型 | 住宅 | 最低的验证码触发率 |
| 国家/地区定位 | 匹配目标站点位置 | IP→内容一致性 |
| 会话类型 | 黏 | 令牌必须与原始 IP 匹配 |
| IP质量过滤器 | 高质量 | 避免标记的 IP |
| 最大并发数 | 100+ | 并行验证码工作流程 |
故障排除
| 问题 | 原因 | 处理方式 |
|---|---|---|
| 407 来自代理 | 凭证错误 | 验证客户 ID、区域和密码 |
| 验证码会出现在每个请求中 | 检测到数据中心代理 | 切换到住宅区 |
| 令牌被拒绝 | 解决和提交之间 IP 发生变化 | 使用粘性会话 |
| 反应慢 | 出口节点拥塞 | 目标不太受欢迎的国家/city |
| 连接被拒绝 | 达到带宽限制 | 检查明亮数据仪表板 |
常问问题
CaptchaAI 是否使用我的 Bright Data 代理?
不会。CaptchaAI 使用自己的基础设施解决验证码问题。您的代理仅用于浏览。您将页面 URL 和站点密钥传递给 CaptchaAI 的 API。
哪个 Bright Data 区域最适合验证码较多的网站?
住宅区或 ISP 区域。数据中心 IP 更有可能触发验证码。 ISP 代理将数据中心速度与住宅信任结合起来。
我应该使用粘性会话还是轮流会话?
对验证码工作流程具有粘性。 CAPTCHA 令牌是 IP 绑定的 - 如果您的 IP 在页面加载和表单提交之间轮换,则令牌将被拒绝。
我可以将我的代理传递给 CaptchaAI 吗?
是的 – CaptchaAI 的 API 接受 proxy 参数。这使得 CaptchaAI 可以从同一 IP 解决验证码。对于 IP 绑定的挑战很有用。
相关指南
- 轮换自有服务器基础设施以解决验证码问题
- 代理质量影响验证码解决率
- 验证码的 ISP 与数据中心代理
将 Bright Data 的代理网络与自动验证码解决相结合 –获取您的 CaptchaAI 密钥并扩展您的自动化。