Cloudflare 在安全性和性能方面具备双重功能。其全球网络加快了内容交付速度,保护网站免受爬虫攻击和恶意行为工具的侵扰。但是,如果您想抓取 Cloudflare 保护下的网站,就会遇到问题。
本文中,您将了解在不被屏蔽的情况下绕过 Cloudflare 保护进行网页抓取的一些最佳方法。
了解 Cloudflare 的运行机制
为了保护网络应用程序免受分布式拒绝服务(DDoS)和零日攻击等威胁,Cloudflare 提供 网络应用程序防火墙(WAF) 服务,该服务在 Cloudflare 全球网络上运行,位于网络应用程序前端,以实时阻止攻击。Cloudflare 在其防御机制中使用一种可能针对以下特征的专有算法来检测和阻止恶意爬虫:
- 传输层安全(TLS)指纹: 通过 HTTPS 向服务器发送请求时,服务器和客户端会生成一个名为 JA3 的指纹。JA3 指纹可以唯一识别客户端及其功能和配置。Cloudflare 利用此指纹来确定客户端是真实用户还是自动爬虫。
- HTTP/2 指纹: HTTP/2 指纹识别的运行原理与 TLS 指纹识别类似,但 HTTP/2 指纹识别会使用客户端发送的 HTTP/2 参数生成指纹,然后将其与已知的爬虫指纹进行比较。
- HTTP 详细信息: Cloudflare 会查看 HTTP 请求的详细信息,例如 HTTP 标头和 cookie,以检测爬虫使用的典型配置。
- JavaScript 指纹: Cloudflare 使用 JavaScript 脚本来提取有关客户端的详细信息,例如浏览器、操作系统和硬件详细信息。然后使用这些详细信息来确定客户端是否是爬虫。
- 行为分析: 检测爬虫的主要方法之一是通过其行为。如果客户端在短时间内发送了过多请求,则很可能是爬虫。Cloudflare 还会关注用户行为,例如鼠标移动和空闲时间,并使用机器学习来识别流量是否来自爬虫。
如果 Cloudflare 怀疑存在类似爬虫的行为,则会生成需要客户端解决的 JavaScript 挑战。这类挑战是非交互式的,对用户不可见,并且在后台进行验证。如果 JavaScript 挑战未能产生特定结果,则会向用户显示一个简单的验证码,如下所示:
绕过 Cloudflare 的技巧
既然您已经明白了 Cloudflare 的运行原理,让我们来了解一些可以用来绕过 Cloudflare 的方法。由于 Cloudflare 使用复杂的专有算法来检测爬虫,因此以下方法无法确保有效。您需要尝试不同的方法,找出最适合您的用例的方法。
利用代理解决方案
Cloudflare 检测爬虫最常见的方法之一是查看从特定 IP 地址发送的请求数量。如果特定的 IP 地址在短时间内连续发送了过多请求,则很可能是网络抓取器所为。
为了减少在这种情况下 Cloudflare 对您进行封禁的可能性,您可以使用带有 IP 地址轮换的代理服务器。通过代理轮换,您可以在捕获当前代理后立即切换代理。
虽然没有专用于绕过 Cloudflare 的代理服务器,但大多数高级住宅代理都可以逃避 Cloudflare 的爬虫检测,并取得不同程度的成效。但是,请记住,如果 Cloudflare 采用用户-代理(User-Agent)检测,则此方法不起作用。无论您使用哪种代理,用户代理都可以识别请求是否来自爬虫。如果您遇到这种情况,则应使用 “User-Agent 伪装”,我们接下来会讨论这个问题。
不确定要选择哪种轮换代理?请参阅我们今年的十大热门选择。
伪装 HTTP 标头
HTTP 标头提供有关发出请求的客户端的关键信息。Cloudflare 经常检查这些标头以确定流量来源。真正的浏览器通常会发送复杂的标头集合,而抓取器只能使用少量标头。
值得庆幸的是,几乎所有可用于编写抓取器的工具都提供了一种修改或添加标头的方法,这可以协助它们看起来更像真正的浏览器。以下是您可以使用的一些最常用的标头:
User-Agent 标头
User-Agent
标头用于识别浏览器和操作系统。Cloudflare 可能会阻止来自异常或已知爬虫 User-Agent 字符串的请求。通过伪装此标头来模仿合法浏览器(例如 Chrome、Firefox、Safari),脚本就可以逃避检测。例如,如果您使用的是 Python 请求
库,则可以像这样设置 User-Agent
标头:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get('http://httpbin.org/headers', headers=headers)
print(response.status_code)
print(response.text)
Referer 标头
Cloudflare 可能会检查 Referer
标头,以确定请求是否来自可信来源。通过将此标头设置为合法的 URL,攻击者可以使其请求看起来像来自可信上下文:
import requests
headers = {
'Referer': 'https://trusted-website.com'
}
response = requests.get('http://httpbin.org/headers', headers=headers)
print(response.status_code)
print(response.text)
Accept 标头
Accept
标头会向服务器客户端通报可以处理的内容类型。合法浏览器通常会发送一组复杂的 Accept
标头,您可以模仿这些标头以便避开检测:
import requests
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
response = requests.get('http://httpbin.org/headers', headers=headers)
print(response.status_code)
print(response.text)
除了这些常用标头之外,Cloudflare 还通过检查是否存在不匹配标头或过期标头来检测爬虫。例如,如果您将 Firefox 用户代理与 Sec-CH-UA-Full-Version-List
一起使用,则可能遭到屏蔽,因为 Firefox 不支持此标头。
要了解有关用于网页抓取的 HTTP 标头的更多信息,请参阅此处。
实现验证码解析服务
通常,如果所有其他检测方法均无法产生明确结果,则 Cloudflare 会向可疑客户端发出验证码。Cloudflare 还提供 Turnstile 作为一种轻量级方法,无需使用 Cloudflare CDN 即可在网站的任何地方发出挑战。Turnstile 使用向浏览器发出的非交互式挑战来检测爬虫,但可以使用简单的交互式验证码(例如复选框),这可能会对网络抓取器构成挑战。
有多种服务提供验证码解析服务。这些服务通常将验证码发送给真人,由他们解析验证码并返回结果。
使用强化的无头浏览器
为了应对 Cloudflare 的 JavaScript 挑战,您的网络抓取器需要模仿真实的浏览器行为,例如 JavaScript 执行和 cookie。
要模拟真实浏览器,您可以使用无头浏览器工具,例如 Selenium。由于 Cloudflare 会检查典型的浏览行为,例如滚动、鼠标移动和点击,而 Selenium 等自动化工具可以模拟这些行为,欺骗 Cloudflare 相信请求来自合法用户。无头浏览器也可以绕过 Cloudflare 的画布指纹识别。
但是,Selenium 及类似工具主要是为自动化检测而创建的,而不是为抓取而创建的。这意味着它们会蓄意显示某些特征,而 Cloudflare 可以利用这些特征来识别无头浏览器。例如,Selenium 显示出 JavaScript 属性 navigator.webdriver
。
为了防止出现这种情况,有一些插件可以通过修补这些漏洞来协助强化无头浏览器。适用于 Selenium 的 undetected_chromedriver 插件,以及适用于 Playwright 和 Puppeteer 的 puppeteer-extra-plugin-stealth 插件是此类插件的常见示例。
以下是展示如何使用 undetected_chromedriver 插件的代码片段:
import undetected_chromedriver.v2 as uc
driver = uc.Chrome()
with driver:
driver.get('https://example.com')
为了使无头浏览器具备针对 Cloudflare 的更强抵御能力,您可以将其与优质代理服务配对,如下所示:
chrome_options = uc.ChromeOptions()
proxy_options = {
'proxy': {
'http': 'HTTP_PROXY_URL',
'https': 'HTTPS_PROXY_URL'
}
}
driver = uc.Chrome(
options=chrome_options,
seleniumwire_options=proxy_options
)
请记住,浏览器更新频率高,这会引发新的弱点,从而有利于无头浏览器的识别。此外,Cloudflare 经常更新其算法以利用新的漏洞。因此,这些插件需要经常更新,如果不经常维护,则可能停止运行。
使用 Cloudflare 解算器
使用专用的 Cloudflare 解算器服务通常可以针对 Cloudflare 的基本保护获得良好结果(至少一段时间内如此)。很多 Cloudflare 解算工具会利用各种方法来绕过 Cloudflare。
例如, cloudscraper 是一个 Python 模块,它使用 JavaScript 引擎欺骗 Cloudflare 认为客户端支持 JavaScript。但是,自更新以来已有一年多,因此可能无法应对最新的 Cloudflare 更新。
高级技巧
如前所述,Cloudflare 使用多种方法来检测爬虫。通常情况下,如果单独使用,利用前述方法对抗 Cloudflare 的效果会较差。为了增加避开 Cloudflare 的可能性,建议混合使用不同的方法来尽可能模拟真实用户。
例如,您可以使用强化的无头浏览器来避开无头浏览器检测。然后,您还可以使用 B 样条曲线模拟鼠标移动,以模仿真人的鼠标移动。您可以将整个设置与具有轮换功能的住宅代理配对,以应对 IP 封禁并避免怀疑。为了提高安全性,您可以使用类似 Hazetunnel 的工具,它可以根据传递的用户代理来模仿真实浏览器的指纹。再加上验证码解算器服务,这类设置可以协助您绕过大多数 Cloudflare 检测。
Bright Data 整合解决方案
您可能已经注意到,避开 Cloudflare 的爬虫检测是一项无法保证成效的复杂任务。绕过 Cloudflare 迫使您花费大量时间修补工具,而不是专注于编写抓取器。
Bright Data 提供一系列工具,可助您轻松绕过 Cloudflare。其中一项工具是 Web Unlocker,这是 Bright Data 绕过包括 Cloudflare 在内的各种反爬虫检测的一项解决方案。Web Unlocker 的成功率可达 99.99%,可以使用人工智能来自动检测和实时解决网站封锁技术。它使用浏览器指纹识别、验证码解析、IP 轮换和请求重试等技术来解锁受 Cloudflare 保护的网站。
Web Unlocker 会自动使用最佳代理服务 来处理您的请求,并对其进行管理,从而提供顺畅体验。
开发者会获得非常便捷的 Web Unlocker 使用体验。当您注册 Web Unlocker 时,您将获得代理详细信息和凭据。只需像使用其他代理服务器一样使用即可:
import requests
host = 'brd.superproxy.io'
port = 22225
username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'
proxy_url = f'http://{username}:{password}@{host}:{port}'
proxies = {
'http': proxy_url,
'https': proxy_url
}
url = "http://lumtest.com/myip.json"
response = requests.get(url, proxies=proxies)
print(response.json())
可以协助您绕过 Cloudflare 的另一项工具是 Bright Data 的 Scraping Browser 抓取浏览器,这是 Bright Data 的另一种代理解锁解决方案。Scraping Browser 抓取浏览器在 Bright Data 托管的远程浏览器上运行您的代码,可以利用多个代理网络,进行无缝处理并解锁受 Cloudflare 保护的站点。
Scraping Browser 抓取浏览器可以与 Puppeteer、Selenium 和 Playwright 集成,提供全面的无头浏览器体验。
结论
Cloudflare 凭借其网络应用程序防火墙(WAF)产品成为互联网的重要组成部分。一方面,它可以保护网站免受合法威胁,但另一方面,它也会屏蔽无害的网络抓取器。本文中,您了解了 Cloudflare 的爬虫检测运行原理以及如何绕过它。
避开 Cloudflare 可能很复杂,而且收效程度各不相同。与其不停修补解决方案,不如考虑使用 Bright Data 的产品,例如 Web Unlocker、 Scraping Browser 和 Web Scraper API。仅需几行代码,即可获得更高的成功率,而不必担心管理复杂的解决方案。
立即注册 即可免费试用!