🥳Tham gia Cộng đồng Scrapelessnhận thử nghiệm miễn phí của bạn để truy cập Bộ công cụ Web Scraping mạnh mẽ của chúng tôi!
Quay lại blog

Cách sử dụng ChromeDriver không bị phát hiện để thu thập dữ liệu web

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

17-Mar-2025

Khám phá cách Undetected ChromeDriver giúp vượt qua các hệ thống chống bot để thu thập dữ liệu web, cùng với hướng dẫn từng bước, các phương pháp nâng cao và các hạn chế chính. Thêm vào đó, tìm hiểu về Scrapeless - một giải pháp thay thế mạnh mẽ hơn cho nhu cầu thu thập dữ liệu chuyên nghiệp.

Trong hướng dẫn này, bạn sẽ học được:

  • Undetected ChromeDriver là gì và nó có thể hữu ích như thế nào
  • Làm thế nào nó giảm thiểu việc phát hiện bot
  • Cách sử dụng nó với Python để thu thập dữ liệu web
  • Sử dụng và phương pháp nâng cao
  • Các hạn chế và nhược điểm chính của nó
  • Giải pháp thay thế được đề xuất: Scrapeless
  • Phân tích kỹ thuật các cơ chế phát hiện chống bot

Hãy bắt đầu!

Undetected ChromeDriver là gì?


Undetected ChromeDriver là một thư viện Python cung cấp phiên bản tối ưu hóa của ChromeDriver của Selenium. Điều này đã được vá để hạn chế việc phát hiện bởi các dịch vụ chống bot như:

  • Imperva
  • DataDome
  • Distil Networks
  • và nhiều hơn nữa ...

Nó cũng có thể giúp vượt qua một số biện pháp bảo vệ của Cloudflare, mặc dù điều đó có thể khó khăn hơn.

Nếu bạn đã từng sử dụng các công cụ tự động hóa trình duyệt như Selenium, bạn sẽ biết rằng chúng cho phép bạn điều khiển trình duyệt bằng lập trình. Để làm cho điều đó khả thi, chúng cấu hình trình duyệt khác với thiết lập của người dùng thông thường.

Các hệ thống chống bot tìm kiếm những điểm khác biệt đó, hoặc "lỗ hổng", để xác định các bot trình duyệt tự động. Undetected ChromeDriver vá trình điều khiển Chrome để giảm thiểu những dấu hiệu này, giảm việc phát hiện bot. Điều này làm cho nó lý tưởng để thu thập dữ liệu web từ các trang web được bảo vệ bởi các biện pháp chống thu thập dữ liệu!

Undetected ChromeDriver hoạt động như thế nào?


Undetected ChromeDriver giảm thiểu việc phát hiện từ Cloudflare, Imperva, DataDome và các giải pháp tương tự bằng cách sử dụng các kỹ thuật sau:

  • Đổi tên các biến Selenium để bắt chước các biến được sử dụng bởi các trình duyệt thực
  • Sử dụng chuỗi User-Agent hợp lệ, thực tế để tránh bị phát hiện
  • Cho phép người dùng mô phỏng tương tác tự nhiên của con người
  • Quản lý cookie và phiên một cách chính xác khi điều hướng các trang web
  • Cho phép sử dụng proxy để vượt qua việc chặn IP và ngăn chặn giới hạn tốc độ

Những phương pháp này giúp trình duyệt được điều khiển bởi thư viện vượt qua nhiều biện pháp phòng thủ chống thu thập dữ liệu một cách hiệu quả.

Sử dụng Undetected ChromeDriver để thu thập dữ liệu web: Hướng dẫn từng bước


Bước #1: Điều kiện tiên quyết và thiết lập dự án

Undetected ChromeDriver có các điều kiện tiên quyết sau:

  • Phiên bản Chrome mới nhất
  • Python 3.6 trở lên: Nếu Python 3.6 trở lên chưa được cài đặt trên máy của bạn, hãy tải xuống từ trang web chính thức và làm theo hướng dẫn cài đặt.

Lưu ý: Thư viện tự động tải xuống và vá tệp nhị phân trình điều khiển cho bạn, vì vậy bạn không cần phải tải xuống ChromeDriver thủ công.

Tạo một thư mục cho dự án của bạn:

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

Kích hoạt môi trường ảo:

language Copy
# Trên Linux hoặc macOS
source env/bin/activate

# Trên Windows
env\Scripts\activate

Bước #2: Cài đặt Undetected ChromeDriver

Cài đặt Undetected ChromeDriver thông qua gói pip:

language Copy
pip install undetected_chromedriver

Thư viện này sẽ tự động cài đặt Selenium, vì nó là một trong những phụ thuộc của nó.

Bước #3: Thiết lập ban đầu

Tạo tệp scraper.py và nhập undetected_chromedriver:

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

# Khởi tạo một phiên bản Chrome
driver = uc.Chrome()

# Kết nối đến trang đích
driver.get("https://scrapeless.com")

# Logic thu thập dữ liệu...

# Đóng trình duyệt
driver.quit()

Bước #4: Thực hiện logic thu thập dữ liệu

Bây giờ chúng ta hãy thêm logic để trích xuất dữ liệu từ trang Apple:

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

# Tạo một phiên bản trình điều khiển web Chrome
driver = uc.Chrome()

# Kết nối đến trang web Apple
driver.get("https://www.apple.com/fr/")

# Cho trang web một chút thời gian để tải đầy đủ
time.sleep(3)

# Từ điển để lưu trữ thông tin sản phẩm
apple_products = {}

try:
    # Tìm các phần sản phẩm (sử dụng các lớp từ HTML được cung cấp)
    product_sections = driver.find_elements(By.CSS_SELECTOR, ".homepage-section.collection-module .unit-wrapper")
    
    for i, section in enumerate(product_sections):
        try:
            # Trích xuất tên sản phẩm (tiêu đề)
            headline = section.find_element(By.CSS_SELECTOR, ".headline, .logo-image").get_attribute("textContent").strip()
            
            # Trích xuất mô tả (phụ đề)
            subhead_element = section.find_element(By.CSS_SELECTOR, ".subhead")
            subhead = subhead_element.text
            
            # Lấy liên kết nếu có
            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"Lỗi khi xử lý phần {i+1}: {e}")
    
    # Xuất dữ liệu đã thu thập vào 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"Đã thu thập thành công {len(apple_products)} sản phẩm Apple")
    
except Exception as e:
    print(f"Lỗi trong quá trình thu thập dữ liệu: {e}")

finally:
    # Đóng trình duyệt và giải phóng tài nguyên của nó
    driver.quit()

Chạy nó với:

language Copy
python scraper.py

Undetected ChromeDriver: Sử dụng nâng cao

Bây giờ bạn đã biết thư viện hoạt động như thế nào, bạn đã sẵn sàng khám phá một số trường hợp phức tạp hơn.

Chọn một phiên bản Chrome cụ thể

Bạn có thể chỉ định một phiên bản Chrome cụ thể cho thư viện sử dụng bằng cách đặt đối số version_main:

language Copy
import undetected_chromedriver as uc

# Chỉ định phiên bản Chrome mục tiêu
driver = uc.Chrome(version_main=105)

Với cú pháp with

Để tránh gọi thủ công phương thức quit() khi bạn không còn cần trình điều khiển, bạn có thể sử dụng cú pháp with:

language Copy
import undetected_chromedriver as uc

with uc.Chrome() as driver:
    driver.get("https://example.com")
    # Phần còn lại của mã của bạn...

Hạn chế của Undetected ChromeDriver

Mặc dù undetected_chromedriver là một thư viện Python mạnh mẽ, nhưng nó cũng có một số hạn chế đã biết:

Chặn IP

Thư viện không ẩn địa chỉ IP của bạn. Nếu bạn đang chạy một tập lệnh từ một trung tâm dữ liệu, khả năng phát hiện vẫn sẽ xảy ra là rất cao. Tương tự như vậy, nếu IP tại nhà của bạn có danh tiếng xấu, bạn cũng có thể bị chặn.

Để ẩn IP của bạn, bạn cần tích hợp trình duyệt được điều khiển với máy chủ proxy, như đã được trình bày trước đó.

Không hỗ trợ điều hướng GUI

Do hoạt động bên trong của mô-đun, bạn phải duyệt bằng lập trình bằng phương pháp get(). Tránh sử dụng GUI trình duyệt để điều hướng thủ công — tương tác với trang bằng bàn phím hoặc chuột làm tăng nguy cơ bị phát hiện.

Hỗ trợ hạn chế cho chế độ Headless

Chính thức, chế độ headless không được hỗ trợ đầy đủ bởi thư viện undetected_chromedriver. Tuy nhiên, bạn có thể thử nghiệm với nó bằng cách sử dụng:

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

Vấn đề về độ ổn định

Kết quả có thể khác nhau do nhiều yếu tố. Không có gì được đảm bảo, ngoài những nỗ lực liên tục để hiểu và chống lại các thuật toán phát hiện. Một tập lệnh vượt qua các hệ thống chống bot thành công ngày hôm nay có thể thất bại vào ngày mai nếu các phương pháp bảo vệ nhận được cập nhật.

Giải pháp thay thế được đề xuất: Scrapeless


Với những hạn chế của Undetected ChromeDriver, Scrapeless cung cấp một giải pháp thay thế mạnh mẽ và đáng tin cậy hơn để thu thập dữ liệu web mà không bị chặn.

Chúng tôi bảo vệ mạnh mẽ quyền riêng tư của trang web. Tất cả dữ liệu trong blog này đều công khai và chỉ được sử dụng như một minh chứng cho quá trình thu thập dữ liệu. Chúng tôi không lưu bất kỳ thông tin và dữ liệu nào.

Tại sao Scrapeless tốt hơn

Scrapeless là một dịch vụ trình duyệt từ xa giải quyết các vấn đề vốn có với phương pháp Undetected ChromeDriver:

  1. Cập nhật liên tục: Không giống như Undetected ChromeDriver có thể ngừng hoạt động sau khi hệ thống chống bot cập nhật, Scrapeless được cập nhật liên tục bởi nhóm của nó.

  2. Xoay IP tích hợp: Scrapeless cung cấp khả năng xoay IP tự động, loại bỏ vấn đề chặn IP của Undetected ChromeDriver.

  3. Cấu hình tối ưu: Trình duyệt Scrapeless đã được tối ưu hóa để tránh bị phát hiện, điều này đơn giản hóa đáng kể quy trình.

  4. Giải quyết CAPTCHA tự động: Scrapeless có thể tự động giải quyết các CAPTCHA mà bạn có thể gặp phải.

  5. Tương thích với nhiều khung: Hoạt động với Playwright, Puppeteer và các công cụ tự động hóa khác.

Đăng nhập vào Scrapeless để dùng thử miễn phí.

Đọc thêm: Cách vượt qua Cloudflare với Puppeteer

Cách sử dụng Scrapeless để thu thập dữ liệu web (mà không bị chặn)

Đây là cách thực hiện một giải pháp tương tự với Scrapeless bằng Playwright:

Bước 1: Đăng ký và đăng nhập vào Scrapeless

Bước 2: Lấy API KEY của Scrapeless

Lấy API KEY của Scrapeless

Bước 3: Bạn có thể tích hợp mã sau vào dự án của mình

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

// URL kết nối Scrapeless với token của bạn
const connectionURL = 'wss://browser.scrapeless.com/browser?token=YOUR_TOKEN_HERE&session_ttl=180&proxy_country=ANY';

(async () => {
  // Kết nối đến trình duyệt Scrapeless từ xa
  const browser = await chromium.connectOverCDP(connectionURL);
  
  try {
    // Tạo một trang mới
    const page = await browser.newPage();
    
    // Điều hướng đến trang web Apple
    console.log('Điều hướng đến trang web Apple...');
    await page.goto('https://www.apple.com/fr/', {
      waitUntil: 'domcontentloaded',
      timeout: 60000
    });
    
    console.log('Trang đã tải thành công');
    
    // Chờ các phần sản phẩm khả dụng
    await page.waitForSelector('.homepage-section.collection-module', { timeout: 10000 });
    
    // Lấy sản phẩm nổi bật từ trang chủ
    const products = await page.evaluate(() => {
      const results = [];
      
      // Lấy tất cả các phần sản phẩm
      const productSections = document.querySelectorAll('.homepage-section.collection-module .unit-wrapper');
      
      productSections.forEach((section, index) => {
        try {
          // Lấy tên sản phẩm - có thể ở trong .headline hoặc .logo-image
          const headlineEl = section.querySelector('.headline') || section.querySelector('.logo-image');
          const headline = headlineEl ? headlineEl.textContent.trim() : 'Sản phẩm không xác định';
          
          // Lấy mô tả sản phẩm
          const subheadEl = section.querySelector('.subhead');
          const subhead = subheadEl ? subheadEl.textContent.trim() : '';
          
          // Lấy liên kết sản phẩm
          const linkEl = section.querySelector('.unit-link');
          const link = linkEl ? linkEl.getAttribute('href') : '';
          
          results.push({
            name: headline,
            description: subhead,
            link: link
          });
        } catch (err) {
          console.error(`Lỗi khi xử lý phần ${index}: ${err.message}`);
        }
      });
      
      return results;
    });
    
    // Hiển thị kết quả
    console.log('Tìm thấy sản phẩm Apple:');
    console.log(JSON.stringify(products, null, 2));
    console.log(`Tổng số sản phẩm tìm thấy: ${products.length}`);
    
  } catch (error) {
    console.error('Đã xảy ra lỗi:', error);
  } finally {
    // Đóng trình duyệt
    await browser.close();
    console.log('Trình duyệt đã đóng');
  }
})();

Bạn cũng có thể tham gia Discord của Scrapeless để tham gia chương trình hỗ trợ nhà phát triển và nhận tối đa 500k tín dụng sử dụng API SERP miễn phí.

Phân tích kỹ thuật nâng cao

Phát hiện Bot: Cách thức hoạt động

Các hệ thống chống bot sử dụng một số kỹ thuật để phát hiện tự động hóa:

  1. Dấu vân tay trình duyệt: Thu thập hàng chục thuộc tính trình duyệt (phông chữ, canvas, WebGL, v.v.) để tạo ra một chữ ký duy nhất.

  2. Phát hiện WebDriver: Tìm kiếm sự hiện diện của API WebDriver hoặc các dấu vết của nó.

  3. Phân tích hành vi: Phân tích chuyển động chuột, nhấp chuột, tốc độ đánh máy khác nhau giữa người và bot.

  4. Phát hiện bất thường điều hướng: Xác định các mẫu đáng ngờ như yêu cầu quá nhanh hoặc thiếu tải hình ảnh/CSS.

Đọc thêm: Cách vượt qua Anti Bot

Cách Undetected ChromeDriver vượt qua việc phát hiện

Undetected ChromeDriver khắc phục những phát hiện này bằng cách:

  1. Loại bỏ các chỉ báo WebDriver: Loại bỏ thuộc tính navigator.webdriver và các dấu vết WebDriver khác.

  2. Vá Cdc_: Sửa đổi các biến Chrome Driver Controller là các chữ ký đã biết của ChromeDriver.

  3. Sử dụng User-Agent thực tế: Thay thế User-Agent mặc định bằng các chuỗi cập nhật.

  4. Giảm thiểu thay đổi cấu hình: Giảm thiểu thay đổi đối với hành vi mặc định của trình duyệt Chrome.

Mã kỹ thuật cho thấy cách Undetected ChromeDriver vá trình điều khiển:

language Copy
Trích xuất đơn giản từ mã nguồn Undetected ChromeDriver

def _patch_driver_executable():
    """
    Vá tệp nhị phân ChromeDriver để loại bỏ các dấu hiệu tự động hóa
    """
    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

Tại sao Scrapeless hiệu quả hơn

Scrapeless sử dụng một cách tiếp cận khác bằng cách:

  1. Môi trường được cấu hình sẵn: Sử dụng các trình duyệt đã được tối ưu hóa để bắt chước người dùng.

  2. Cơ sở hạ tầng dựa trên đám mây: Chạy trình duyệt trên đám mây với dấu vân tay phù hợp.

  3. Xoay proxy thông minh: Tự động xoay IP dựa trên trang web mục tiêu.

  4. Quản lý dấu vân tay nâng cao: Duy trì dấu vân tay trình duyệt nhất quán trong suốt phiên.

  5. Ức chế WebRTC, Canvas và Plugin: Chặn các kỹ thuật dấu vân tay phổ biến.

Đăng nhập vào Scrapeless để dùng thử miễn phí.

Kết luận

Trong bài viết này, bạn đã tìm hiểu cách xử lý việc phát hiện bot trong Selenium bằng Undetected ChromeDriver. Thư viện này cung cấp một phiên bản đã được vá của ChromeDriver để thu thập dữ liệu web mà không bị chặn.

Thách thức là các công nghệ chống bot tiên tiến như Cloudflare vẫn sẽ có thể phát hiện và chặn các tập lệnh của bạn. Các thư viện như undetected_chromedriver không ổn định — mặc dù chúng có thể hoạt động ngày hôm nay, nhưng chúng có thể không hoạt động vào ngày mai.

Đối với nhu cầu thu thập dữ liệu chuyên nghiệp, các giải pháp dựa trên đám mây như Scrapeless cung cấp một giải pháp thay thế mạnh mẽ hơn. Chúng cung cấp các trình duyệt từ xa được cấu hình sẵn, được thiết kế đặc biệt để bỏ qua các biện pháp chống bot, với các tính năng bổ sung như xoay IP và giải quyết CAPTCHA.

Việc lựa chọn giữa Undetected ChromeDriver và Scrapeless phụ thuộc vào nhu cầu cụ thể của bạn:

  • Undetected ChromeDriver: Tốt cho các dự án nhỏ hơn, miễn phí và mã nguồn mở, nhưng đòi hỏi nhiều bảo trì hơn và có thể kém đáng tin cậy hơn.
  • Scrapeless: Tốt hơn cho nhu cầu thu thập dữ liệu chuyên nghiệp, đáng tin cậy hơn, được cập nhật liên tục, nhưng đi kèm với chi phí đăng ký.

Bằng cách hiểu cách các công nghệ bỏ qua chống bot này hoạt động, bạn có thể chọn công cụ phù hợp cho các dự án thu thập dữ liệu web của mình và tránh các cạm bẫy phổ biến của việc thu thập dữ liệu tự động.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục