Cloudflare 如何区分 Selenium 和 Requests 流量?

Posted

技术标签:

【中文标题】Cloudflare 如何区分 Selenium 和 Requests 流量?【英文标题】:How does Cloudflare differentiate Selenium and Requests traffic? 【发布时间】:2020-09-16 22:37:58 【问题描述】:

上下文

我目前正在尝试使用 Python 中的 Selenium 和 Requests 模块构建一个小型机器人。 但是,我要与之交互的网页在 Cloudflare 后面运行。 我的 python 脚本正在使用 stem 模块在 Tor 上运行。 我的流量分析是基于 Firefox 的“开发者选项->网络”使用 Persist Logs。

到目前为止我的发现:

Selenium 的 Firefox webdriver 可以经常访问网页,而无需经过“检查浏览器页面”(返回码 503)和“验证码页面”(返回码 403)。 使用相同的用户代理请求会话对象总是导致“验证码页面”(返回码 403)。

如果 Cloudflare 正在检查我的 javascript 功能,我的请求模块不应该返回 503 吗?

代码示例

driver = webdriver.Firefox(firefox_profile=fp, options=fOptions)
driver.get("https://www.cloudflare.com")   # usually returns code 200 without verifying the browser

session = requests.Session()
# ... applied socks5 proxy for both http and https ... #
session.headers.update("user-agent": driver.execute_script("return navigator.userAgent;"))
page = session.get("https://www.cloudflare.com")
print(page.status_code) # return code 403
print(page.text)        # returns "captcha page"

Selenium 和 Requests 模块都使用相同的用户代理和 ip。 两者都使用不带任何参数的 GET。 Cloudflare 如何区分这些流量? 我错过了什么吗?


我尝试将 cookie 从网络驱动程序传输到请求会话,以查看是否可以绕过但没有运气。 这是使用的代码:

for c in driver.get_cookies():
    session.cookies.set(c['name'], c['value'], domain=c['domain'])

【问题讨论】:

使用 Web 驱动程序时需要考虑很多事情,包括但不限于; JavaScript API、HTTP 标头、TLS 标头、TCP 指纹、IP 指纹等。当使用 Selenium 等 Web 驱动程序时,Cloudflare 会将您标记为比请求模块时“更安全”。您需要修改请求的许多部分才能获得可扩展的解决方案。 【参考方案1】:

验证码响应取决于浏览器指纹。这不仅仅是发送 Cookie 和用户代理。

从开发者控制台的 Network Tab 中复制所有的 headers,并将所有的键值对作为 headers 发送到请求库中。

这个方法应该是合乎逻辑的。

【讨论】:

【参考方案2】:

在使用 Selenium 时,网页会公开额外的 JavaScript API。如果您可以禁用它们,您也许可以解决问题。

【讨论】:

【参考方案3】:

Cloudflare 不仅检查 HTTP 标头或 javascript — 它还分析 TLS 标头。我不确定它是如何做到的,但我发现可以通过使用 NSS 而不是 OpenSSL 来规避它(尽管它没有很好地集成到 Requests 中)。

【讨论】:

以上是关于Cloudflare 如何区分 Selenium 和 Requests 流量?的主要内容,如果未能解决你的问题,请参考以下文章

Cloudflare 和 Chromedriver - cloudflare 区分 chromedriver 和正版 chrome?

在 Heroku 上托管时,Selenium 应用程序重定向到 Cloudflare 页面

反反爬 解决CloudFlare 5秒盾

WAX云钱包Cloudflare反爬虫突破(SSL指纹识别)

WAX云钱包Cloudflare反爬虫突破(SSL指纹识别)

如何根据标头的值进行 nginx 重定向?