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

Advanced Data Extraction Specialist
探索 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
mkdir undetected-chromedriver-scraper
cd undetected-chromedriver-scraper
python -m venv env
激活虚拟环境:
language
# 在 Linux 或 macOS 上
source env/bin/activate
# 在 Windows 上
env\Scripts\activate
步骤 #2:安装 Undetected ChromeDriver
通过 pip 包安装 Undetected ChromeDriver:
language
pip install undetected_chromedriver
此库将自动安装 Selenium,因为它是其依赖项之一。
步骤 #3:初始设置
创建一个 scraper.py 文件并导入 undetected_chromedriver:
language
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
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
python scraper.py
Undetected ChromeDriver:高级用法
现在您已经了解了库的工作原理,您可以开始探索一些更高级的场景。
选择特定的 Chrome 版本
您可以通过设置 version_main 参数来指定库要使用的特定版本的 Chrome:
language
import undetected_chromedriver as uc
# 指定目标版本的 Chrome
driver = uc.Chrome(version_main=105)
使用 with 语法
为了避免在不再需要驱动程序时手动调用 quit() 方法,您可以使用 with 语法:
language
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
driver = uc.Chrome(headless=True)
稳定性问题
由于多种因素,结果可能会有所不同。除了持续努力了解和对抗检测算法外,不提供任何保证。如果防护方法收到更新,则今天成功绕过反机器人系统的脚本明天可能会失败。
推荐的替代方案:Scrapeless
鉴于 Undetected ChromeDriver 的局限性,Scrapeless 为网页抓取提供了一种更强大、更可靠的替代方案,而不会被阻止。
我们坚定地保护网站的隐私。本博客中的所有数据都是公开的,仅用作抓取过程演示。我们不保存任何信息和数据。
为什么 Scrapeless 更出色
Scrapeless 是一种远程浏览器服务,它解决了 Undetected ChromeDriver 方法固有的问题:
-
持续更新:与 Undetected ChromeDriver(在反机器人系统更新后可能停止工作)不同,Scrapeless 会由其团队持续更新。
-
内置 IP 轮换:Scrapeless 提供自动 IP 轮换,消除了 Undetected ChromeDriver 的 IP 阻止问题。
-
优化的配置:Scrapeless 浏览器已经过优化以避免检测,这大大简化了流程。
-
自动解决验证码:Scrapeless 可以自动解决您可能遇到的验证码。
-
兼容多种框架:可与 Playwright、Puppeteer 和其他自动化工具配合使用。
登录 Scrapeless 以试用免费试用版。
如何使用 Scrapeless 抓取网页(不会被阻止)
以下是如何使用 Playwright 使用 Scrapeless 实现类似的解决方案:
步骤 1:注册并登录 Scrapeless
步骤 2:获取 Scrapeless API 密钥

步骤 3:您可以将以下代码集成到您的项目中
language
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 使用积分。
增强的技术分析
机器人检测:工作原理
反机器人系统使用多种技术来检测自动化:
-
浏览器指纹识别:收集数十个浏览器属性(字体、画布、WebGL 等)以创建唯一的签名。
-
WebDriver 检测:查找 WebDriver API 或其构件的存在。
-
行为分析:分析鼠标移动、点击、打字速度,这些速度在人和机器人之间有所不同。
-
导航异常检测:识别可疑模式,例如请求速度过快或缺乏图像/CSS 加载。
推荐阅读:如何绕过反机器人
Undetected ChromeDriver 如何绕过检测
Undetected ChromeDriver 通过以下方式规避这些检测:
-
删除 WebDriver 指标:消除
navigator.webdriver
属性和其他 WebDriver 痕迹。 -
修补 Cdc_:修改 Chrome 驱动程序控制器变量,这些变量是 ChromeDriver 的已知签名。
-
使用真实的 User-Agent:将默认 User-Agent 替换为最新的字符串。
-
最大限度地减少配置更改:减少对 Chrome 浏览器的默认行为的更改。
显示 Undetected ChromeDriver 如何修补驱动程序的技术代码:
language
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 通过以下方式采用不同的方法:
-
预配置环境:使用已针对模拟人类用户进行优化的浏览器。
-
基于云的基础架构:在云中运行浏览器,并进行正确的指纹识别。
-
智能代理轮换:根据目标网站自动轮换 IP。
-
高级指纹管理:在整个会话中保持一致的浏览器指纹。
-
WebRTC、Canvas 和插件抑制:阻止常见的指纹识别技术。
登录 Scrapeless 以试用免费试用版。
结论
在本文中,您学习了如何使用 Undetected ChromeDriver 处理 Selenium 中的机器人检测。此库提供 ChromeDriver 的修补版本,用于在不造成阻塞的情况下进行网页抓取。
挑战在于,像 Cloudflare 这样先进的反机器人技术仍然能够检测和阻止您的脚本。像 undetected_chromedriver 这样的库是不稳定的——虽然它们今天可能有效,但明天可能无效。
对于专业的抓取需求,像 Scrapeless 这样的基于云的解决方案提供了一种更强大的替代方案。它们提供专门设计用于绕过反机器人措施的预配置远程浏览器,并具有 IP 轮换和验证码求解等附加功能。
Undetected ChromeDriver 和 Scrapeless 之间的选择取决于您的特定需求:
- Undetected ChromeDriver:适用于小型项目,免费且开源,但需要更多维护并且可能不太可靠。
- Scrapeless:更适合专业的抓取需求,更可靠,不断更新,但需要付费订阅。
通过了解这些反机器人绕过技术的工作原理,您可以为您的网页抓取项目选择合适的工具,并避免自动化数据收集的常见陷阱。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。