如何使用 Go (chromedp + Scrapeless) 解决 Cloudflare 问题
Lead Scraping Automation Engineer
TL;DR:
- Cloudflare 评分的是浏览器,而不是访问者。 它读取指纹一致性、行为信号和出口 IP,然后为它信任的浏览器设置
cf_clearancecookie - 所以在 Go 中清除它意味着 成为 一个受信任的浏览器,而不是回答谜题。 - 本地 Go 浏览器在三个方面得分失败:
navigator.webdriver标志、无头默认指纹和数据中心出口 IP。手动维护规避措施就像在跑步机上。 - 无废抓取浏览器在渲染时清除了挑战 - 真正自研的 Chromium、一致的每会话指纹和在 195 个国家的住宅出口,通过一个 WebSocket 端点连接。
- 你的 Go 仍然是标准的 chromedp。 将
chromedp.NewRemoteAllocator指向无废端点,等待挑战后内容,然后读取页面 - 唯一的改变是连接 URL。 - 实时验证: 一个 Go 的 chromedp 会话通过云浏览器清除了 Cloudflare 挑战页面,读取成功标记
你绕过了 Cloudflare 挑战!:D并收到了cf_clearancecookie。 - 免费开始。 新的无废账户包括免费的抓取浏览器运行时 - 在 app.scrapeless.com 注册。
引言:在 Go 中清除 Cloudflare 是一个浏览器问题
Cloudflare 挑战并不是一个你能够解码的图像 CAPTCHA。它在后台运行并评估加载页面的浏览器 - 无论指纹是否内部一致,交互信号是否看起来像人类,以及出口 IP 是否具有良好声誉。当得分通过时,Cloudflare 设置 cf_clearance cookie,真正的页面加载。反之,当得分不通过时,你将获得一个插页而不是内容。
这重新框定了 Go 的任务。没有答案可以提交 - 工作是呈现一个 Cloudflare 已经信任的浏览器。一个由 chromedp 驱动的本地无头 Chromium 无法做到:它通过 the navigator.webdriver 属性 宣布自动化,使用无头默认字体和画布行为,并从其已经知道的 IP 声誉退出。你可以维护自己的规避措施,然后随着 Chromium 和检测器的发展不断维护它们。本指南走较短的路径:从标准的 chromedp 驱动无废抓取浏览器,因此指纹、行为和出口 IP 都在服务器端处理,并且挑战在正常渲染过程中被清除。
Cloudflare 实际检查的内容
Cloudflare 的官方文档 描述了一个在不打断访问者的情况下运行的验证步骤。实际上,它评估三件事并授予 cf_clearance cookie - 当它们通过时为标准 HTTP cookie:
| Cloudflare 读取的内容 | 本地 Go 浏览器为何失效 |
|---|---|
| 指纹一致性 | 无头默认和 webdriver 标志与真实 Chrome 相矛盾 |
| 行为信号 | 没有连贯浏览器表面的脚本定时 |
| 出口 IP 声誉 | 数据中心 IP 得分低于住宅 IP |
一个连贯的、受信任的浏览器比任何单一的规避措施更重要 - 这就是为什么将所有三个因素移动到服务器端比手动补丁更持久的原因。
为什么选择无废抓取浏览器
无废抓取浏览器 是一个可定制的、抗检测的云浏览器,专为网页爬虫和 AI 代理设计。针对 Cloudflare 特别带来了:
- 真正自研的 Chromium,能够像 Chrome 一样准确运行挑战 JavaScript,因此可以解析而不是停滞。
- 一致的每会话指纹 - 无
navigator.webdriver标志,无无头默认设置泄露。 - 在 195 个国家的住宅出口 - Cloudflare 评分出口 IP,住宅区域的得分优于数据中心 IP。
- 会话持久性 使得
cf_clearance授权可以在同一会话中的请求之间重用。 - 单一连接界面 - 每个选项都是相同 WebSocket 端点上的查询参数。
在 app.scrapeless.com 的免费计划上获取你的 API 密钥。
先决条件
- 一个 Go 工具链(Go 1.21 或更新版本)
github.com/chromedp/chromedp和github.com/chromedp/cdproto- 一个无废账户和 API 密钥 - 在 app.scrapeless.com 注册
完整的连接细节可以在 Scraping Browser 文档 中找到。
安装
将 chromedp 拉入您的模块中。您将连接到远程浏览器,因此不需要本地 Chrome。
bash
go get github.com/chromedp/chromedp
go get github.com/chromedp/cdproto
export SCRAPELESS_API_KEY=your_api_token_here # 免费密钥请访问 https://app.scrapeless.com
连接并清除挑战
chromedp 使用 NewRemoteAllocator 连接到远程浏览器。传递 Scrapeless 端点,并使用 chromedp.NoModifyURL 使 chromedp 按原样使用 WebSocket URL,然后等待挑战后内容。在渲染期间解决挑战——没有单独的解决调用。
注意:运行此代码需要安装 chromedp 模块的 Go 工具链。此代码块已在 Scrapeless 云浏览器上进行实时验证;请添加您的 API 密钥并运行
go run以重现。
go
package main
import (
"context"
"fmt"
"net/url"
"os"
"time"
"github.com/chromedp/cdproto/network"
"github.com/chromedp/chromedp"
)
func main() {
q := url.Values{}
q.Set("token", os.Getenv("SCRAPELESS_API_KEY"))
q.Set("sessionTTL", "180")
q.Set("proxyCountry", "US")
endpoint := "wss://browser.scrapeless.com/api/v2/browser?" + q.Encode()
target := "https://www.scrapingcourse.com/cloudflare-challenge"
allocCtx, cancel := chromedp.NewRemoteAllocator(context.Background(), endpoint, chromedp.NoModifyURL)
defer cancel()
ctx, cancel2 := chromedp.NewContext(allocCtx)
defer cancel2()
ctx, cancel3 := context.WithTimeout(ctx, 120*time.Second)
defer cancel3()
var cleared string
var cookies []*network.Cookie
err := chromedp.Run(ctx,
chromedp.Navigate(target),
chromedp.WaitVisible("#challenge-title", chromedp.ByID),
chromedp.Text("#challenge-title", &cleared, chromedp.ByID),
chromedp.ActionFunc(func(ctx context.Context) error {
c, err := network.GetCookies().Do(ctx)
cookies = c
return err
}),
)
if err != nil {
fmt.Println("错误:", err)
os.Exit(1)
}
hasClearance := false
for _, c := range cookies {
if c.Name == "cf_clearance" {
hasClearance = true
}
}
fmt.Println("清除:", cleared)
fmt.Println("cf_clearance:", hasClearance)
}
此程序的实时运行打印了 清除: 您已绕过 Cloudflare 挑战!:D 和 cf_clearance: true——标准的 chromedp,通过云浏览器获取。
在免费计划中获取您的 API 密钥:app.scrapeless.com
钉住地区以获得可靠的清除
Cloudflare 会评分出口 IP,因此将 proxyCountry 钉住在一个住宅地区。可以设置为任意 ISO 国家代码。W3C WebDriver 规范 要求符合的自动化要公开 webdriver 标志;云浏览器不携带它,因此干净的 IP 会有干净的指纹。
go
q := url.Values{}
q.Set("token", os.Getenv("SCRAPELESS_API_KEY"))
q.Set("sessionTTL", "180")
q.Set("proxyCountry", "US") // 或 "DE", "JP", "ANY"
本地 Go 浏览器的限制
本地 chromedp 抓取器在 Cloudflare 开始评分浏览器时仍然可以运行。然后,无头指纹、webdriver 标志和数据中心 IP 会各自失败不同的检查,中间页面会替换内容。这些是指纹、行为和 IP 问题——云浏览器在服务器端处理这三者。连接到 Scrapeless 会将它们交给托管会话,而您的 chromedp 操作保持标准。
您得到的反馈
会话表现得像任何 chromedp 会话——Navigate、WaitVisible、Text 和 CDP network.GetCookies 都能正常工作。一些通过云浏览器清除 Cloudflare 的诚实观察:
navigator.webdriver缺失,因此 Cloudflare 运行的第一个检查看起来像真实的 Chrome。- 出口 IP 匹配
proxyCountry——一个住宅地区比数据中心 IP 更可靠地清除。 - 在通过后存在
cf_clearance——重复使用相同的会话以携带授权在后续请求中。 - 为顽固页面加热会话——在访问受保护页面之前,先在同一会话中加载网站的首页,这样行为表面看起来像正常访问。
结论:清除 Cloudflare,保持您的 Go
在Go中清除Cloudflare并不是解码挑战,而是展示一个Cloudflare所信任的浏览器。Scrapeless Scraping Browser处理其得分的三个要素(指纹、行为、出口IP)在服务器端,因此您的chromedp代码只需更改其连接URL。将proxyCountry固定到居民区,等待挑战后的内容,并读取cf_clearance以确认通过。如需从Python运行相同的云浏览器,请参阅Scrapling生产抓取器指南,并在Scrapeless定价页面上比较计划。
准备好构建您的Cloudflare清除管道了吗?
加入我们的社区以获得免费计划,并与抓取受Cloudflare保护网站的开发人员连接:Discord · Telegram。
在app.scrapeless.com注册以获得免费的抓取浏览器运行时,并将chromedp指向在渲染过程中清除Cloudflare的云浏览器。
常见问题
问:我需要单独的验证码解决服务吗?
在通过的浏览器上不需要。Cloudflare主要在后台评分指纹、行为和IP,并发出cf_clearance Cookie。云浏览器旨在在正常渲染期间通过该评分,因此无需设置单独的难题步骤。
问:为什么使用NewRemoteAllocator和NoModifyURL?
NewRemoteAllocator将chromedp附加到未启动的浏览器。NoModifyURL指示chromedp完全按照给定的Scrapeless WebSocket URL使用,而不是重写它以发现本地DevTools端点。
问:我需要代理吗?
不需要。住宅出口内置——将proxyCountry设置为一个地区或ANY。Cloudflare评分出口IP,因此住宅区域比数据中心地址更可靠地清除。
问:为什么在某些页面上仍然显示挑战——有什么帮助?
将proxyCountry固定到居民区,并通过先在同一会话中加载站点的主页,然后再加载受保护的页面来预热会话,这样行为表面看起来就像正常访问。
问:清除Cloudflare合法吗?
访问公开可用的数据通常是被允许的,但规则因司法管辖区和网站而异。审查目标的服务条款,遵守机器人指令,并就任何敏感事项咨询法律顾问。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



