近期在编写网络爬虫机器人时,发现许多网站都安装了CloudFlare反爬虫的防火墙,其中5秒盾是最难攻克的一环。 5秒盾的工作原理是,一旦它认为你可疑,就会将页面跳转到challenge.html,通过JavaScript等待5秒,并重新提交表单,迫使你点击确定按钮,才能重新进入网站。
我尝试了构建完整的HTTPHEADER以及用户代理(user-agent),但都没有用,仍然会被跳转到challenge.html。 通过互联网找来的透过第三方网站帮你计算JavaScript的五秒盾解密方法也失败了。 即使使用Python的webbrowser先打开Firefox来破解五秒盾,然后再进入网站,有时仍然会失败。
至于PHP,最初的想法是先使用A.php获取Cloudflare的cookie,然后将这个值传递给B.php,再访问网站,但仍然失败。 Cloudflare确实不愧为世界级网站,其防火墙级别非常高。 但即使如此,我还是找到了可行的方法!
原理说明:
- 访问目标网站时,如果对方开启了Cloudflare的网站,此时浏览器会获取一组名为「app_session」的cookie。
- Cloudflare会针对这组cookie进行检测,判断是否有正常访问和更新。
- 如果「app_session」没有数据,或者进行了异常访问,页面就会转到challenge.html进行验证。
根据上述内容,可以发现关键在于「app_session」的持续更新,所以我的方法如下,以PHP Curl为例:
1.首先使用Firefox打开目标网站,获取完整的cookie值和User-Agent数据。
2.将获取的cookie值套入到curl的「curl_setopt($ch, CURLOPT_COOKIE, $setcookie);」中的$setcookie参数。
3.将获取的User-Agent数据套入到curl的「curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);」中的$headers参数。
基本上将PHP修改成这样就可以了。接下来才是关键!
4.在Firefox上安装Tab Reloader(页面自动刷新)扩展程序。
5.在Firefox上启动Tab Reloader(页面自动刷新)扩展程序,并进行调整设置。启用此标签的自动刷新和绕过表单提交:秒数设置为10秒。
这样一来,刚刚获得的「app_session」数据将不断被更新,也就不容易被转到challenge.html进行验证。 Firefox和PHP不需要同一个IP地址,换句话说,你可以通过电脑A打开Firefox获取app_session,然后拿到电脑B上使用。 只要电脑A的app_session持续更新,就可以了。
当然,还有一种更为简单的办法,就是使用穿云API来绕过Cloudflare验证。
使用穿云API,您可以轻松地绕过Cloudflare的机器人验证,即使您需要发送10万个请求,也不必担心被识别为抓取者。
一个穿云API即可突破所有反Anti-bot机器人检查,轻松绕过Cloudflare、CAPTCHA验证,WAF,CC防护,并提供了HTTP API和Proxy,包括接口地址、请求参数、返回处理;以及设置Referer,浏览器UA和headless状态等各浏览器指纹设备特征。