如何使用Selenium避免机器人检测
是否可以使用 Selenium 避免机器人检测?是的。
我们知道反机器人保护会变得多么烦人,但您可以使用一些解决方案来绕过它们。我们将介绍绕过 Selenium 检测的九种最重要的方法:
- 进行 IP 轮换/使用代理。
- 禁用自动化指示器 WebDriver Flags。
- 旋转 HTTP 标头信息和用户代理。
- 避免模式。
- 删除 JavaScript 签名。
- 使用 cookie。
- 跟随页面流。
- 使用浏览器扩展。
- 使用验证码解决服务。
反机器人如何工作?
机器人检测是扫描和过滤网络流量以检测和阻止恶意机器人的过程。Cloudflare、PerimeterX和Akamai等反机器人程序供应商孜孜不倦地寻找使用无头浏览器和标头数据以及不同行为模式检测机器人程序的方法。
当客户端请求网页时,有关请求的性质和请求者的信息被发送到服务器进行处理。主动和被动检测是反机器人用来检测机器人活动的两种主要方法。查看我们关于机器人检测的文章以了解更多信息。
网站如何检测Selenium?
Selenium 是网络抓取领域中流行的工具之一。因此,具有严格反机器人策略的网站会在阻止对其资源的访问之前尝试识别其独特属性。
Selenium 机器人检测主要通过测试在执行 Selenium 时出现的指定 JavaScript 变量来工作。机器人检测器经常检查任何变量(在 window 对象上)中的单词“Selenium”或“WebDriver”,以及名为$cdc_
和的文档变量$wdc_
。
他们还检查 WebDriver 中自动化指示器标志的值,例如useAutomationExtension
和navigator.webdriver
。默认情况下启用这些属性以提供更好的测试体验并作为安全功能。
使用 Selenium 避免机器人检测的主要措施
如今,机器人检测已成为网络抓取工具的头疼问题,但有一些方法可以绕过它。以下是您可以使用 Python 和 Selenium 避免机器人检测的一些技术:
1.IP轮换/代理
大多数机器人检测器的主要工作方式之一是检查 IP 行为。Web 服务器可以通过为每个请求维护日志来从 IP 地址中提取模式。
他们使用 Web 应用程序防火墙 (WAF) 来跟踪和阻止 IP 地址活动并将可疑 IP 列入黑名单。对服务器的重复和编程请求可能会损害 IP 声誉并导致永久阻止。
为避免 Selenium 机器人检测,您可以使用 IP 轮换或代理。代理充当请求者和服务器之间的中介。
响应服务器将请求解释为来自代理服务器,而不是客户端的计算机。因此,它无法绘制行为分析模式。
# Install selenium with pip install selenium from selenium import webdriver # Import chromedriver_autoinstaller to install chromedriver automatically import chromedriver_autoinstaller # Installs chromedriver which corresponds to the main Chrome automatically chromedriver_autoinstaller.install() # Define the proxy server PROXY = "IpOfTheProxy:PORT" # Set ChromeOptions() chrome_options = webdriver.ChromeOptions() # Add the proxy as argument chrome_options.add_argument("--proxy-server=%s" % PROXY) chrome = webdriver.Chrome(options=chrome_options) # Send the request chrome.get("https://www.google.com")
IP 轮换是一种使用多个代理服务器来伪装请求服务器的方法。
2. 禁用自动化指示器 WebDriver 标志
在使用 Selenium 进行网络抓取时,WebDriver 会向服务器发送信息以指示请求是自动执行的。
WebDriver 预计将具有window.navigator.webdriver
W3C WebDriver 规范强制要求的属性,以允许更好的可测试性和作为安全功能。这会导致被 Web 服务器检测到,从而导致被标记或拒绝访问。
execute_cdp_cmd(cmd, cmd_args)
随着命令的可用性,您现在可以使用 Selenium 轻松执行 Google-Chrome-DevTools 命令。这使得更改默认旗舰成为可能。
from selenium import webdriver import chromedriver_autoinstaller chromedriver_autoinstaller.install() # Create Chromeoptions instance options = webdriver.ChromeOptions() # Adding argument to disable the AutomationControlled flag options.add_argument("--disable-blink-features=AutomationControlled") # Exclude the collection of enable-automation switches options.add_experimental_option("excludeSwitches", ["enable-automation"]) # Turn-off userAutomationExtension options.add_experimental_option("useAutomationExtension", False) # Setting the driver path and requesting a page driver = webdriver.Chrome(options=options) # Changing the property of the navigator value for webdriver to undefined driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.get("https://www.website.com")
3.旋转HTTP头信息和User-Agent
HTTP 标头包含有关浏览器、操作系统、请求类型、用户语言、引用者、设备类型等的信息。
{ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-US,en;q=0.9", "Host": "httpbin.org", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", }
默认情况下,其中一些属性的值对于无头浏览器是不同的,反机器人识别这些差异以区分合法访问者和机器人。为了减轻检测,轮换用户代理可能会有所帮助。
以下是我们如何使用旋转 HTTP 标头信息来避免使用 Selenium 检测机器人:
from selenium import webdriver import chromedriver_autoinstaller chromedriver_autoinstaller.install() driver = webdriver.Chrome() # Initializing a list with two Useragents useragentarray = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36", ] for i in range(len(useragentarray)): # Setting user agent iteratively as Chrome 108 and 107 driver.execute_cdp_cmd("Network.setUserAgentOverride", {"userAgent": useragentarray[i]}) print(driver.execute_script("return navigator.userAgent;")) driver.get("https://www.httpbin.org/headers") driver.close()
4.避免模式
自动化测试人员犯的主要错误之一是创建具有定义时间范围的机器人。人类不像机器人那样具有可靠的一致性,因此反机器人很容易识别机器人的一致模式。
从一个页面快速导航到另一个页面也是一个常见的错误,而人类不会这样做。
随机化时间框架、使用等待、更慢的滚动以及通常试图模仿人类行为肯定会增加避免机器人检测器的机会。以下是如何通过避免模式来绕过 Selenium 检测:
from selenium import webdriver from selenium.webdriver.common.by import By import chromedriver_autoinstaller from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time chromedriver_autoinstaller.install() driver = webdriver.Chrome() driver.get('https://scrapeme.live/shop/') # Wait 3.5 on the webpage before trying anything time.sleep(3.5) # Wait for 3 seconds until finding the element wait = WebDriverWait(driver, 3) element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.woocommerce-loop-product__title'))) print('Product name: ' + element.text) # Wait 4.5 seconds before scrolling down 700px time.sleep(4.5) driver.execute_script('window.scrollTo(0, 700)') # Wait 2 seconds before clicking a link time.sleep(2) wait = WebDriverWait(driver, 3) element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.woocommerce-loop-product__link'))).click() # wait for 5 seconds until finding the element wait = WebDriverWait(driver, 5) element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'woocommerce-product-details__short-description'))) print('Description: ' + element.text) # Close the driver after 3 seconds time.sleep(3) driver.close()
5. 移除 JavaScript 签名
FingerprintJS和Imperva等机器人检测器的工作方式之一是检查 WebDriver 内部的 JavaScript 签名,例如 ChromeDriver 和 GeckoDriver。
此签名存储在cdc_
变量中。cdc_
网站在拒绝访问之前会在文档中查找变量。
我们将使用名为Agent Ransack的工具在 chromedriver.exe 二进制文件中搜索此签名。对于 GeckoDriver 和 EdgeDriver 等 WebDriver,它的工作方式相同。
如您所见,签名是$cdc_asdjflasutopfhvcZLmcfl_
. 为了逃避检测,我们可以将“cdc”改为与“abc”等长的字符串。首先,我们需要打开 ChromeDriver 的二进制文件。我们将使用 Vim 编辑器打开和编辑二进制文件。
你可以在这里下载 Vim 。单击 Windows 的“标准自安装可执行文件”。该程序默认预装在 Mac 和 Linux 上。
安装后,打开 CMD 并键入它并导航到该文件夹。然后,运行以下命令:
vim.exe <pathTo>chromedriver.exe
然后键入:%s/cdc_/abc_/g
搜索并替换cdc_
为abc_
.
接下来,要退出 Vim,键入:wq
并按 Enter 键保存更改。
现在,让我们尝试使用 Agent Ransack 进行相同的搜索。
正如您现在看到的,cdc_
在文件中找不到签名变量。
6. 使用 Cookie
当试图从社交媒体平台或其他需要某种形式的身份验证的网站上抓取数据时,重复登录是很常见的。
此迭代身份验证请求会发出警报,帐户可能会被阻止或面临验证码或 JavaScript 挑战。
为了避免这种情况,我们可以使用 cookie。登录一次后,我们可以收集登录会话 cookie,以备将来重用。
7.跟随页面流
与网站交互时,遵循与人类用户相同的流程非常重要。
这意味着点击链接、填写表格并自然地浏览网站。
遵循页面流可以使您在执行自动化时不那么明显。
8. 使用浏览器扩展
绕过 Selenium 检测的另一种方法是使用浏览器扩展程序(如 uBlock Origin)来阻止在页面上加载 JavaScript 挑战和验证码。这有助于减少您的机器人被这些挑战检测到的机会。
uBlock Origin是一个免费的开源浏览器扩展,旨在阻止不需要的内容(例如广告、跟踪脚本和恶意软件)加载到网页上。
它还可以配置为阻止 JavaScript 挑战和验证码,这有助于减少您的机器人被这些挑战检测到的机会。
要使用 uBlock Origin 来避免 Selenium 机器人检测,您需要在浏览器中安装扩展程序并将其配置为阻止 JavaScript 挑战和验证码。
然后,您可以像往常一样使用 Selenium 与浏览器交互,uBlock Origin 将自动阻止任何不需要的内容加载到页面上。
请务必注意,uBlock Origin 可能不适用于所有网站,并且它可能无法阻止所有类型的 JavaScript 挑战和验证码。
但是,它可以成为减少机器人被这些挑战检测到的机会的有用工具,尤其是与其他方法结合使用时。
9. 使用 Selenium 的验证码解决服务
如果您需要在机器人工作流程中解决 CAPTCHA,您可以使用Anti-Captcha或2Captcha等 CAPTCHA 解决服务。这些服务使用真人来解决验证码,减少您的机器人被检测为机器人的机会。
当使用 Selenium 的验证码解决服务时,谨慎使用它以避免机器人检测很重要。这意味着您应该只在必要时使用该服务,并避免对您遇到的每个验证码都使用它。
有几个原因。首先,过于频繁地使用该服务会引发危险信号并增加您的机器人被检测到的机会。如果您对遇到的每一个验证码都使用验证码解决服务,网站可能更可能怀疑您正在使用机器人。
其次,过于频繁地使用该服务可能代价高昂。许多 CAPTCHA 解决服务对他们解决的每个 CAPTCHA 收取费用,因此过于频繁地使用该服务会显着增加运行机器人的成本。
为避免这些问题,最好仅在必要时使用验证码解决服务。最好使用其他方法,例如自然延迟或浏览器扩展,尽可能避免验证码。
这有助于减少您的机器人被检测到的机会,还有助于降低运行机器人的总体成本。
Selenium的替代品
使用 Selenium 避免机器人检测非常简单,但其他方法与 Selenium 一样高效,例如使用 ChromeDrivers、Cloudscraper 和 API。
ZenRows API
ZenRows的基于 API 的反机器人绕过解决方案是网络爬虫和网络抓取器评价最高的解决方案之一。
它通过为一系列反机器人解决方案调用 API 来工作,并提供旋转代理、自定义标头、WAF绕过和 CAPTCHA 绕过工具等解决方案。
import requests # Unique API key and URL of page you want to scrape url = "https://nowsecure.nl" proxy = "http://YOUR_API_KEY:[email protected]:8001" proxies = {"http": proxy, "https": proxy} response = requests.get(url, proxies=proxies, verify=False) print(response.text)
Undetected_ChromeDriver
Undetected_ChromeDriver 是一个使 Selenium ChromeDriver “看起来”像人类的开源项目。这是一个优化的 Selenium ChromeDriver 补丁,不会触发反机器人服务,如 Distill Network、Imperva、DataDome 和 Botprotect.io。
它比普通的 Selenium 更有效地绕过 JavaScript 挑战等机器人检测措施。JavaScript 挑战通常用作减轻网络攻击(如 DDOS 攻击)并禁止抓取的一种手段。
质询包括向浏览器发送包含质询的 JavaScript 代码。合法的浏览器有一个 JavaScript 堆栈,可以理解并通过挑战。
from selenium import webdriver import chromedriver_autoinstaller chromedriver_autoinstaller.install() driver = webdriver.Chrome() driver.get("https://nowsecure.nl")
如您所见,Selenium 无法绕过上述网站的安全性,所以让我们试试 undetected_ChromeDriver。
# pip install undetected-chromedriver import undetected_chromedriver.v2 as uc # Initializing driver driver = uc.Chrome() # Try accessing a website with antibot service driver.get("https://nowsecure.nl")
惊人的!我们能够使用 undetected_ChromeDriver 避免机器人检测器。
Undetected_ChromeDriver 也适用于 Brave Browser 和许多其他基于 Chromium 的浏览器。有关更多信息,您可以在GitHub上查看此项目。
一方面,它能够比基本 Selenium 更好地绕过一些机器人检测措施。然而,undetected_ChromeDriver 在绕过 Cloudflare 和 Akamai 等强大的反机器人保护方面仍然存在不足。
云盘
Cloudflare 是市场上最受欢迎的反机器人解决方案提供商之一。它是一个 Python 模块,用于绕过通过请求实现的 Cloudflare 反机器人(也称为“我处于攻击模式”或 IUAM)。
Cloudflare 采用主动和被动机器人检测技术。对于被动检测机器人程序,Cloudflare 维护着与恶意机器人程序网络相关的设备、IP 地址和行为模式的目录。
然后它会检查 IP 地址信誉、HTTP 请求标头、TLS 指纹识别等以过滤掉机器人。它还采用主动检测方法,包括验证码、画布指纹识别和事件跟踪。
Cloudflare 的主要 bot 保护方法,称为“等候室”,检查客户端是否支持 JavaScript 以及它是否能够解决复杂的 JavaScript 挑战。
Cloudscraper 依靠 JavaScript 引擎/解释器来解决受保护网站的 JavaScript 挑战。
任何使用 Cloudscraper 的脚本在首次访问任何启用了 Cloudflare 反机器人的站点时都会休眠大约五秒钟。
# Install cloudscraper with pip install cloudscraper import cloudscraper # Create cloudscraper instance scraper = cloudscraper.create_scraper() # Or: scraper = cloudscraper.CloudScraper() # CloudScraper inherits from requests.Session print(scraper.get("https://nowsecure.nl").text)
请注意,Cloudscraper 不适用于最新版本的 Cloudflare 反机器人保护。
Detected a Cloudflare version 2 challenge, This feature is not available in the opensource (free) version.
结论
在本文中,我们讨论了为什么网站使用反机器人、它们如何工作以及使用 Selenium 避免机器人检测的最佳方法。
我们还看到了替代工具,如 undetected-ChromeDriver、Cloudscraper 和 ZenRows 的 API 解决方案,以避免在使用 Python 进行网页抓取时被检测到。