在开发Rate Your Music网站爬虫时,发现常规的爬虫手段难以采集数据,最主要的原因是该网站接入了Cloudflare防护机制,可以将常规爬虫全部拦截下来。为了保障Rate Your Music网站的数据能最终采集交付,因此需要对Cloudflare防护机制及破解方案进行研究,以下方案仅供参考。
Cloudflare五秒盾(也称为5秒盾或托管质询)是Cloudflare提供的一种安全机制,主要用于防御恶意爬虫和机器人对网站的攻击。它通过检测用户的请求流量和行为模式来识别并阻止恶意访问。当一个用户访问网站时,五秒盾会评估其行为模式、IP地址、用户代理等信息,以确定其是否为正常用户。
五秒盾的工作原理包括使用JavaScript代码执行一系列检测,判断请求是否来自真实用户。如果JavaScript代码在5秒内运行完成,说明这个请求来自真实用户,否则会被拦截。此外,五秒盾还可能通过IP封禁、人机验证、JavaScript挑战等方式来进一步识别和拦截爬虫。
响应头里面的Server是cloudflare
浏览器无痕模式下访问网站,首先会让你进行真人验证
我们通过requests请求后,响应状态码是403,返回的Html页面中会出现 Just a moment...
看到网上很多文章提到可以通过cloudscraper库绕过一些免费版的Cloudflare五秒盾。但实际使用上效果并不理想,依然会被Cloudflare拦截。原因是免费版Cloudflare也已经可以通过JA3指纹来识别恶意请求了,而cloudscraper库的JA3指纹很明显能够被识别。
JA3指纹是一种从SSL/TLS Client Hello数据包中提取字段并生成指纹用以识别特定客户端的技术,它于它不会随着客户端更换IP或者User-Agent而改变。JA3指纹从一开始就说明客户端应用程序是否存在恶意。
JA3 在SSL/TLS握手期间解析客户端发送的Client Hello数据包,收集以下字段的十进制字节值:TLS Version、Accepted Ciphers、List of Extensions、Elliptic Curves和Elliptic Curve Formats。然后,它将这些值串联起来,使用“,”来分隔各个字段,同时使用“-”来分隔各个字段中的值。最后,计算这些字符串的md5哈希值,即得到易于使用和共享的长度为32字符的指纹。
简答来说,Cloudflare通过JA3指纹来识别恶意请求,可轻易拦截常规的爬虫程序,原因就是这些爬虫程序所依赖的网络客户端的JA3指纹和真实浏览器的JA3指纹不同。所以需要一个可以完美模拟真实浏览器JA3指纹的工具进行数据爬取。
为了完美模拟浏览器JA3指纹,国外大佬给curl工具打了一些patch,把相应组件全部都换成与浏览器相同的组件,连版本都保持一致,这样就得到了和浏览器完全一样的JA3指纹,这个库是curl-impersonate,相应的python工具为curl_cffi。
如下图所示,分别使用scraper、requests、curl_cffi工具请求https://toppsta.com网站,只有curl_cffi能够正常返回数据,scraper、requests均被Cloudflare拦截。
对于付费版的Cloudflare五秒盾,curl_cffi也爬不到数据,毕竟curl_cffi无法真正的模拟浏览器处理Cloudflare的JavaScript挑战,更不用说接下来的人机验证了。
如下图所示,分别使用scraper、requests、curl_cffi工具请求https://rateyourmusic.com/网站,全部被Cloudflare拦截。
现阶段,对于付费版的Cloudflare五秒盾,有没有什么办法绕过呢?下面介绍一个方案,通过Docker运行一个Flaresolverr代理服务的容器就可以了。启动命令如下:
docker run -d \
--name=flaresolverr \
-p 8191:8191 \
-e LOG_LEVEL=info \
--restart unless-stopped \
ghcr.io/flaresolverr/flaresolverr:latest
使用示例如下:
import requests
import json
url = "http://localhost:8191/v1"
payload = json.dumps({
"cmd": "request.get",
"url": "https://rateyourmusic.com/",
"maxTimeout": 60000
})
headers = {
'Content-Type': 'application/json'
}
res = requests.post(url, headers=headers, data=payload)
print(res.status_code)
为什么FlareSolverr能够绕过付费版的CloudFlare五秒盾?通过阅读项目源代码,总结了一下FlareSolverr这个项目的亮点,主要体现在以下几个方面:
1、动态解析和执行JavaScript:FlareSolverr能够解析和执行Cloudflare的JS代码,这样就可以模拟浏览器行为并执行页面中的JavaScript,以获取真实的网页内容。
2、自动化处理验证页面:它在容器内部运行一个Webdriver的服务,用于自动处理Cloudflare验证页面。这种自动化处理方式相对于手动模拟浏览器操作更加高效和方便,减少了人工干预的需要。
3、缓存和复用验证结果:FlareSolverr具有缓存机制,可以将已经解析和验证过的网站结果缓存起来,并在后续的请求中进行复用。这样可以减少重复的验证过程,提高访问速度和效率。
4、集成度和依赖性:FlareSolverr是一个专门为解决Cloudflare绕过而设计的工具,它可以作为独立的服务部署,对外提供API接口。
5、环境隔离和资源消耗:FlareSolverr使用了容器化技术,在独立的环境中执行验证操作,避免了对本地环境的影响。
总体而言的话,FlareSolverr在处理 Cloudflare绕过上面提供了一种更加集成化、自动化和高效的解决方案,相对于手动模拟浏览器操作或使用Selenium等方式,可以节省开发和维护的成本,并提供更好的性能和可靠性。
对于付费版的Cloudflare五秒盾提供另一个解决方案,即使用DrissionPage网页自动化技术。DrissionPage是一个基于python的网页自动化工具。它既能控制浏览器,也能收发数据包,还能把两者合而为一。DrissionPage具有较强的反检测机制,能够在不需要进行任何反检测操作的情况下,绕过国内外绝大多数网站的自动化检测。这些特点使得DrissionPage在爬虫和自动化任务中非常强大和方便。
具体示例如下:
1、 安装DrissionPage库:
pip install DrissionPage
2、使用DrissionPage绕过Cloudflare五秒盾(爬取Rate Your Music网站的核心代码):
import time
import random
from DrissionPage import ChromiumPage, ChromiumOptions
URL = 'https://rateyourmusic.com/genre/{genre}/{page}.d/'
def browse_rym(genre):
# 本程序中总页数设定为250,实际会根据具体情况设定
crwal,pages = 0, 250
print("genre=%s, pages=%s" % (genre, pages))
# 每爬40页重新启动一次浏览器,同一浏览器环境下访问次数太多,会被拦截
for page40 in range(1, pages, 40):
# 启动浏览器,auto_port参数意味着每次启动都是一个全新的浏览器
browser = ChromiumPage(ChromiumOptions().auto_port())
try:
# 自动化翻页采集数据
for page in range(page40, page40 + 40 if (page40 + 40) < pages else pages):
try:
# 基于DrissionPage控制浏览器访问页面
browser.get(URL.format(genre=genre, page=page))
# 每访问一次页面,需短暂休眠,频率太高IP会被封
time.sleep(random.randint(3, 8))
finally:
# 获取页面Html内容,可解析页面中的数据
print(browser.html)
finally:
# 关闭浏览器
browser.quit()
本次爬取Rate Your Music网站数据采用该方案,主要是因为Rate Your Music网站对爬虫请求频率及次数控制相当严格,无法像常规爬虫那样大规模的、高并发的采集数据。而DrissionPage提供了更为灵活的、能够绕过Cloudflare检测机制的自动化技术,更能精确的控制爬取行为,以免因为爬虫行为不当而造成封锁拦截。
最后,再介绍一个付费方案,使用穿云API绕过Cloudflare五秒盾的反爬机制。穿云API作为一种应对Cloudflare反爬虫机制的解决方案,具有许多优势。首先,它能够突破Cloudflare的5秒盾WAF、CC防护等机制,确保我们的爬虫程序能够顺利访问目标网站。其原理是让爬虫发出的http请求更难被识别出来是机器人,穿云API只会尽可能绕过Cloudflare验证码,让Cloudflare验证码不出现,直接访问目标网址,并不是自动去点击Cloudflare验证码。
具体示例如下:
1、 注册购买:
2、 获取API令牌:
3、 爬虫接入:
# -*- coding: utf-8 -*-
import requests
url = "https://api.cloudbypass.com/genre/house/1.d/"
method = "GET"
headers = {
"x-cb-apikey": r"99ad10f3469643458490e2ae11e5eaa7",
"x-cb-host": r"rateyourmusic.com",
}
response = requests.request(method, url, headers=headers)
print(response.text)
亲测有效,接入方便。
最后对比下curl_cffi、FlareSolverr、DrissionPage和穿云API这四种绕过Cloudflare五秒盾的工具的优劣势:
优势:
1、简单易用:curl_cffi是基于CURL库的Python绑定,语法简单,易于学习和使用。
2、伪装能力强:它能够生成与浏览器一致的指纹,从而更好地模拟用户行为
劣势:
1、兼容性问题:有证据表明curl_cffi在某些情况下可能会失败,无法有效绕过付费版的Cloudflare五秒盾。
2、更新频率低:开源工具如curl_cffi可能因为Cloudflare的频繁更新而逐渐失效。
优势:
1、环境隔离:FlareSolverr使用了容器化技术,在独立的环境中执行验证操作,避免了对本地环境的影响。
2、高效且内存友好:FlareSolverr利用Selenium和ChromeDriver,能够在较低的资源消耗下高效绕过Cloudflare的防护.
3、自动化程度高:FlareSolverr是一个专门为解决Cloudflare绕过而设计的工具,FlareSolverr可以自动处理Cloudflare的防护机制,用户只需输入目标网站的URL即可。
劣势:
1、依赖于开源社区:作为一个开源项目,FlareSolverr可能会因为Cloudflare的更新而变得过时。
2、维护成本高:需要定期检查和更新以应对Cloudflare的新策略。
优势:
1、语法简洁,使用方便:DrissionPage的语法简洁,易于上手,适合初学者使用。
2、强大的反检测机制:拥有较强的反检测机制,能够有效绕过国内外绝大多数网站的自动化检测。目前不需要做任何反检测的操作就可以绕过大多数网站的自动化检测,简化了操作流程。
劣势:
1、开发成本大:虽然在绕过自动化检测方面表现出色,但需要编写大量的爬虫程序,设定爬虫策略。
2、缺乏广泛支持:相对于其他工具,DrissionPage的知名度和支持度较低,可能会影响其稳定性和可靠性。
优势:
1、高效的数据采集能力:穿云API能够轻松绕过Cloudflare反爬虫机制,实现高效的数据采集。
2、灵活应对大规模请求:能够应对大规模请求,提高爬虫的效率和可靠性。
劣势:
1、依赖于代理服务:需要依赖于代理服务,可能存在一定的安全风险和隐私泄露问题。
2、成本问题:需要购买套餐,增加了额外的成本。
综上所述,每种工具都有其独特的优势和局限性。选择合适的工具需要根据具体的应用场景和技术背景来决定。例如,如果需要高效的数据采集和稳定的代理IP资源,穿云API是一个不错的选择;如果需要低内存消耗和高效的自动化测试,FlareSolverr可能更适合;而如果追求简洁易用且强大的反检测机制,DrissionPage则是一个理想的选择;如果只是应对免费版的Cloudflare五秒盾curl_cffi也是一个很好的选择。