前言

在开发自动化脚本或爬虫程序时,经常会遇到Cloudflare验证的阻碍。最近发现我写的自动签到脚本突然报错了,执行请求返回的状态码为500,检查日志发现返回的HTML是Cloudflare验证拦截页面。PyPI上有几个绕过Cloudflare的库,但都很久没更新了,使用请求回来的HTML还是Cloudflare验证页面。经过一番探索,发现cloudscraper这个库,虽然PyPI上的版本是1.2.71(无法绕过),但它在GitHub上仍在更新,使用效果非常不错。

什么是Cloudflare验证?

Cloudflare验证是网络安全服务商Cloudflare提供的一套自动化风险识别系统。Cloudflare验证是指通过Cloudflare服务进行的一系列安全验证机制,用于确认用户访问行为的合法性,同时保护网站免受恶意攻击或流量滥用。Cloudflare作为全球知名的CDN(内容分发网络)和网络安全服务商,其验证体系主要依托于智能流量分析、人机识别技术及安全策略,实现对访问请求的筛选与管理。

Cloudflare如何拦截爬虫?

Cloudflare的WAF(Web 应用防火墙)通过多维特征识别机器人:

  • TLS指纹(JA3):验证客户端环境真实性
  • HTTP/2指纹:匹配已知机器人参数
  • HTTP细节:异常Header/Cookie检测
  • JS指纹:收集浏览器/硬件信息
  • 行为分析:监测请求频率、鼠标轨迹等

一旦Cloudflare检测到可疑的机器人活动,就会发起后台JavaScript挑战;如果无法通过该挑战,就会要求用户输入CAPTCHA验证码。
Cloudflare验证流程图

cloudscraper库

简介

cloudscraper是一个基于requests库的Python第三方库,专门设计用于绕过Cloudflare的安全验证机制。它的工作原理是模拟真实浏览器的行为,执行 Cloudflare 页面上的JavaScript代码,从而获取合法的访问凭证。与其他类似库相比,cloudscraper的优势在于持续更新以应对Cloudflare不断变化的验证算法,而且使用起来非常简单。

安装

目前pip install cloudscraper安装的是PyPI上的1.2.71版本,可能无法绕过一些网站Cloudflare验证,推荐安装GitHub上的版本:

pip install git+https://github.com/VeNoMouS/cloudscraper.git

基础用法

import cloudscraper

# 创建一个scraper对象
scraper = cloudscraper.create_scraper()

# 像使用requests一样使用scraper
response = scraper.get("https://example.com")

# 输出响应内容
print(response.text)

在大多数情况下,执行上面的代码就可以成功绕过Cloudflare的验证,获取到正常的页面内容。

高级用法

有些网站会根据请求头信息来判断请求是否来自真实用户,因此在使用cloudscraper时,最好添加一些自定义的请求头:

import cloudscraper

scraper = cloudscraper.create_scraper(
    interpreter="js2py",
    delay=5,
    enable_stealth=True,
    stealth_options={
        "min_delay": 2.0,
        "max_delay": 6.0,
        "human_like_delays": True,
        "randomize_headers": True,
        "browser_quirks": True,
    },
    # Browser emulation
    browser="chrome",
    # Debug mode
    debug=False,
)

# 请求头
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',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Connection': 'keep-alive'
}

# 发送POST请求  
data = {"key": "value"}  

response = scraper.post("https://example.com", data=data, headers=headers)
print(response.text)

更多使用示例,请访问GitHub上的cloudscraper-Enhanced Edition项目。

总结

cloudscraper是一个非常实用的Python库,使用的非常的简单,可以帮助我们绕过Cloudflare的验证机制,获取被保护的网页内容。它简单易用,而且持续更新以应对Cloudflare不断变化的安全策略。当然,在使用过程中我们也要注意合法合规,避免给目标网站带来不必要的负担。