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 页面
WAX云钱包Cloudflare反爬虫突破(SSL指纹识别)