如何使用Python中绕过Cloudflare
在抓取时被 Cloudflare Bot Manager 检测到非常频繁,这可能会减慢您的抓取过程甚至停止操作。避免这种情况的最好方法是利用为绕过这种反机器人保护而创建的流行库。
在本文中,我们将提到一些经过验证的工具,可以在 Python 中绕过 Cloudflare,并分享有关如何使用它们来抓取您感兴趣的任何网页数据的建议。
什么是 Cloudflare Bot Manager?
Cloudflare Bot Manager 是最专业和最实用的网络安全系统之一,用于减轻恶意机器人的攻击。对我们来说不幸的是,网络抓取工具可能会被不公平地检测到。
Cloudflare 机器人检测技术包括 TLS 指纹识别、事件跟踪和画布指纹识别。如果您之前尝试过抓取受 Cloudflare 保护的网站,您将看到的一些错误包括:
- 错误 1020:访问被拒绝。
- 错误 1010:该网站的所有者已根据您浏览器的签名禁止您访问。
- 错误 1015:您的速率受到限制。
- 错误 1012:访问被拒绝。
它们通常伴随着 403 Forbidden HTTP 响应状态代码。
Cloudflare 可以检测 Python 爬虫吗?
是的,Cloudflare 能够检测 Python 抓取工具,因为它们未列入白名单,并且默认情况下假定它们是恶意的。因此,您的网络抓取工具可能会被拒绝访问网页。
让我们通过一个使用requests
Python 库的快速抓取示例来抓取Opensea.io,这是一个使用 Cloudflare 作为其主要反机器人安全性的 NFT 交易平台。
我们将从安装库开始:
pip install requests
然后我们将向目标网站发送请求:
#Let's do a canonic scraping with requests import requests scraper = requests.get('https://opensea.io/rankings/trending').text print(scraper)
它没有用。
我们requests
基于 的抓取器返回原始 HTML 内容,顶部包含错误代码:
这证明这requests
不是绕过 Cloudflare 安全措施的可靠方法,因为它经常返回拒绝访问错误。那么如何在抓取时避免 Python Cloudflare 检测?让我们开始吧。
如何在 Python 中绕过 Cloudflare
在 Python 中进行网页抓取时,有不同的库可以绕过 Cloudflare :
- ZenRows。
- Cloudflare。
- cfscrape。
- undetected_chromedriver。
让我们来看看这些工具以及如何成功使用它们。
ZenRows
使用 Python 绕过 Cloudflare 的最佳方法是使用ZenRows。这是一个网络抓取 API,能够通过单个请求绕过 Python 中的 Cloudflare。它通过其高级反机器人功能和代理模式简化了将抓取任务集成到您的工作流程中的过程。
👍优点:
- 便于使用。
- 能够绕过反机器人,例如 Cloudflare 和 CAPTCHA。
- 它可以绕过 Cloudflare v2 challenge CAPTCHA。
- 包括智能旋转和高级代理。
- ZenRows 可以抓取 JavaScript 呈现的页面。
- 它与其他库兼容,可以轻松集成到您现有的工作流程中。
- 开发人员完成的聊天支持。
- 不断更新。
👎缺点:
- 这是一项付费服务,但提供免费试用。
如何使用 ZenRows 在 Python 中绕过 Cloudflare
要从不受保护的来源抓取数据,您只需要两条信息:免费的 API 密钥和目标网站的 URL。
因此,回到我们抓取 Opensea 网站的案例,您只需 1) 导入库requests
和 2)get()
使用您要抓取的 URL 向 ZenRows API 发送请求。
import requests response = requests.get("https://api.zenrows.com/v1/?apikey=YOUR_API_KEY&url=https%3A%2F%2Fopensea.io%2Frankings%2Ftrending") print(response.text)
当谈到使用 Python 绕过 Cloudflare 时,只需将参数添加&antibot=true
到proxy_country
您的请求中:
response_antibot = requests.get("https://api.zenrows.com/v1/?apikey=YOUR_API_KEY&url=https%3A%2F%2Fopensea.io%2Frankings%2Ftrending&antibot=true&premium_proxy=true&proxy_country=us") print(response_antibot.text)
要抓取特定信息,请通过添加.Wait For Selector&wait_for=.background-load
功能来补充您的请求。这将使 ZenRows 在继续数据提取之前等待所需的内容加载。
response_specific = requests.get("https://api.zenrows.com/v1/?apikey=YOUR_API_KEY&url=https%3A%2F%2Fopensea.io%2Frankings%2Ftrending&js_render=true&wait_for=.content") print(response_specific.text)
只需几秒钟,ZenRows API 就会返回网页内容。这是我们从 Opensea 网页上得到的:
<!DOCTYPE html><html lang="en-US"><head><meta charSet="utf-8"/><meta content="width=device-width,initial-scale=1" name="viewport"/><link href="https://opensea.io/rankings/trending" hrefLang="en" rel="alternate"/><link href="https://opensea.io/zh-CN/rankings/trending" hrefLang="zh-CN" rel="alternate"/><link href="https://opensea.io/zh-TW/rankings/trending" hrefLang="zh-TW" rel="alternate"/><link href="https://opensea.io/de-DE/rankings/trending" hrefLang="de-DE" rel="alternate"/><link href="https://opensea.io/es/rankings/trending" hrefLang="es" rel="alternate"/><link href="https://opensea.io/fr/rankings/trending" hrefLang="fr" rel="alternate"/><link href="https://opensea.io/kr/rankings/trending" hrefLang="kr" rel="alternate"/><link href="https://opensea.io/ja/rankings/trending" hrefLang="ja" rel="alternate"/><link rel="preload"......
这就是全部!您现在可以使用 Python 为任何网站绕过 Cloudflare。
cloudscraper
cloudscraper 是作为一种易于使用的 Python Cloudflare 绕过算法而构建的。requests
该包在功能和参数接受方面非常相似。它的 JavaScript 引擎可以通过模仿常规 Web 浏览器的行为轻松解码和解析 JavaScript。
👍优点:
- 便于使用。
👎缺点:
- 它在使用 Cloudflare v2 challenge CAPTCHA 的网站上失败。
- 初学者很难。
- 不经常更新。
- 它在大型抓取项目中效果不佳。
如何使用 cloudscraper 在 Python 中绕过 Cloudflare
要在 Python 中使用 cloudscraper 绕过 Cloudflare,请先安装它:
pip install cloudscraper
使用 clouscraper 的最快方法是调用create_scraper()
. 然后,clouscraper 的操作方式与会话对象相同requests
;您只需将 calls 替换为requests.get()
orrequests.post()
或scraper.get()
or scraper.post()
。
import cloudscraper scraper = cloudscraper.create_scraper(delay=10, browser="chrome") content = scraper.get("https://opensea.io/rankings/trending").text print(content)
cloudscraper
Python 包应该用一个额外的库来补充,比如BeautifulSoup4
解析被抓取的数据:
from bs4 import BeautifulSoup as bs # To further process extracted data processed_content = bs(content, "html.parser") # These classes are not reliable, added here for demo purposes processed_content = processed_content.find_all(".eqFKWH .hmMxZB .mGAUR") scraped_data = list() for data in soup: scraped_data.append(data.get_text()) print(scraped_data)
运行脚本应该抓取目标网站,你的结果应该是这样的:
[ 'PATCHWORKS', 'Moonrunners Official', 'Frog Affirmation Project (FAP)', 'Checks - VV Edition', … ]
然而,使用 cloudscraper 库的缺点是它无法绕过 Cloudflare v2 挑战。这意味着如果您遇到使用此类保护的网站,您的抓取工具将变得无效。例如,如果您尝试解析forever21.com,clouscraper 将返回以下错误消息:
cloudscraper.exceptions.CloudflareChallengeError: Detected a Cloudflare version 2 Captcha challenge, This feature is not available in the opensource (free) version.
一种可能的解决方案是使用第三方 CAPTCHA 求解器,或提供绕过反机器人程序的 Web 抓取 API。
cfscrape
由于技术复杂性较低,cfscrape 包是 Cloudflare 中绕过 Python 网络抓取的另一种流行选择。您需要做的就是安装requests
模块以便与 cfscrape scraper 交互。
它的简单性使其成为那些希望在不需要高级技术技能的情况下开始网络抓取的人的绝佳选择。
然而,它cfscrape
并不完美:它只能处理具有经典 Cloudflare 反机器人保护的网页,这意味着它在 reCAPTCHA 挑战中完全无效。
👍优点:
- 易于使用和实施。
👎缺点:
- 对 reCAPTCHA 挑战无效。
- 它缺乏维护和更新。
- 不像其他抓取库那样功能丰富。
- 它不能处理大规模的抓取。
如何使用 cfscrape 在 Python 中绕过 Cloudflare
要在 Python 中使用 cfscrape 绕过 Cloudflare,请通过 运行安装命令pip
。
pip install cfscrape
下一步是导入模块并调用create_scraper()
方法。其余的工作方式与requests
库相同,因此我们发出的任何请求都会绕过 Cloudflare 的反机器人保护并从网页中抓取必要的信息。
import cfscrape scraper = cfscrape.create_scraper() scraped_data = scraper.get('https://opensea.io/rankings/trending') print(scraped_data.text)
该库返回我们在上一个示例中看到的相同 HTML。
未检测到的_chromedriver
作为 Selenium 的扩展而开发的Undetected-chromedriver因其绕过机器人保护软件的能力而在其他类似产品中脱颖而出。通常,此模块会自动将驱动程序二进制文件加载到您的系统中,并在以后对其进行修补。
👍优点:
- 它可以绕过机器人保护。
- 它会自动加载和修补驱动程序二进制文件。
👎缺点:
- 与其他网络抓取工具相比,它很慢。
- 对于大规模网络抓取任务效率低下。
如何使用 undetected_chromedriver 在 Python 中绕过 Cloudflare
要使用 undetected-chromedriver 绕过 Python Cloudflare,请先安装它:
pip install undetected-chromedriver
现在,导入 undetected-chromedriver 并使用该uc.Chrome()
方法创建一个无头 Chrome 网络浏览器对象,然后使用该driver.get()
方法添加到您要抓取的 URL。
import undetected_chromedriver as uc driver = uc.Chrome() driver.get('https://opensea.io/rankings/trending')
需要注意的是,该undetected_chromedriver
库只是为了绕过 Cloudflare 的安全措施而设计的,不能用作复杂抓取的主要解决方案。因此,您必须将此模块与其他库结合起来才能从网站上抓取数据。
在这里,您可以看到在强化的无头浏览器中打开的输出网页:
未检测到的 Chromedriver scraper 的输出
结论
了解如何绕过反机器人与抓取过程本身一样重要,尤其是当您希望抓取受 Cloudflare 保护的网页时。在本文中,我们介绍了可用于使用 Python 绕过 Cloudflare 的不同技术:ZenRows、clouscraper、cfscrape 和 undetected-chromebrowser。
虽然这些工具中的大多数都可以有效地绕过 Python Cloudflare 检测,但在涉及大规模抓取或高级 Cloudflare 安全措施(如 Cloudflare v2 challenge CAPTCHA)时,它们会失败。