Python Selenium中未检测到ChromeDriver & 常见错误
Selenium 带有一个默认的 WebDriver,它通常无法绕过抓取反机器人程序。然而,您可以使用 Undetected ChromeDriver 对其进行补充,这是一种第三方 WebDriver 工具,可以做得更好。
在本教程中,您将学习如何在 Python 中将 Undetected ChromeDriver 与 Selenium 结合使用并解决最常见的错误。
什么是未检测到的 ChromeDriver?
Undetected ChromeDriver 是一个经过优化的 Selenium WebDriver,可以避免触发反机器人程序。
一些例子?Cloudflare和阿卡迈。它适用于 Google Chrome、Brave 和许多其他基于 Chromium 的浏览器。
如何在带有 Selenium 的 Python 中使用未检测到的 ChromeDriver?
准备工作
要使用Undetected ChromeDriver 2,您需要具备以下条件:
安装undetected_chromedriver
以与 Selenium 和 Python 一起使用。
pip install undetected-chromedriver
备注:如果您没有安装 Selenium,它将自动添加 ChromeDriver。
获得所需的工具后,让我们编写第一行代码。
import undetected_chromedriver as uc driver = uc.Chrome() driver.get("https://www.nowsecure.nl") print(driver.current_url) # https://www.nowsecure.nl/ print(driver.title) # nowSecure
该脚本将加载 Chrome 浏览器,然后重定向并加载我们目标 URL 的所有网站资源https://www.nowsecure.nl/
。要查看它是否有效,我们将打印此主页的地址和标题。
重要的是要注意基本 Selenium 的 WebDriver 没有提供默认启用的无头模式。要更改此设置,我们会将选项传递给undetected_chromedriver
.
# ... options = uc.ChromeOptions() options.headless = True driver = uc.Chrome(options=options) # ...
将未检测到的 ChromeDriver 与 Selenium 结合使用
与 Undetected ChromeDriver 建立安全连接后,我们将使用 Selenium 来查找我们想要的信息。
我们对OpenSea页面上提供的信息很感兴趣。因此,我们将使用 CSS 选择器和 Selenium 的find_elements
方法来匹配类的所有出现。
from selenium.webdriver.common.by import By # ... driver.get("https://opensea.io") node = driver.find_element(By.CSS_SELECTOR, "h5[class='sc-29427738-0 sc-bdnxRM kgxFZp hBeyeI']") print(node.accessible_name) # "I'm Spottie" Vinyl Record Collection verified-icon
您可以在我们的网络抓取指南中查看更多Selenium 使用案例。
未检测到 ChromeDriver 代理
您还可以使用具有 Undetected ChromeDriver 的代理来避免在网络抓取时被阻止。但是,选择免费解决方案对您没有多大好处,因为免费代理通常不可靠。原因是它们由资源有限且基础设施通常过时的供应商运营。由于它们是公开的,因此很多人都在使用它们,这很容易导致 IP 禁令。
另一方面,高级代理维护良好并来自信誉良好的 ISP 提供商,因此与数据中心 IP 相比,它们是网络抓取的更好选择。
像 ZenRows 这样的抓取工具通过 API 调用提供了一个高级代理池,使您可以轻松地轮换代理以隐藏您的 IP 并避开所有障碍。
未检测到的 ChromeDriver 和 Selenium 的常见错误
undetected_chromedriver
我们可以从Selenium得到的最常见的错误是:
- 拒绝访问。
- 无头闪避。
我们将详细了解每个问题以了解如何解决它们。
拒绝访问
根据PyPi 上的当前版本,Undetected ChromeDriver 比 Selenium WebDriver 更适合绕过反机器人程序。但是,不能保证结果。
例如,让我们尝试使用https://www.zoominfo.com
作为目标 URL。
# ... driver.get("https://www.zoominfo.com") # Access denied | www.zoominfo.com used Cloudflare to restrict access
在这里,我们未能绕过 ZoomInfo 实施的机器人检测系统。
像ZenRows这样的 Web 抓取 API在这里非常有用,因为它的反机器人功能成功地为我们处理了绕过。作为演示,让我们用它来抓取我们的目标页面。
首先,通过注册获取免费的 API 密钥,然后使用以下命令安装 ZenRows:
pip install zenrows
作为规则,我们在进行 API 调用之前设置和antibot
以建立与目标网站的连接。premium_proxy
true
from zenrows import ZenRowsClient client = ZenRowsClient(API_KEY) url = "https://zoominfo.com" params = {"antibot": "true", "premium_proxy": "true"} response = client.get(url, params=params) print(response.text)
ZenRows 的antibot
功能允许您绕过目前最棘手的反机器人解决方案。与 Undetected ChromeDriver 相比,这使其成为更好优化的工具。
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>ZoomInfo: B2B Database | Company Contacts & Intelligence</title> ...
无头逃避
根据GitHub 上的release 3.1.0,headless mode 和之前的 release 一样还在开发中,最新的还没有消息。
这意味着您不应该使用 headless 来保证不被发现。考虑到这一点,在常规模式下使用本文中介绍的驱动程序可能会很昂贵,具体取决于您的项目规模。
结论
在这个使用 Python 中的 Selenium 的 Undetected ChromeDriver 教程中,我们了解了该库为什么以及如何帮助我们。此外,我们将它与一种流行的替代方案进行了比较,后者在某些用例中可能更适合您的需求。
这是一个快速概述:
特征 | 未检测到的 ChromeDriver | zenrows |
---|---|---|
反机器人绕过 | 适用于保护较少的网站 | 可绕过任何抓取反机器人 |
无头浏览器 | 是的,但仍在进行中 | ✅ |
无头浏览器 | – | ✅ |
高级代理 | – | ✅ |
与 Selenium WebDriver 不同,undetected_chromedriver
它更加优化,这使得它可以更好地绕过机器人检测系统。然而,它有时无法绕过反机器人程序,这使得ZenRows成为一个很好的选择。
常见问题
未检测到的 ChromeDriver 是否安全?
未检测到的 ChromeDriver 有什么用?
未检测到的 ChromeDriver 用于避免触发反机器人措施。它是用于 Selenium 的 Web 驱动程序,可以避免机器人检测,您可以在 Python 中使用它来补充其官方 WebDriver。
为什么未检测到的 ChromeDriver 不工作?
如果未检测到的 ChromeDriver 不工作,可能是因为您遇到了以下错误之一:
- 拒绝访问:驱动程序有时无法绕过安全措施。
- Headless Evasion: headless模式尚未优化,因此可能无法避免检测。
如何在 Python Selenium 中使用未检测到的 ChromeDriver?
以下是在 Python 中将 Undetected ChromeDriver 与 Selenium 结合使用需要执行的操作:
- 安装 Python 3、Selenium 和 Chrome。
- 用于
pip install undetected-chromedriver
安装未检测到的 ChromeDriver。 - 导入库,加载 Chrome 浏览器,并获取您的目标站点。
- 通过打印主页的地址和标题来确保您已正确连接。
- 使用 CSS 选择器和 Selenium 的
find_elements
方法来查找您想要的信息。