绕过 Cloudflare 的反机器人页面的 Python 模块。
项目描述
云层
一个简单的 Python 模块,用于绕过 Cloudflare 的反机器人页面(也称为“我处于攻击模式”或 IUAM),使用Requests实现。Cloudflare 会定期更改他们的技术,所以我会经常更新这个 repo。
如果您希望抓取或抓取受 Cloudflare 保护的网站,这将非常有用。Cloudflare 的反机器人页面目前只检查客户端是否支持 Javascript,但他们将来可能会添加其他技术。
由于 Cloudflare 不断更改和强化其保护页面,cloudcraper 需要 JavaScript 引擎/解释器来解决 Javascript 挑战。这允许脚本轻松模拟常规 Web 浏览器,而无需显式反混淆和解析 Cloudflare 的 Javascript。
作为参考,这是 Cloudflare 用于这些页面的默认消息:
Checking your browser before accessing website.com.
This process is automatic. Your browser will redirect to your requested content shortly.
Please allow up to 5 seconds...
任何使用 cloudcraper 的脚本在第一次访问任何启用了 Cloudflare 反机器人的站点时都会休眠约 5 秒,但在第一次请求之后不会出现延迟。
捐款
如果你想表达你对这个项目的爱和/或欣赏,那么喊我一杯咖啡或啤酒怎么样 :)
安装
简单地运行pip install cloudscraper。PyPI 包位于https://pypi.python.org/pypi/cloudscraper/
或者,克隆此存储库并运行python setup.py install.
依赖项
- Python 3.x
- 请求>= 2.9.2
- requests_toolbelt >= 0.9.1
python setup.py install将自动安装 Python 依赖项。您决定使用的 javascript 解释器和/或引擎是您自己需要安装的唯一东西,不包括 js2py,它是默认要求的一部分。
Javascript 解释器和引擎
我们支持以下 Javascript 解释器/引擎。
- ChakraCore:库二进制文件也可以位于此处。
- js2py: >=0.67
- native : 自制的原生 python 求解器(默认)
- 节点.js
- V8:我们使用索尼的v8eval () python 模块。
用法
使用 cloudcraper 最简单的方法是调用create_scraper().
import cloudscraper
scraper = cloudscraper.create_scraper() # returns a CloudScraper instance
# Or: scraper = cloudscraper.CloudScraper() # CloudScraper inherits from requests.Session
print(scraper.get("http://somesite.com").text) # => "<!DOCTYPE html><html><head>..."
而已...
从此会话对象向受 Cloudflare 反僵尸程序保护的网站发出的任何请求都将被自动处理。不使用 Cloudflare 的网站将被正常处理。您不需要进一步配置或调用任何内容,您可以有效地将所有网站视为没有任何保护。
您使用 cloudcraper 的方式与使用 Requests 的方式完全相同。cloudScraper与 RequestsSession对象的工作方式相同,只是您调用or而不是调用requests.get()or 。requests.post()scraper.get()scraper.post()
有关更多信息,请参阅Requests 的文档。
选项
禁用 Cloudflare V1
描述
如果您甚至不想尝试 Cloudflare v1(已弃用)解决..
参数
| 范围 | 价值 | 默认 |
|---|---|---|
| 禁用CloudflareV1 | (布尔值) | 错误的 |
例子
scraper = cloudscraper.create_scraper(disableCloudflareV1=True)
布罗特利
描述
添加了Brotli解压支持,默认开启。
参数
| 范围 | 价值 | 默认 |
|---|---|---|
| allow_brotli | (布尔值) | 真的 |
例子
scraper = cloudscraper.create_scraper(allow_brotli=False)
浏览器/用户代理过滤
描述
控制如何以及“随机”选择哪个用户代理。
参数
可以作为参数传递给create_scraper(), get_tokens(), get_cookie_string().
| 范围 | 价值 | 默认 |
|---|---|---|
| 浏览器 | (字符串)chrome或firefox |
没有任何 |
或者
| 范围 | 价值 | 默认 |
|---|---|---|
| 浏览器 | (字典) |
browser 字典参数
| 范围 | 价值 | 默认 |
|---|---|---|
| 浏览器 | (字符串)chrome或firefox |
没有任何 |
| 移动的 | (布尔值) | 真的 |
| 桌面 | (布尔值) | 真的 |
| 平台 | (细绳)'linux', 'windows', 'darwin', 'android', 'ios' |
没有任何 |
| 风俗 | (细绳) | 没有任何 |
例子
scraper = cloudscraper.create_scraper(browser='chrome')
或者
# will give you only mobile chrome User-Agents on Android
scraper = cloudscraper.create_scraper(
browser={
'browser': 'chrome',
'platform': 'android',
'desktop': False
}
)
# will give you only desktop firefox User-Agents on Windows
scraper = cloudscraper.create_scraper(
browser={
'browser': 'firefox',
'platform': 'windows',
'mobile': False
}
)
# Custom will also try find the user-agent string in the browsers.json,
# If a match is found, it will use the headers and cipherSuite from that "browser",
# Otherwise a generic set of headers and cipherSuite will be used.
scraper = cloudscraper.create_scraper(
browser={
'custom': 'ScraperBot/1.0',
}
)
调试
描述
打印出调试请求的头部和内容信息。
参数
可以通过您的cloudscraper对象设置为属性或作为参数传递给create_scraper(), get_tokens(), get_cookie_string().
| 范围 | 价值 | 默认 |
|---|---|---|
| 调试 | (布尔值) | 错误的 |
例子
scraper = cloudscraper.create_scraper(debug=True)
延误
描述
Cloudflare IUAM 质询要求浏览器在提交质询答案之前等待约 5 秒,如果您想覆盖此延迟。
参数
可以通过您的cloudscraper对象设置为属性或作为参数传递给create_scraper(), get_tokens(), get_cookie_string().
| 范围 | 价值 | 默认 |
|---|---|---|
| 延迟 | (漂浮) | 从 IUAM 页面提取 |
例子
scraper = cloudscraper.create_scraper(delay=10)
现有会话
描述:
如果您已经有一个现有的 Requests 会话,则可以将其传递给函数create_scraper()以继续使用该会话。
参数
| 范围 | 价值 | 默认 |
|---|---|---|
| 会话 | (请求.会话) | 没有任何 |
例子
session = requests.session()
scraper = cloudscraper.create_scraper(sess=session)
笔记
不幸的是,并非所有 Requests 会话属性都可以轻松转移,因此如果您遇到问题,
您应该替换初始会话初始化调用
从:
sess = requests.session()
至:
sess = cloudscraper.create_scraper()
JavaScript 引擎和解释器
描述
cloudcraper 目前支持以下 JavaScript 引擎/解释器
参数
可以通过您的cloudscraper对象设置为属性或作为参数传递给create_scraper(), get_tokens(), get_cookie_string().
| 范围 | 价值 | 默认 |
|---|---|---|
| 口译员 | (细绳) | native |
例子
scraper = cloudscraper.create_scraper(interpreter='nodejs')
3rd 方验证码求解器
描述
cloudscraper如果您需要,目前支持以下 3rd 方验证码求解器。
- 2验证码
- 反验证码
- CapMonster 云
- 验证码死亡
- 9千瓦
- return_response
笔记
我正在努力添加更多的 3rd 方求解器,如果您希望添加当前不支持的服务,请在 github 上提出支持票。
必需参数
可以通过您的cloudscraper对象设置为属性或作为参数传递给create_scraper(), get_tokens(), get_cookie_string().
| 范围 | 价值 | 默认 |
|---|---|---|
| 验证码 | (字典) | 没有任何 |
2验证码
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)2captcha |
是的 | |
| api_key | (细绳) | 是的 | |
| no_proxy | (布尔值) | 不 | 错误的 |
笔记
如果设置了代理,您可以通过设置禁用将代理发送到no_proxy2captchaTrue
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={
'provider': '2captcha',
'api_key': 'your_2captcha_api_key'
}
)
反验证码
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)anticaptcha |
是的 | |
| api_key | (细绳) | 是的 | |
| no_proxy | (布尔值) | 不 | 错误的 |
笔记
如果设置了代理,您可以通过设置禁用将代理发送到no_proxyanticaptchaTrue
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={
'provider': 'anticaptcha',
'api_key': 'your_anticaptcha_api_key'
}
)
CapMonster 云
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)capmonster |
是的 | |
| 客户密钥 | (细绳) | 是的 | |
| no_proxy | (布尔值) | 不 | 错误的 |
笔记
如果设置了代理,您可以通过设置禁用将代理发送到no_proxyCapMonsterTrue
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={
'provider': 'capmonster',
'clientKey': 'your_capmonster_clientKey'
}
)
验证码死亡
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)deathbycaptcha |
是的 | |
| 用户名 | (细绳) | 是的 | |
| 密码 | (细绳) | 是的 |
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={
'provider': 'deathbycaptcha',
'username': 'your_deathbycaptcha_username',
'password': 'your_deathbycaptcha_password',
}
)
9千瓦
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)9kw |
是的 | |
| api_key | (细绳) | 是的 | |
| 最大超时 | (整数) | 不 | 180 |
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={
'provider': '9kw',
'api_key': 'your_9kw_api_key',
'maxtimeout': 300
}
)
return_response
如果您想要请求响应有效负载而不解决验证码,请使用此选项。
必需captcha参数
| 范围 | 价值 | 必需的 | 默认 |
|---|---|---|---|
| 提供者 | (细绳)return_response |
是的 |
例子
scraper = cloudscraper.create_scraper(
interpreter='nodejs',
captcha={'provider': 'return_response'}
)
一体化
它很容易cloudscraper与其他应用程序和工具集成。Cloudflare 使用两种 cookie 作为令牌:一种用于验证您是否通过了他们的挑战页面,另一种用于跟踪您的会话。要绕过质询页面,只需在您发出的所有 HTTP 请求中包含这两个 cookie(使用适当的用户代理)。
要仅检索 cookie(作为字典),请使用cloudscraper.get_tokens(). 要将它们作为完整的CookieHTTP 标头检索,请使用cloudscraper.get_cookie_string().
get_tokens并且get_cookie_string都接受 Requests 的常用关键字参数(如get_tokens(url, proxies={"http": "socks5://localhost:9050"}))。
请阅读Requests 关于请求参数的文档以获取更多信息。
用户代理处理
这两个积分函数返回一个元组(cookie, user_agent_string)。
您必须使用相同的用户代理字符串来获取令牌并使用这些令牌发出请求,否则 Cloudflare 会将您标记为机器人。
这意味着您必须将返回user_agent_string的值传递给您将令牌传递给的任何脚本、工具或服务(例如 curl 或专门的抓取工具),并且它必须在发出 HTTP 请求时使用传递的用户代理。
集成示例
请记住,在检索或使用这些 cookie 时,您必须始终使用相同的用户代理。这些函数都返回一个元组(cookie_dict, user_agent_string)。
通过代理检索 cookie 字典
get_tokens是一个方便的函数,用于返回包含 Cloudflare 会话 cookie 的 Python dict。为了演示,我们将配置此请求以使用代理。(请注意,如果您通过代理请求 Cloudflare 通关令牌,则在将这些令牌传递到服务器时必须始终使用相同的代理。Cloudflare 要求解决挑战的 IP 和访问者 IP 保持不变。)
如果您不想使用代理,请不要传递proxies关键字参数。这些便利函数支持所有 Requests 的普通关键字参数,例如params、data和headers。
import cloudscraper
proxies = {"http": "http://localhost:8080", "https": "http://localhost:8080"}
tokens, user_agent = cloudscraper.get_tokens("http://somesite.com", proxies=proxies)
print(tokens)
# => {
'cf_clearance': 'c8f913c707b818b47aa328d81cab57c349b1eee5-1426733163-3600',
'__cfduid': 'dd8ec03dfdbcb8c2ea63e920f1335c1001426733158'
}
检索 cookie 字符串
get_cookie_string是一个方便的函数,用于将标记作为字符串返回以用作CookieHTTP 标头值。
这在手动制作 HTTP 请求或使用传递原始 cookie 标头的外部应用程序或库时很有用。
import cloudscraper
cookie_value, user_agent = cloudscraper.get_cookie_string('http://somesite.com')
print('GET / HTTP/1.1\nCookie: {}\nUser-Agent: {}\n'.format(cookie_value, user_agent))
# GET / HTTP/1.1
# Cookie: cf_clearance=c8f913c707b818b47aa328d81cab57c349b1eee5-1426733163-3600; __cfduid=dd8ec03dfdbcb8c2ea63e920f1335c1001426733158
# User-Agent: Some/User-Agent String
卷曲示例
这是一个将 cloudcraper 与 curl 集成的示例。如您所见,您所要做的就是将 cookie 和用户代理传递给 curl。
import subprocess
import cloudscraper
# With get_tokens() cookie dict:
# tokens, user_agent = cloudscraper.get_tokens("http://somesite.com")
# cookie_arg = 'cf_clearance={}; __cfduid={}'.format(tokens['cf_clearance'], tokens['__cfduid'])
# With get_cookie_string() cookie header; recommended for curl and similar external applications:
cookie_arg, user_agent = cloudscraper.get_cookie_string('http://somesite.com')
# With a custom user-agent string you can optionally provide:
# ua = "Scraping Bot"
# cookie_arg, user_agent = cloudscraper.get_cookie_string("http://somesite.com", user_agent=ua)
result = subprocess.check_output(
[
'curl',
'--cookie',
cookie_arg,
'-A',
user_agent,
'http://somesite.com'
]
)
精简版。通过 curl 打印受 Cloudflare 保护的任何站点的页面内容。
警告:在实际代码shell=True中使用可能很危险。subprocess
url = "http://somesite.com"
cookie_arg, user_agent = cloudscraper.get_cookie_string(url)
cmd = "curl --cookie {cookie_arg} -A {user_agent} {url}"
print(
subprocess.check_output(
cmd.format(
cookie_arg=cookie_arg,
user_agent=user_agent,
url=url
),
shell=True
)
)
密码学
描述
控制客户端和服务器之间的通信
参数
可以作为参数传递给create_scraper().
| 范围 | 价值 | 默认 |
|---|---|---|
| 密码套件 | (细绳) | 没有任何 |
| ecdh曲线 | (细绳) | 素数256v1 |
| 服务器主机名 | (细绳) | 没有任何 |
例子
# Some servers require the use of a more complex ecdh curve than the default "prime256v1"
# It may can solve handshake failure
scraper = cloudscraper.create_scraper(ecdhCurve='secp384r1')
# Manipulate server_hostname
scraper = cloudscraper.create_scraper(server_hostname='www.somesite.com')
scraper.get(
'https://backend.hosting.com/',
headers={'Host': 'www.somesite.com'}
)