云浮探测如何有效
Cloudflare是部署最广泛的反机器人服务,保护了20%以上的所有网站. 了解它如何检测自动化交通对于任何建造合法刮刮工具的人来说都是至关重要的. Cloudflare使用多层检测管道:
- IP声誉评分: Cloudflare维持一个全球威胁情报数据库. Datacenter IP,已知的VPN范围,以及先前标注的地址获得较高的风险分数.
- TLS 指纹 : 云纹分析 TLS 客户端 Hello 消息 以确定连接客户端是否与其声称的身份相符。
- 浏览器指纹 : JavaScript 挑战探测器 画布、 WebGL、 导航器属性和几十个其他信号
- Java脚本挑战 : Cloudflare 为 JavaScript 服务,它必须在真实的浏览器环境中正确执行.
- 行为分析: 请求时间,导航模式,鼠标移动,以及交互信号都经过分析.
- 机器学习模式: 所有信号都输入不断适应新的自动化模式的ML模型.
更广义的概述,见我们 反机器人探测系统综合指南。 。 。
云浮保护级别
| 级别 | 检测方法 | 难度 | 典型网站 |
|---|---|---|---|
| 基本( 免费) | 知识产权声誉,基本JS挑战 | 低级 | 小博客,个人网站 |
| 赞成 | + WAF 规则,税率限制 | 中型 | 中型企业,SaaS |
| 商业 | + 高级瓶管理 | 高级 | 电子商务、企业地点 |
| 企业 | + ML 动力bot 评分,行为分析 | 甚高楼 | 主要零售商、金融服务 |
进入云层保护地点的道德框架
在执行任何技术方法之前,确定明确的道德界限:
- 先检查 API : 许多Cloudflare保护的网站为数据访问提供官方API. 总是喜欢这些。
- 尊重机器人.txt: 如果网站明确拒绝删除特定路径,则遵守这些指令。
- 审查服务条件: 了解网站允许自动化访问的内容。
- 只访问公共数据: 永远不要试图绕过认证或访问私人数据.
- 最小化服务器撞击 : 使用合理的请求率,并且不超载目标服务器.
- 考虑发放数据许可证: 对于商业使用案例,探索数据许可协议.
本指南的技术旨在合法获取公开数据。 决不能利用这些手段规避安全保护,防止未经授权进入、盗用证书或拒绝提供服务。
战略1:有清洁IP的住宅邻里
最有效的第一步是确保你的IP地址有干净的声誉. Cloudflare的IP评分对数据中心及VPNIP进行严厉处罚.
# Python: Using residential proxies for Cloudflare-protected sites
from curl_cffi import requests as curl_requests
response = curl_requests.get(
"https://cloudflare-protected-site.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
},
timeout=30
)
if response.status_code == 200:
print("Access granted")
elif response.status_code == 403:
print("Blocked — may need additional measures")
elif response.status_code == 503:
print("Cloudflare challenge page — need browser execution")
代理哈特的住宅代理 提供在Cloudflare数据库中被分类为真实居住地址的IP,绕过IP声誉层. 看我们的 住宅代理与VPN的比较 为什么VPN的IP对Cloudflare失败了
战略2:浏览器-Grade TLS 指纹
云层检查 JA3/JA4 TLS 指纹 以识别连接客户端。 Python的音乐 requests 图书馆,去 net/http,和Node.js的默认客户端都产生Cloudflare旗下的非浏览器 TLS签名.
| 客户端 | 云浮结果 | 为什么 |
|---|---|---|
| Python 请求 | 被封锁或质疑 | OpenSSL TLS 指纹为非浏览器 |
| 卷曲 cffi( imperate=“ chrome” ) | 通常通过 | 缩写 Chrome BoringSSL 指纹 |
| 无头染色体( Puppeteer/ Playwright) | 通常通过 | 真正的 BoringSSL TLS 堆栈 |
| 净点/http | 被封锁或质疑 | 去加密/tls指纹是独特的 |
| 跟着UTLS走(Chrome Hello) | 通常通过 | 缩写 Chrome 指纹 |
战略3:处理爪哇脚本挑战
Cloudflare的JavaScript挑战需要真正的浏览器环境来解决. 有两种办法:
途径A:无头浏览器
// Node.js: Playwright with stealth for Cloudflare challenges
const { chromium } = require('playwright');
async function accessCloudflare(url) {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME',
password: 'PASSWORD'
}
});
const context = await browser.newContext({
locale: 'en-US',
timezoneId: 'America/New_York',
viewport: { width: 1920, height: 1080 }
});
const page = await context.newPage();
// Navigate and wait for Cloudflare challenge to resolve
await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
// Cloudflare challenges typically redirect after completion
// Wait for the actual content to load
await page.waitForSelector('body', { timeout: 30000 });
// Check if we passed the challenge
const title = await page.title();
if (title.includes('Just a moment') || title.includes('Attention Required')) {
// Challenge not yet resolved — wait longer
await page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 });
}
const content = await page.content();
await browser.close();
return content;
}
办法B:饼干提取和再使用
在无头浏览器中解决一次挑战,提取饼干(特别是) cf_clearance),然后在轻量级的HTTP客户端中重复使用:
// Node.js: Extract Cloudflare cookies for reuse
const { chromium } = require('playwright');
async function extractCfCookies(url) {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME-session-cf1',
password: 'PASSWORD'
}
});
const context = await browser.newContext({
locale: 'en-US',
timezoneId: 'America/New_York',
});
const page = await context.newPage();
await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
// Wait for challenge resolution
await page.waitForTimeout(10000);
// Extract cookies
const cookies = await context.cookies();
const cfClearance = cookies.find(c => c.name === 'cf_clearance');
const userAgent = await page.evaluate(() => navigator.userAgent);
await browser.close();
return { cookies, userAgent, cfClearance };
}
// Reuse cookies with got-scraping (same proxy session!)
import { gotScraping } from 'got-scraping';
const { cookies, userAgent } = await extractCfCookies('https://example.com');
const cookieString = cookies.map(c => `${c.name}=${c.value}`).join('; ');
const response = await gotScraping({
url: 'https://example.com/api/data',
proxyUrl: 'http://USERNAME-session-cf1:PASSWORD@gate.proxyhat.com:8080',
headers: {
'Cookie': cookieString,
'User-Agent': userAgent, // Must match the browser that solved the challenge
}
});
重要内容 : 这个 cf_clearance cookie绑定在解决挑战的IP地址和用户代理. 您在重新使用时必须使用相同的代理会话( sticky IP) 和相同的用户代理 。
战略4:要求优化模式
Cloudflare的行为分析标记了非人类的要求模式. 遵循这些合法访问模式:
真实的导航流程
# Python: Realistic navigation pattern
from curl_cffi import requests as curl_requests
import time
import random
session = curl_requests.Session(impersonate="chrome")
session.proxies = {
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
# Step 1: Visit homepage first
home = session.get("https://example.com")
time.sleep(random.uniform(2.0, 4.0))
# Step 2: Navigate to category (with Referer)
category = session.get(
"https://example.com/products",
headers={"Referer": "https://example.com"}
)
time.sleep(random.uniform(1.5, 3.5))
# Step 3: Browse items (with proper Referer chain)
for item_url in item_urls[:20]:
item = session.get(
item_url,
headers={"Referer": "https://example.com/products"}
)
time.sleep(random.uniform(1.0, 3.0))
费率限制准则
| 云层 | 安全请求率 | 请求之间的延迟 |
|---|---|---|
| 基本/免费 | 20-30雷克/分钟 | 2-3秒 |
| 赞成 | 10-20雷克/分钟 | 3-6秒 |
| 商业 | 5-10雷克/分钟 | 6-12秒 |
| 企业 | 2-5雷克/分钟 | 12-30秒 |
战略5:处理共同云层反应
| 身份代码 | 含义 | 行动 |
|---|---|---|
| 200个 | 成绩 | 分析内容通常 |
| 403 (韩语). | 禁止 - IP 或指纹被屏蔽 | 旋转到一个新的 IP, 检查 TLS 指纹 |
| 429个 | 费率限制 | 以指数方式退后, 降低请求率 |
| 503 (简体中文). | JavaScript 挑战 | 使用无头浏览器解决 |
| 520-527 (韩语). | Cloudflare 服务器错误 | 延迟后重试——源服务器问题 |
# Python: Response handling with retry logic
import time
import random
def cloudflare_resilient_request(session, url, max_retries=3):
for attempt in range(max_retries):
try:
response = session.get(url, timeout=30)
if response.status_code == 200:
return response
if response.status_code == 403:
# IP flagged — rotate session
print(f"403 on attempt {attempt + 1} — rotating IP")
session = create_new_session()
time.sleep(random.uniform(5, 10))
continue
if response.status_code == 429:
# Rate limited — exponential backoff
wait = (2 ** attempt) * 5 + random.uniform(0, 5)
print(f"429 — waiting {wait:.1f}s")
time.sleep(wait)
continue
if response.status_code == 503:
# JS challenge — need headless browser
print("503 — JavaScript challenge detected")
return None # Escalate to browser-based approach
except Exception as e:
print(f"Error: {e}")
time.sleep(random.uniform(2, 5))
return None
完成多层方法
最可靠的策略结合了所有层面:
- 住宅代理: 代理哈特住宅IPs 为了干净的IP声誉。
- 浏览器级 TLS :
curl_cffi或用于正确指纹的无头浏览器。 - 一致标题 : 匹配所主张浏览器的完整头集 。
- 自然时间 : 随机延迟遵循人类浏览模式.
- Cookie 管理器 : 在整个会话中接受并保持饼干.
- 参考链 : 从主页到目标页的正确导航流.
关于综合减少侦测战略,见我们 完整的反检测指南关于不同编程语言的代理集成,见我们的指南 Py, (中文). 节点.js,以及 走开。 。 。
当不是到Scrape时
承认刮刮不正确做法的情况:
- 该网站有一个公开的API: 可用时始终使用官方API.
- 数据是认证的背后: 通过刮刮获取登录保护的数据,一般是违反TOS的。
- 该网站明确禁止刮刮: 遵守《条约》中的明确禁令。
- 数据许可: 就商业用途而言,购买数据许可证往往更加可靠和合法。
- 内容有版权: 为重新分配而搜索版权内容引起了法律关切。
参见 代理哈特的文档 负责制定负责任的使用准则和服务条件。






