🥳加入无抓取社区领取您的免费试用,访问我们强大的网页抓取工具包!
返回博客

如何使用不被检测的ChromeDriver进行网页抓取

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

17-Mar-2025

探索 Undetected ChromeDriver 如何帮助绕过反爬虫系统进行网页抓取,其中包含分步指南、高级方法和关键限制。此外,还将了解 Scrapeless——一个更强大的替代方案,可满足专业的抓取需求。

本指南将介绍:

  • Undetected ChromeDriver 是什么以及它如何发挥作用
  • 它如何最大限度地减少机器人检测
  • 如何将其与 Python 配合使用进行网页抓取
  • 高级用法和方法
  • 其关键限制和缺点
  • 推荐的替代方案:Scrapeless
  • 反机器人检测机制的技术分析

让我们开始吧!

什么是 Undetected ChromeDriver?


Undetected ChromeDriver 是一个 Python 库,它提供 Selenium 的 ChromeDriver 的优化版本。它已得到修补,以限制被诸如以下的反机器人服务检测:

  • Imperva
  • DataDome
  • Distil Networks
  • 等等……

它还可以帮助绕过某些 Cloudflare 防护,尽管这可能更具挑战性。

如果您曾经使用过 Selenium 等浏览器自动化工具,您就会知道它们可以让您以编程方式控制浏览器。为了实现这一点,它们会以不同于普通用户设置的方式配置浏览器。

反机器人系统会查找这些差异或“漏洞”以识别自动化的浏览器机器人。Undetected ChromeDriver 会修补 Chrome 驱动程序以最大限度地减少这些蛛丝马迹,从而减少机器人检测。这使其成为抓取受反抓取措施保护的网站的理想工具!

Undetected ChromeDriver 如何工作?


Undetected ChromeDriver 通过采用以下技术来减少来自 Cloudflare、Imperva、DataDome 和类似解决方案的检测:

  • 重命名 Selenium 变量以模仿真实浏览器使用的变量
  • 使用合法的、真实的 User-Agent 字符串以避免检测
  • 允许用户模拟自然的人机交互
  • 在浏览网站时正确管理 Cookie 和会话
  • 启用使用代理以绕过 IP 阻止并防止速率限制

这些方法有助于该库控制的浏览器有效地绕过各种反抓取防御。

使用 Undetected ChromeDriver 进行网页抓取:分步指南


步骤 #1:先决条件和项目设置

Undetected ChromeDriver 具有以下先决条件:

  • 最新版本的 Chrome
  • Python 3.6+:如果您的机器上未安装 Python 3.6 或更高版本,请从官方网站下载并按照安装说明进行操作。

**注意:**该库会自动为您下载和修补驱动程序二进制文件,因此无需手动下载 ChromeDriver。

为您的项目创建一个目录:

language Copy
mkdir undetected-chromedriver-scraper
cd undetected-chromedriver-scraper
python -m venv env

激活虚拟环境:

language Copy
# 在 Linux 或 macOS 上
source env/bin/activate

# 在 Windows 上
env\Scripts\activate

步骤 #2:安装 Undetected ChromeDriver

通过 pip 包安装 Undetected ChromeDriver:

language Copy
pip install undetected_chromedriver

此库将自动安装 Selenium,因为它是其依赖项之一。

步骤 #3:初始设置

创建一个 scraper.py 文件并导入 undetected_chromedriver:

language Copy
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
import json

# 初始化 Chrome 实例
driver = uc.Chrome()

# 连接到目标页面
driver.get("https://scrapeless.com")

# 抓取逻辑……

# 关闭浏览器
driver.quit()

步骤 #4:实现抓取逻辑

现在让我们添加从 Apple 页面提取数据的逻辑:

language Copy
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
import json
import time

# 创建一个 Chrome 网页驱动程序实例
driver = uc.Chrome()

# 连接到 Apple 网站
driver.get("https://www.apple.com/fr/")

# 给页面一些时间完全加载
time.sleep(3)

# 用于存储产品信息的字典
apple_products = {}

try:
    # 查找产品部分(使用提供的 HTML 中的类)
    product_sections = driver.find_elements(By.CSS_SELECTOR, ".homepage-section.collection-module .unit-wrapper")
    
    for i, section in enumerate(product_sections):
        try:
            # 提取产品名称(标题)
            headline = section.find_element(By.CSS_SELECTOR, ".headline, .logo-image").get_attribute("textContent").strip()
            
            # 提取说明(副标题)
            subhead_element = section.find_element(By.CSS_SELECTOR, ".subhead")
            subhead = subhead_element.text
            
            # 获取链接(如果可用)
            link = ""
            try:
                link_element = section.find_element(By.CSS_SELECTOR, ".unit-link")
                link = link_element.get_attribute("href")
            except:
                pass
            
            apple_products[f"product_{i+1}"] = {
                "name": headline,
                "description": subhead,
                "link": link
            }
        except Exception as e:
            print(f"Error processing section {i+1}: {e}")
    
    # 将抓取的数据导出到 JSON
    with open("apple_products.json", "w", encoding="utf-8") as json_file:
        json.dump(apple_products, json_file, indent=4, ensure_ascii=False)
    
    print(f"Successfully scraped {len(apple_products)} Apple products")
    
except Exception as e:
    print(f"Error during scraping: {e}")

finally:
    # 关闭浏览器并释放其资源
    driver.quit()

使用以下命令运行:

language Copy
python scraper.py

Undetected ChromeDriver:高级用法

现在您已经了解了库的工作原理,您可以开始探索一些更高级的场景。

选择特定的 Chrome 版本

您可以通过设置 version_main 参数来指定库要使用的特定版本的 Chrome:

language Copy
import undetected_chromedriver as uc

# 指定目标版本的 Chrome
driver = uc.Chrome(version_main=105)

使用 with 语法

为了避免在不再需要驱动程序时手动调用 quit() 方法,您可以使用 with 语法:

language Copy
import undetected_chromedriver as uc

with uc.Chrome() as driver:
    driver.get("https://example.com")
    # 代码的其余部分……

Undetected ChromeDriver 的限制

虽然 undetected_chromedriver 是一个功能强大的 Python 库,但它确实有一些已知的限制:

IP 阻止

该库不会隐藏您的 IP 地址。如果您正在从数据中心运行脚本,则很可能仍然会发生检测。同样,如果您的家庭 IP 声誉不佳,您也可能会被阻止。

要隐藏您的 IP,您需要将受控浏览器与代理服务器集成,如前所述。

不支持 GUI 导航

由于模块的内部工作原理,您必须使用 get() 方法以编程方式进行浏览。避免使用浏览器 GUI 进行手动导航——使用键盘或鼠标与页面交互会增加检测的风险。

对无头模式的支持有限

官方不支持 undetected_chromedriver 库完全无头模式。但是,您可以使用以下方法进行试验:

language Copy
driver = uc.Chrome(headless=True)

稳定性问题

由于多种因素,结果可能会有所不同。除了持续努力了解和对抗检测算法外,不提供任何保证。如果防护方法收到更新,则今天成功绕过反机器人系统的脚本明天可能会失败。

推荐的替代方案:Scrapeless


鉴于 Undetected ChromeDriver 的局限性,Scrapeless 为网页抓取提供了一种更强大、更可靠的替代方案,而不会被阻止。

我们坚定地保护网站的隐私。本博客中的所有数据都是公开的,仅用作抓取过程演示。我们不保存任何信息和数据。

为什么 Scrapeless 更出色

Scrapeless 是一种远程浏览器服务,它解决了 Undetected ChromeDriver 方法固有的问题:

  1. 持续更新:与 Undetected ChromeDriver(在反机器人系统更新后可能停止工作)不同,Scrapeless 会由其团队持续更新。

  2. 内置 IP 轮换:Scrapeless 提供自动 IP 轮换,消除了 Undetected ChromeDriver 的 IP 阻止问题。

  3. 优化的配置:Scrapeless 浏览器已经过优化以避免检测,这大大简化了流程。

  4. 自动解决验证码:Scrapeless 可以自动解决您可能遇到的验证码。

  5. 兼容多种框架:可与 Playwright、Puppeteer 和其他自动化工具配合使用。

登录 Scrapeless 以试用免费试用版。

推荐阅读:如何使用 Puppeteer 绕过 Cloudflare

如何使用 Scrapeless 抓取网页(不会被阻止)

以下是如何使用 Playwright 使用 Scrapeless 实现类似的解决方案:

步骤 1:注册并登录 Scrapeless

步骤 2:获取 Scrapeless API 密钥

获取 Scrapeless API 密钥

步骤 3:您可以将以下代码集成到您的项目中

language Copy
const {chromium} = require('playwright-core');

// 使用您的令牌的 Scrapeless 连接 URL
const connectionURL = 'wss://browser.scrapeless.com/browser?token=YOUR_TOKEN_HERE&session_ttl=180&proxy_country=ANY';

(async () => {
  // 连接到远程 Scrapeless 浏览器
  const browser = await chromium.connectOverCDP(connectionURL);
  
  try {
    // 创建一个新页面
    const page = await browser.newPage();
    
    // 导航到 Apple 的网站
    console.log('Navigating to Apple website...');
    await page.goto('https://www.apple.com/fr/', {
      waitUntil: 'domcontentloaded',
      timeout: 60000
    });
    
    console.log('Page loaded successfully');
    
    // 等待产品部分可用
    await page.waitForSelector('.homepage-section.collection-module', { timeout: 10000 });
    
    // 获取首页的特色产品
    const products = await page.evaluate(() => {
      const results = [];
      
      // 获取所有产品部分
      const productSections = document.querySelectorAll('.homepage-section.collection-module .unit-wrapper');
      
      productSections.forEach((section, index) => {
        try {
          // 获取产品名称 - 可能在 .headline 或 .logo-image 中
          const headlineEl = section.querySelector('.headline') || section.querySelector('.logo-image');
          const headline = headlineEl ? headlineEl.textContent.trim() : 'Unknown Product';
          
          // 获取产品说明
          const subheadEl = section.querySelector('.subhead');
          const subhead = subheadEl ? subheadEl.textContent.trim() : '';
          
          // 获取产品链接
          const linkEl = section.querySelector('.unit-link');
          const link = linkEl ? linkEl.getAttribute('href') : '';
          
          results.push({
            name: headline,
            description: subhead,
            link: link
          });
        } catch (err) {
          console.error(`Error processing section ${index}: ${err.message}`);
        }
      });
      
      return results;
    });
    
    // 显示结果
    console.log('Found Apple products:');
    console.log(JSON.stringify(products, null, 2));
    console.log(`Total products found: ${products.length}`);
    
  } catch (error) {
    console.error('An error occurred:', error);
  } finally {
    // 关闭浏览器
    await browser.close();
    console.log('Browser closed');
  }
})();

您还可以加入 Scrapeless 的Discord 以参与开发者支持计划并免费获得高达 50 万个 SERP API 使用积分。

增强的技术分析

机器人检测:工作原理

反机器人系统使用多种技术来检测自动化:

  1. 浏览器指纹识别:收集数十个浏览器属性(字体、画布、WebGL 等)以创建唯一的签名。

  2. WebDriver 检测:查找 WebDriver API 或其构件的存在。

  3. 行为分析:分析鼠标移动、点击、打字速度,这些速度在人和机器人之间有所不同。

  4. 导航异常检测:识别可疑模式,例如请求速度过快或缺乏图像/CSS 加载。

推荐阅读:如何绕过反机器人

Undetected ChromeDriver 如何绕过检测

Undetected ChromeDriver 通过以下方式规避这些检测:

  1. 删除 WebDriver 指标:消除 navigator.webdriver 属性和其他 WebDriver 痕迹。

  2. 修补 Cdc_:修改 Chrome 驱动程序控制器变量,这些变量是 ChromeDriver 的已知签名。

  3. 使用真实的 User-Agent:将默认 User-Agent 替换为最新的字符串。

  4. 最大限度地减少配置更改:减少对 Chrome 浏览器的默认行为的更改。

显示 Undetected ChromeDriver 如何修补驱动程序的技术代码:

language Copy
Undetected ChromeDriver 源代码的简化摘录

def _patch_driver_executable():
    """
    修补 ChromeDriver 二进制文件以删除自动化的蛛丝马迹
    """
    linect = 0
    replacement = os.urandom(32).hex()
    with io.open(self.executable_path, "r+b") as fh:
        for line in iter(lambda: fh.readline(), b""):
            if b"cdc_" in line.lower():
                fh.seek(-len(line), 1)
                newline = re.sub(
                    b"cdc_.{22}", b"cdc_" + replacement.encode(), line
                )
                fh.write(newline)
                linect += 1
    return linect

为什么 Scrapeless 更有效

Scrapeless 通过以下方式采用不同的方法:

  1. 预配置环境:使用已针对模拟人类用户进行优化的浏览器。

  2. 基于云的基础架构:在云中运行浏览器,并进行正确的指纹识别。

  3. 智能代理轮换:根据目标网站自动轮换 IP。

  4. 高级指纹管理:在整个会话中保持一致的浏览器指纹。

  5. WebRTC、Canvas 和插件抑制:阻止常见的指纹识别技术。

登录 Scrapeless 以试用免费试用版。

结论

在本文中,您学习了如何使用 Undetected ChromeDriver 处理 Selenium 中的机器人检测。此库提供 ChromeDriver 的修补版本,用于在不造成阻塞的情况下进行网页抓取。

挑战在于,像 Cloudflare 这样先进的反机器人技术仍然能够检测和阻止您的脚本。像 undetected_chromedriver 这样的库是不稳定的——虽然它们今天可能有效,但明天可能无效。

对于专业的抓取需求,像 Scrapeless 这样的基于云的解决方案提供了一种更强大的替代方案。它们提供专门设计用于绕过反机器人措施的预配置远程浏览器,并具有 IP 轮换和验证码求解等附加功能。

Undetected ChromeDriver 和 Scrapeless 之间的选择取决于您的特定需求:

  • Undetected ChromeDriver:适用于小型项目,免费且开源,但需要更多维护并且可能不太可靠。
  • Scrapeless:更适合专业的抓取需求,更可靠,不断更新,但需要付费订阅。

通过了解这些反机器人绕过技术的工作原理,您可以为您的网页抓取项目选择合适的工具,并避免自动化数据收集的常见陷阱。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录