你是否正在寻找使用 Selenium WebDriver 工具绕过 CAPTCHA 的方法?那么你来对地方了,下面的文章将指导你如何在 Python 中使用 Selenium 绕过 CAPTCHA。

自动化让我们的生活和工作更加轻松。通过使用自动化,我们能够在短时间内抓取大量数据并自动完成重复性任务。这使我们能够腾出更多时间来处理更重要的业务问题。然而,这种便利对我们所自动化操作的网站和平台来说是有代价的。

许多网站并不喜欢自动化访问,将网页抓取视为数据盗窃,并可能将你的自动化访问视为潜在威胁,例如分布式拒绝服务攻击(DDoS 攻击)。

这些网络服务阻止用户的一种方式是使用 CAPTCHA。CAPTCHA 本质上是一种测试,人类可以轻松解决,但机器却很难通过。不过幸运的是,机器可以完全绕过 CAPTCHA,而这正是我在本指南中要向你展示的内容。我将教你如何使用 Selenium 的补丁来访问网站,而不会被 CAPTCHA 阻止。


为什么会显示 CAPTCHA?

当网站怀疑有人使用自动化手段时,他们会跟踪用户活动,并向用户显示验证码——如果无法解决,则表明先前操作的发起者是机器人。

然而,最近,人们采用了更复杂的验证码,向所有用户显示人类可以轻松解决的验证码。以 Cloudflare 保护的网站为例,在会话开始时,您会收到一个验证码,只需选中标题为“您是人类”的复选框即可解决。

这个相当简单的活动用于检测用户是人类还是机器人。即使机器人检查了它,它仍会被识别为机器人,因为它会在检查之前和之后监控行为。这是大多数自动化机器人被 Cloudflare 和其他复杂的反机器人系统保护的网站阻止的主要原因。


Selenium 是解决验证码问题的解决方案吗?

如果您试图避免和绕过验证码,Selenium 是您应该使用的最差的工具。我会告诉您原因。您会发现,当它被开发时,它并​​不是专门为网络抓取和潜在滥用目标而开发的。它是作为网络测试工具开发的。

因此,它有一个固有的问题,使它们很容易被复杂的反机器人系统识别——它会留下痕迹。我曾尝试使用 Selenium 和代理,尝试触发一些互动、滚动页面和执行其他手势,但仍然被检测为机器人。因此,如果你的目标不仅仅是跟踪 IP 地址,使用 Selenium 就是在浪费时间,你仍然会被阻止,因为它不是为隐藏其足迹而开发的。


那么解决方案是什么?

只需使用undetected_chromedriver包即可。不过,这并不是一个全新的工具——它基于 Selenium Web 驱动程序构建,具体来说,它被视为 Selenium Chrome 驱动程序的替代品,只是它专门用于绕过机器人检查并隐藏它是机器人的事实。

如果您想查看代码,您可以在Github 上的 undetectable_chromedriver 存储库页面上查看。虽然您也可以直接从这里安装它,但使用 pip 命令更容易。


让我们开始吧:安装软件包和依赖项

首先,让我们安装所有需要的软件包。对于本指南,您唯一需要的是 undetected_chromedriver。以下是用于安装它的 pip 命令。

pip install undetected_chromedriver

上述命令将安装该软件包及其所有依赖项。依赖项包括 sortedcontainers、wsproto、websocket-client、pysocks、outcome、trio、trio-websocket 和 selenium 本身。由此,您可以看到为什么我没有包含有关如何安装 Selenium 的指南,因为安装 undetected_chromedriver 将安装它和其他依赖项。


导入包并创建浏览器实例

现在我们已经安装了包,是时候开始编码了。导入 undetectable_chromedriver 并创建一个浏览器实例。我们将使用浏览器实例来访问网页。

import undetected_chromedriver as webdriver

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument("--headless")

chrome_options.add_argument("--use_subprocess")

browser = webdriver.Chrome(options=chrome_options)

上面的代码基本上将 undetected_chromedriver 导入为 Web 驱动程序,创建 chrome 选项对象,并向其传递诸如 headless 和 use subprocess 之类的参数。添加 —headless 参数后,浏览器将以无头模式工作 – 也就是说,您不会看到浏览器 UI – 这实际上节省了更多内存,应该在生产中使用。

您应该关闭此功能的原因是在调试时您想看看自己正在做什么。

最后一行基本上创建了浏览器实例。让我们使用下面的代码来访问一个页面 — 假设是维基百科的主页。

import undetected_chromedriver as webdriver

chrome_options = webdriver.ChromeOptions()

#chrome_options.add_argument("--headless")

chrome_options.add_argument("--use_subprocess")

browser = webdriver.Chrome(options=chrome_options)

browser.get('https://wikipedia.org')

input()

使用上述代码,您将看到 Chrome 浏览器窗口将启动并打开 Wikipedia 的主页。行末的 input() 是为了阻止浏览器在到达脚本末尾时关闭。现在让我们将页面标题打印到屏幕上。

在 GET 请求后立即添加此行

print(browser.title)

另外,我想删除带有 —headless 标志的 add_argument 行的注释标志 (#)。此外,删除最后一行(包含 input() 的行)。现在,当您执行这两项操作并运行脚本时,您将看不到任何浏览器启动。但是,您会注意到它在控制台上打印出 Wikipedia 主页的标题。

您会注意到 undetectable_chromedriver 的一个特点是它不会让用户知道它是自动化的。如果您使用的是 Selenium,您会看到浏览器 UI 上附加了一个标志,告诉您它已被自动化。类似这样的情况:Chrome 正由自动化测试软件控制。让我们使用下面的代码来解决验证码。

import undetected_chromedriver as webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

# Initialize undetected Chrome driver

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument("--use_subprocess")

browser = webdriver.Chrome(options=chrome_options)

browser.get("TARGET_URL")

try:

# Wait for the checkbox element to load and be clickable

wait = WebDriverWait(browser, 30)

captcha_checkbox = wait.until(

EC.element_to_be_clickable((By.XPATH, '//input[@type="checkbox"]'))

)

# Click the CAPTCHA checkbox

captcha_checkbox.click()

print("Checkbox clicked successfully!")

# Proceed after CAPTCHA

print(browser.title)

except Exception as e:

print(f"Error while handling CAPTCHA: {e}")

finally:

browser.quit()

如上所示,我导入了一堆模块 WebDriverWait。这会使浏览器实例等待。当浏览器必须等待某些数据点加载并在 DOM 中可用时,就会使用它。如果不使用它,您将很难抓取在初始加载后加载页面主要内容的 Ajaxified 页面。

在代码中,我们假设页面上的第一个复选框是用于解决验证码的复选框,我们只需单击即可。这意味着,如果您的验证码需要的不仅仅是单击复选框元素,那么您需要对其进行一些调整以满足您的要求。


使用 Captcha Solver 和未被检测到的 Chromedriver

undetected_chromedriver 的行为和元数据并未显示它是一个机器人。如果您的目标网站仅向可疑流量显示验证码,那么您很可能会获得通过。因此,如果您的目标受到 ReCaptcha 及其类似程序的保护,那么仅仅访问它不会让验证码出现,除非您的使用引起怀疑。

但是,如果您的目标受到 Cloudflare 之类的保护,并向所有用户显示验证码,那么您将需要使用验证码求解器。我建议您放弃尝试自己解决这些问题的想法,而是使用验证码求解器。市场上有许多验证码求解器可供您使用,其中大多数使用自动化方法解决较简单的验证码,而使用人工解决复杂的验证码。

市场上最好的一些验证码求解器包括2CaptchaBypassCaptchaCapSolverAntiCaptchaBest Captcha Solver。重要的是,您要知道所有验证码求解器都需要花钱。然而,上述这些在有效性和可负担性之间取得了平衡。


使 Selenium 无法被检测到以绕过验证码的技巧

让我们看一看如何让 undetected_chromedriver 真正无法被检测到。

  • 开启无头模式

关于 Undetected_chromdriver 需要注意的第一件事是它也不是无敌的。确保关闭无头标志。这是因为当关闭时,它们会变得可见并被检测到。打开 GUI 后您将面临的另一个问题是它会消耗大量内存。对于小规模抓取,这可能不是问题,但如果您需要大规模抓取,内存消耗将使其效率低下。

  • 使用轮换住宅代理

不管你如何努力不被发现,如果你一分钟内数百个请求都使用同一个 IP 地址,那么这肯定会暴露你正在使用机器人。你需要获取多个 IP 地址,而轮换代理可以让你轻松实现这一点。

我特别推荐住宅代理的原因是,它们的 IP 与普通互联网用户使用的 IP 相同。如果您选择数据中心代理,这些 IP 已经与垃圾邮件相关联,很容易让您被阻止。您可以从Bright DataSmartproxy等公司购买高质量的轮换住宅代理。这两项服务都有数百万个 IP 池、广泛的位置支持和出色的速度性能。

  • 模仿人类行为

当您抓取具有强大反垃圾邮件系统的网站时,您需要令人信服地表现出您是人类。否则,您将被要求解决验证码。如何才能看起来尽可能像人类?

通过模仿他们的行为。在大多数情况下,人类在填写表格时会打字,而不是一直复制粘贴。人类还会滚动、移动鼠标​​光标,甚至在页面上等待一段时间后再移动到下一个页面。我建议您在请求之间设置延迟,并且延迟时间应该是随机的。这样,反机器人系统就无法检测到要使用的模式并锁定您。


使用 Selenium 绕过验证码的替代方法

使用 Selenium 及其工具(例如 undetected_chromedriver)可以绕过 Captcha。但是,除非您的工作是构建网络抓取工具,否则我建议您不要这样做。这是因为您需要始终保持更新并不断进行更改,因为反机器人系统也会更新以修补这些工具利用的漏洞。如果您的目标网站受到验证码保护,我建议您使用抓取 API。

使用抓取 API,您无需担心更换代理/IP、更改用户代理字符串、渲染 JS 甚至绕过验证码。这些 API 会为您完成这些工作。您只需向他们发送 Web 请求,他们就会为您返回响应。有趣的是,您只需为成功的请求付费

市场上有很多这样的产品。但是,如果您的目标受到高度复杂的反垃圾邮件系统的保护,例如 Cloudflare 和 Perimeter X,我建议您使用ScraperAPI

但是,ScrapingBee之类的工具是更好的选择,特别是如果您想要一个具有解析支持的工具,因为ScraperAPI只会返回 HTML。对于更便宜的替代方案,使用 Serper.dev 替代方案也不会错。


结    论

读完这篇文章后,我希望你已经得出结论:尽管可以使用 Selenium 绕过 CAPTCHA,但这种努力往往得不偿失。相反,你应该专注于使用Web 爬取 API。这些 API 同样使用无头浏览器,因此处理 JavaScript 渲染不是问题。此外,它们还内置了自己的代理以及其他绕过 CAPTCHA 和阻止机制的技术,而且价格也非常实惠。

这篇文章有用吗?

点击星号为它评分!

平均评分 / 5. 投票数:

到目前为止还没有投票!成为第一位评论此文章。

No more articles