如何绕过网站的Cloudflare? BrowerScan可以给你哪些帮助

选Selenium还是Puppeteer?

Selenium和Puppeteer是两个广泛使用的浏览器自动化工具,它们在网页测试和数据爬取等多种场景中都发挥了重要作用。

Selenium

Selenium 是一个流行的开源浏览器自动化工具,它提供了一套API允许开发者模拟用户与浏览器的交互。

优点:

  • 多语言支持:Selenium无缝支持多种主流编程语言,包括Java、C#、Python和Ruby,为开发者提供了更大的灵活性。
  • 跨浏览器兼容性:Selenium可以在Chrome、Firefox、Safari等多种浏览器上运行,使得跨浏览器和跨平台的测试成为可能。
  • 丰富的测试框架集成:Selenium可以轻松地与JUnit、TestNG等测试框架以及Jenkins等持续集成工具进行集成。
  • 稳健的社区支持:Selenium的社区庞大,对于问题的解决和新功能的实现都能得到及时的反馈和支持。
  • 显式等待功能:Selenium提供了显式等待的功能,可以方便地处理异步操作。
  • 完善的错误处理:Selenium有针对不同错误情况的处理机制,可以提供有用的反馈和提示。
  • 支持分布式测试:Selenium Grid可以支持在不同的环境和机器上同时进行测试。
  • 测试录制:Selenium IDE提供了录制和回放功能,可以方便地创建和调试测试脚本。
  • 页面元素定位丰富:Selenium支持多种方式定位页面元素,如CSS定位、XPath定位等。
  • 广泛的应用:Selenium被广泛应用于Web应用的自动化测试,有丰富的案例和经验可以参考。

缺点:

  • 性能开销:Selenium需要启动实际的浏览器进行操作,对于资源和性能的消耗较大。
  • API设计较老:Selenium的API相对较老,对于现代开发习惯可能需要一定的适应。
  • 对于动态页面的支持较弱:面对单页应用(SPA)或者大量使用Ajax的页面,Selenium可能需要更复杂的代码来处理。
  • 需要独立的驱动程序:每种浏览器都需要一个对应的驱动程序,而驱动程序的安装和维护需要额外的工作。
  • 并发执行测试时需要更多资源:Selenium在并行执行多个测试用例时,会消耗更多的CPU和内存资源。
  • 无内置截图和录像功能:Selenium无法直接进行屏幕录制和截图,这在某些情况下可能会带来不便。
  • 无法直接控制网络:Selenium无法拦截和修改网络请求,或者模拟离线状态。
  • 无法执行复杂的JavaScript:Selenium虽然可以执行JavaScript,但对于复杂的脚本可能会有限制。
  • 调试信息不够详细:Selenium的错误信息和日志输出可能不足以进行详细的调试。

 

Puppeteer

相对于Selenium,Puppeteer是一个较新的工具,由Google Chrome团队开发并维护。Puppeteer是一个Node.js库,提供了一套高级API来通过DevTools协议控制Chromium或Chrome。

尽管Selenium和Puppeteer都可以用于浏览器自动化,但它们之间存在一些关键区别,以下是Puppeteer的优缺点。

优点:

  • 现代化的API:Puppeteer的API设计更符合现代JavaScript编程的思维方式,使用Promise进行异步操作,更易于理解和控制。
  • 性能优秀:由于可以运行无头模式的Chrome,Puppeteer在性能上有显著的优势。
  • 功能全面:Puppeteer除了基本的浏览器自动化操作,还支持网页截屏、PDF生成、网络请求拦截等高级操作。
  • 对SPA的支持:Puppeteer可以等待JavaScript执行,从而更好地处理单页应用(SPA)或者使用了Ajax的页面。
  • 方便的调试支持:Puppeteer提供了丰富的调试选项,比如可以将操作过程中的详细信息输出到控制台。
  • 高效的网络控制:Puppeteer可以拦截和修改网络请求,模拟不同的网络条件,甚至可以模拟离线状态。
  • 支持Chrome特性:Puppeteer可以利用Chrome的所有最新特性,如使用Chrome DevTools进行调试。
  • 提供了丰富的示例:Puppeteer的官方文档包含了大量的使用示例,覆盖了大部分常见的使用场景。
  • 支持页面操作录制:Puppeteer可以录制用户在页面上的操作,生成可以直接运行的脚本。
  • 良好的错误处理:Puppeteer在遇到错误时,会提供详细的错误信息,帮助开发者定位问题。

 

缺点:

  • 语言限制:Puppeteer只支持JavaScript,这可能会限制部分开发者的使用。
  • 浏览器限制:Puppeteer只支持Chromium或Chrome,无法进行跨浏览器测试。
  • 学习门槛相对较高:对于不熟悉Promise或者Node.js的开发者来说,Puppeteer可能需要一定的学习成本。
  • 社区规模较小:相比于Selenium,Puppeteer的社区规模较小,遇到问题时可能无法得到及时的解答。
  • 对于非Chrome浏览器的兼容性问题:由于Puppeteer是由Chrome团队开发的,使用非Chrome浏览器时可能会遇到兼容性问题。
  • 需要Node.js环境:Puppeteer是一个Node.js库,需要Node.js环境才能运行,这可能会带来额外的安装和配置工作。
  • 对于复杂的DOM操作可能存在问题:尽管Puppeteer可以执行JavaScript,但对于复杂的DOM操作可能会有困难。
  • 可能存在的安全风险:Puppeteer需要足够的权限来控制浏览器,这可能带来潜在的安全风险。
  • 对于旧版本的Node.js支持不足:Puppeteer需要较新版本的Node.js才能充分利用其功能。

 

结论

选择Selenium还是Puppeteer,这取决于您的具体需求和环境。这两个工具都有其独特的优势和适用的场景。

如果您需要进行跨浏览器测试,或者您的团队已经熟悉并使用Python、Java或C#等语言,那么Selenium可能是更好的选择,因为它可以支持多种浏览器和语言。

如果您需要进行一些高级操作,如截屏、PDF生成、网络请求拦截等,或者您的团队主要使用JavaScript,那么Puppeteer可能更适合您,因为Puppeteer提供了更多的功能和更现代的API。

 

何为Cloudflare?

Cloudflare是一家提供CDN服务、DDoS攻击保护和互联网安全服务的公司。Cloudflare可以帮助网站加速网页加载速度,保护网站免受恶意攻击,并提供各种其他的优化和安全服务。

当用户尝试访问使用Cloudflare服务的网站时,他们的请求首先会被发送到Cloudflare的网络。Cloudflare会对请求进行分析,以确定是否来自合法用户。Cloudflare会使用以下技术去检测用户是否为机器人:

 

IP黑名单

通过检查请求的IP地址,Cloudflare可以识别出已知的恶意IP和网络。Cloudflare维护了一个庞大的IP数据库,能够识别出已知的垃圾邮件源、恶意软件源等。

 

HTTP请求头分析

Cloudflare会检查HTTP请求的头部信息,例如User-Agent字段,是否符合正常浏览器的特征。许多自动化工具或爬虫可能会使用非标准或者明显可识别的User-Agent。

 

行为分析

Cloudflare会监控访问者的行为,包括请求的频率、访问的页面等,如果某个访问者的行为模式不符合正常用户的行为,例如在很短的时间内发出大量的请求,Cloudflare可能会认为它是一个机器人。

 

JavaScript挑战

Cloudflare会向访问者发送一个需要在浏览器中运行的JavaScript代码,这个代码会返回一个计算结果。由于大部分的机器人和爬虫无法执行JavaScript代码,因此这是一个有效的检测手段。

 

CAPTCHA挑战

对于被怀疑的访问,Cloudflare会要求访问者解决一个CAPTCHA(全自动区分计算机和人类的图灵测试),真人用户通常能够解决这个挑战,而机器人则无法通过。

 

SSL/TLS指纹

通过检查SSL/TLS客户端的握手过程,Cloudflare可以识别出某些恶意工具或已知的非浏览器软件。

 

Cloudflare可以检测到Selenium或Puppeteer吗?

Cloudflare通过一系列复杂的技术来识别非人类访问行为。虽然它无法直接识别出Selenium或Puppeteer,但它可以通过分析访问行为的特征间接发现这些自动化工具的使用。例如,Cloudflare可以通过检查User-Agent字段发现公开的、已知的自动化工具标识。同时,它也可以通过分析请求频率来识别异常请求模式,或者通过JavaScript挑战来找出Selenium或Puppeteer执行环境的差异。

另外,Cloudflare还可能利用WebDriver的特殊标记来发现Selenium的使用,或者通过WebGL指纹识别和鼠标、键盘事件分析来识别自动化行为。因此,如果你想要使用Selenium或Puppeteer访问受Cloudflare保护的网站,你需要尽可能地模拟真实的用户行为,包括设定合理的User-Agent,添加请求间隔,隐藏WebDriver标记等,以此来避免被Cloudflare识别为自动化行为。

 

如何绕过Cloudflare?

方法一:通过调用源服务器绕过 Cloudflare CDN

Selenium

以下是一个使用Python的requests库通过源服务器绕过CDN的示例:

import requests

# 这是源服务器的IP地址
source_server_ip = '102.119.209.78'

# 这是你想访问的URL
url = 'http://www.example.com'

# 创建一个新的请求会话
session = requests.Session()

# 创建一个自定义的适配器,设置源服务器的IP地址为解析结果
class SourceServerAdapter(requests.adapters.HTTPAdapter):
    def get_connection(self, url, proxies=None):
        return super().get_connection(f'{source_server_ip}', proxies)

# 将自定义适配器挂载到会话上,用于处理所有的HTTP和HTTPS请求
session.mount('http://', SourceServerAdapter())
session.mount('https://', SourceServerAdapter())

# 发送请求
response = session.get(url)

请注意,这个示例假设你已经知道源服务器的IP地址。如果你不知道源服务器的IP地址,你可能需要使用其他方法来找到它,例如进行DNS查询或者使用网络扫描工具。

此外,这个示例只是一种可能的解决方案,并不适用于所有情况。例如,有些网站可能会检查请求的Host头部,如果它与源服务器的IP地址不匹配,请求就会被拒绝。在这种情况下,你可能需要使用其他方法来绕过CDN,例如使用VPN或代理服务器。

 

Puppeteer

要使用Puppeteer绕过Cloudflare CDN并直接访问源服务器,你需要知道源服务器的IP地址。然后,你可以通过修改/etc/hosts文件将源服务器的域名解析为源服务器的IP地址。然后,你可以使用Puppeteer正常访问该网站,它将直接连接到源服务器,而不是通过Cloudflare CDN。

 

以下是一种可能的解决方案:

1.首先,修改 /etc/hosts 文件,添加一行内容,将源服务器的域名解析为源服务器的IP地址。例如,如果源服务器的IP地址是123.456.789.012,域名是www.example.com,则添加以下内容:

102.213.129.64 www.example.com

 

2.然后,使用以下的Node.js和Puppeteer代码访问该网站:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('http://www.example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

请注意,修改/etc/hosts文件可能需要管理员权限,并且可能会影响你的系统的网络设置。在完成访问后,你应该将/etc/hosts文件恢复到原始状态。

此外,这种方法可能不适用于所有情况。例如,如果网站使用了HTTPS,浏览器可能会因为证书错误而拒绝访问。在这种情况下,你可能需要使用其他方法来绕过Cloudflare CDN,例如使用VPN或代理服务器。

 

方法二:绕过 Cloudflare 5秒盾

绕过 Cloudflare 5秒盾

Cloudflare的5秒盾是一种广泛使用的网站防御模式,用于保护网站免受恶意攻击和流量泛滥的影响。它通常会监测频繁的访问行为,并将其视为潜在的恶意攻击。因此,设置合理的访问速度和频率是非常重要的。遵守网站的Robots.txt规范,避免过快地请求页面,以降低被防护系统检测到的概率。

要绕过 Cloudflare 的5秒盾,你需要让 Selenium/Puppteer 像真实的浏览器一样行动。这意味着你需要让 Selenium/Puppteer 等待5秒盾完成。以下是一个简单的 Python 和 Selenium 代码示例:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 启动 webdriver
driver = webdriver.Firefox()

# 访问网站
driver.get('https://www.example.com')

# 等待 JavaScript 挑战完成,你可以调整等待的时间
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'content')))

# 现在你可以继续你的自动化流程

 

这段代码会访问 https://www.example.com,然后等待 10 秒以便 5秒盾完成。等待的时间可能需要根据网站的实际情况进行调整。

然而,你需要注意的是,这种方法可能并不总是有效的。Cloudflare 的 5秒盾设计得非常复杂,其目的就是阻止自动化工具的访问。如果你发现这种方法不起作用,那可能就是因为 Cloudflare 已经更新了它们的机制,您需要尝试其他方法。

 

方法三:绕过Cloudflare CAPCHA验证码

Cloudflare的 CAPTCHA 验证

Cloudflare的 CAPTCHA 验证是设计来阻止自动化脚本和机器人访问网站的,所以使用 Selenium 或其他自动化工具来尝试绕过它需要一些技巧。除了使用代理服务器之外,一些第三方服务提供了自动解决CAPTCHA的API,我们可以借助这些API去绕过Cloudflare CAPCHA的限制。

2Captcha 和 Anti-Captcha 都是提供自动解决 CAPTCHA 的服务。他们使用真人工作人员来解决 CAPTCHA,然后将解决方案返回给你的程序。然后,你的程序可以使用这个解决方案来继续其自动化流程。

下面是一个使用 2Captcha 和 Selenium 解决 Google reCAPTCHA 的 Python 代码示例:

from selenium import webdriver
from time import sleep
import requests
import json

# 2Captcha 的 API 密钥
api_key = 'your_2captcha_api_key'

# 启动 webdriver
driver = webdriver.Firefox()
driver.get('https://www.google.com/recaptcha/api2/demo')

# 获取 reCAPTCHA 的 site key
site_key = driver.find_element_by_class_name('g-recaptcha').get_attribute('data-sitekey')

# 发送解决 reCAPTCHA 的请求到 2Captcha
response = requests.post('http://2captcha.com/in.php', data={
    'key': api_key,
    'method': 'userrecaptcha',
    'googlekey': site_key,
    'pageurl': 'https://www.google.com/recaptcha/api2/demo',
    'json': 1
})

# 获取 2Captcha 的请求 ID
request_id = json.loads(response.text)['request']

# 等待 2Captcha 解决 reCAPTCHA
while True:
    response = requests.get(f'http://2captcha.com/res.php?key={api_key}&action=get&id={request_id}&json=1')
    result = json.loads(response.text)

    if result['status'] == 1:
        # 输入解决方案到 reCAPTCHA
        driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML="{result["request"]}";')
        sleep(2)
        driver.find_element_by_id('recaptcha-demo-submit').click()
        break

    sleep(5)

 

方法四:使用指纹浏览器

使用指纹浏览器进行自动化操作可能可以绕过 Cloudflare 的一些防护机制,因为这些浏览器可以模拟出真实用户的浏览行为和环境。指纹浏览器可以更改或随机化其浏览器指纹,使其看起来每次访问都来自一个不同的、真实的用户。 这使得 Cloudflare 更难以识别出这些请求实际上是由自动化工具生成的。

然而,你需要注意的是,使用指纹浏览器并不能保证一定能绕过 Cloudflare 或其他类似的服务。这些服务持续更新和改进其识别和阻止自动化流量的机制。所以,您还要结合代理服务器以及合适的脚本去实现。

 

检查自动化脚本

在您使用自动化脚本过Cloudflare或者去执行一些自动化任务流程的时候,可以借助BrowserScan检测自己的脚本是否完善,检查还有哪些地方会带有自动化工具的特征。

 

BrowserScan可以从Webdriver、Webdriver Advance、Selenium、NightmareJS、PhantomJS、Native Navigator6个方面帮助您检查自己的脚本。

 

WebDriver

网站能够检测到用户是否使用 WebDriver 来控制浏览器,主要是因为 WebDriver 在控制浏览器时会留下一些特定的标记或者属性。

例如,默认情况下, 使用Selenium/Puppeteer等UI自动化工具访问网页时, navigator.webdriver变量的值为true。

 

Selenium

这个部分会检测更多的浏览器属性,在使用Selenium打开浏览器之后,还会有一些特征码,只要识别到这些特征码,那么网站就能识别用户是Selenium控制的。

当您的自动化脚本没有做好这些特征的掩盖,在BrowserScan里就会显示为”True“。

webdriver  
__driver_evaluate  
__webdriver_evaluate  
__selenium_evaluate  
__fxdriver_evaluate  
__driver_unwrapped  
__webdriver_unwrapped  
__selenium_unwrapped  
__fxdriver_unwrapped  
_Selenium_IDE_Recorder  
_selenium  
calledSelenium  
_WEBDRIVER_ELEM_CACHE  
ChromeDriverw  
driver-evaluate  
webdriver-evaluate  
selenium-evaluate  
webdriverCommand  
webdriver-evaluate-response  
__webdriverFunc  
__webdriver_script_fn  
__$webdriverAsyncExecutor  
__lastWatirAlert  
__lastWatirConfirm  
__lastWatirPrompt  

 

NightmareJS、PhantomJS

NightmareJS:这是一个基于 Electron 构建的高级浏览器自动化库,它使用 Chromium 渲染引擎和 Node.js 运行环境。NightmareJS 旨在提供更简单、更易用的 API,以及更强大的功能,如对用户交互(点击、键入等)的支持、页面性能分析等。

PhantomJS:这是一个无头浏览器,它使用 WebKit 渲染引擎(与旧版的 Safari 和其他苹果设备使用的相同)用于页面渲染,而 JavaScriptCore 用于 JavaScript 执行。PhantomJS 支持各种 web 标准:DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。然而,PhantomJS 的开发在 2018 年已经停止。

 

BrowserScan会检测您的脚本是否通过这两种工具控制。如果显示为”False“,说明您当前没有使用这两款工具控制浏览器,或者您已经掩盖了浏览器自动化工具的特征,BrowserScan没有获取相关信息。

BrowserScan检测脚本是否通过NightmareJS、PhantomJS控制

 

Native Navigator

BrowserScan可以检测Navigator对象的属性是不是原生方法。

 

网站也经常利用Navigator对象检测用户是否为机器人:

  • navigator.userAgent:这个属性返回一个包含浏览器名称、版本、操作系统和浏览器引擎信息的字符串。如果这个字符串与自动化工具的特征匹配,那么网站可能会将访问者标记为机器人。
  • navigator.plugins 和 navigator.mimeTypes:这两个属性返回浏览器支持的插件和MIME类型的列表。一些自动化工具可能不支持任何插件或MIME类型,或者支持的列表与正常浏览器不同,这可能被网站用来检测机器人。
  • navigator.cookieEnabled:这个属性表示浏览器是否启用了cookies。一些自动化工具可能会禁用cookies,这可能被网站用来检测机器人。
  • navigator.languages:这个属性返回浏览器的语言设置。如果这个设置与访问者的地理位置或其他浏览器设置不符,网站可能会将其标记为机器人。
  • navigator.doNotTrack:这个属性表示浏览器是否设置了"Do Not Track"。自动化工具可能会启用这个设置,这可能被网站用来检测机器人。
  • navigator.javaEnabled():这个方法返回浏览器是否启用了Java。自动化工具可能会禁用Java,这可能被网站用来检测机器人。

 

除此之外,还有一些其他的属性和方法也可能被用来检测机器人,例如 navigator.hardwareConcurrency(返回CPU的逻辑核心数)、navigator.deviceMemory(返回设备的RAM大小)等。

 

最后

在面对 Cloudflare 的机器人检测时,一些有效的策略包括:定期更新自动化工具,模拟人类行为,使用住宅 IP,轮换User Agent,避免典型的机器人行为,处理CAPTCHA验证码,以及模拟真实浏览器的行为。这些策略虽然不能保证百分之百的成功,但可以增加您绕过 Cloudflare 机器人检测的机会。

 

最后,千万别忘了使用BrowserScan去检测你的浏览器,看看是否能被检测出有自动化工具控制的特征。

使用BrowserScan检测浏览器是否有自动化工具控制的特征

上一个
如何在Switchy Omega设置代理(Chrome、Firefox)
下一个
UnoProxy:高匿住宅代理,稳定助力全球业务拓展
最近修改: 2024-07-02Powered by