Các trang web hiện đại đã học cách nhận diện các trình duyệt tự động (Selenium, Puppeteer, Playwright) và chặn các yêu cầu của chúng. Trình duyệt headless để lại hàng chục dấu vết số, mà các hệ thống chống bot có thể phát hiện ra tự động hóa chỉ trong vài mili giây. Trong hướng dẫn này, chúng ta sẽ xem xét tất cả các phương pháp ngụy trang trình duyệt headless với các ví dụ mã bằng Python và JavaScript, để các trình thu thập dữ liệu của bạn hoạt động ổn định mà không bị chặn.
Bài viết này dành cho các nhà phát triển đang làm việc với việc thu thập dữ liệu web, tự động hóa kiểm thử hoặc thu thập dữ liệu từ các trang web bảo mật. Chúng ta sẽ xem xét các chi tiết kỹ thuật về việc phát hiện và các giải pháp thực tiễn để vượt qua bảo vệ.
Cách các trang web phát hiện trình duyệt headless: các phương pháp chính
Các hệ thống chống bot sử dụng kiểm tra trình duyệt đa tầng, phân tích hàng trăm thông số. Trình duyệt headless khác với trình duyệt thông thường ở nhiều dấu hiệu mà không thể ẩn đi chỉ bằng cách thay thế User-Agent. Hiểu các phương pháp phát hiện là bước đầu tiên để ngụy trang hiệu quả.
Các dấu hiệu JavaScript của tự động hóa
Phương pháp phổ biến nhất là kiểm tra các thuộc tính JavaScript chỉ xuất hiện trong các trình duyệt tự động:
navigator.webdriver— trả vềtruetrong Selenium và Puppeteerwindow.chrome— không có trong headless Chromenavigator.plugins.length— bằng 0 trong chế độ headlessnavigator.languages— thường là mảng rỗng hoặc chỉ chứa "en-US"navigator.permissions— API hoạt động khác nhau trong chế độ headless
Phân tích Giao thức Chrome DevTools
Puppeteer và Playwright điều khiển trình duyệt thông qua Giao thức Chrome DevTools (CDP). Sự hiện diện của kết nối CDP có thể được phát hiện thông qua các kiểm tra JavaScript đặc biệt, phân tích các đối tượng window.cdc_ hoặc kiểm tra các bất thường trong hành vi của các sự kiện chuột và bàn phím.
Canvas và WebGL Fingerprinting
Các trình duyệt headless tạo ra các dấu vân tay Canvas và WebGL giống nhau, vì chúng sử dụng kết xuất phần mềm thay vì phần cứng. Các hệ thống chống bot tạo ra một phần tử Canvas vô hình, vẽ văn bản hoặc hình dạng lên đó và tính toán băm hình ảnh. Nếu hàng ngàn người dùng có băm giống nhau — đó là dấu hiệu của bot.
Phân tích hành vi
Các hệ thống hiện đại (DataDome, PerimeterX, Cloudflare Bot Management) phân tích chuyển động chuột, tốc độ cuộn, mẫu nhấp chuột. Các trình duyệt headless thực hiện các hành động ngay lập tức và không có độ trễ tự nhiên, điều này tiết lộ tự động hóa. Các sự kiện cũng được phân tích: trong trình duyệt thông thường, trước khi nhấp luôn có sự kiện mousemove, trong khi bot thường nhấp mà không có chuyển động chuột trước đó.
Quan trọng: Các hệ thống chống bot hiện đại sử dụng học máy để phân tích hàng trăm thông số đồng thời. Ngụy trang chỉ một thông số (ví dụ: User-Agent) sẽ không bảo vệ bạn khỏi bị chặn — cần một cách tiếp cận toàn diện.
Xóa navigator.webdriver và các dấu hiệu JavaScript khác
Thuộc tính navigator.webdriver là cách đơn giản nhất để phát hiện Selenium và các công cụ WebDriver khác. Trong trình duyệt thông thường, thuộc tính này trả về undefined, trong khi trong trình duyệt tự động — true. Bạn có thể xóa nó bằng cách thực hiện mã JavaScript trước khi tải trang.
Selenium (Python): xóa webdriver qua CDP
Đối với Selenium, cần sử dụng Giao thức Chrome DevTools để thực hiện JavaScript trước khi tải bất kỳ trang nào:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
# Xóa navigator.webdriver qua CDP
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
'''
})
driver.get('https://example.com')
Tùy chọn --disable-blink-features=AutomationControlled tắt cờ mà Chrome thêm vào trong chế độ tự động hóa. Đây là biện pháp bảo vệ cơ bản cần kết hợp với các phương pháp khác.
Puppeteer (Node.js): ngụy trang qua Page.evaluateOnNewDocument
Trong Puppeteer, phương pháp page.evaluateOnNewDocument() được sử dụng để thực hiện mã trước khi tải trang:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled']
});
const page = await browser.newPage();
// Xóa webdriver và các dấu hiệu khác
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// Thêm đối tượng chrome
window.chrome = {
runtime: {}
};
// Mô phỏng các plugin
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
});
await page.goto('https://example.com');
})();
Playwright: tùy chọn ngụy trang tích hợp
Playwright có khả năng ngụy trang tiên tiến hơn ngay từ đầu, nhưng vẫn cần cấu hình bổ sung:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled']
});
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
});
const page = await context.newPage();
await page.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
});
await page.goto('https://example.com');
})();
Ngụy trang Giao thức Chrome DevTools
Puppeteer và Playwright để lại dấu vết kết nối CDP, có thể phát hiện thông qua phân tích các đối tượng window. Các hệ thống chống bot tìm kiếm các biến có tiền tố cdc_, $cdc_ hoặc __webdriver_, được tạo ra bởi Chrome khi kết nối qua Giao thức DevTools.
Xóa các biến CDP
Đoạn mã sau xóa tất cả các biến liên quan đến tự động hóa từ đối tượng window:
await page.evaluateOnNewDocument(() => {
// Xóa tất cả các biến có tiền tố cdc_
const cdcProps = Object.keys(window).filter(prop =>
prop.includes('cdc_') ||
prop.includes('$cdc_') ||
prop.includes('__webdriver_')
);
cdcProps.forEach(prop => {
delete window[prop];
});
// Định nghĩa lại document.__proto__ để ẩn CDP
const originalQuery = document.querySelector;
document.querySelector = function(selector) {
if (selector.includes('cdc_')) return null;
return originalQuery.call(this, selector);
};
});
Sử dụng các phiên bản Chromium đã được vá
Có các bản dựng Chromium đã được sửa đổi không để lại dấu vết CDP. Ví dụ, thư viện puppeteer-extra với plugin puppeteer-extra-plugin-stealth tự động áp dụng hàng chục bản vá để ngụy trang CDP.
Cấu hình User-Agent và tiêu đề HTTP
Các trình duyệt headless sử dụng các chuỗi User-Agent lỗi thời hoặc không thực tế. Ví dụ, Puppeteer mặc định thêm từ "HeadlessChrome" vào User-Agent. Ngoài ra, cần cấu hình các tiêu đề bổ sung có mặt trong các yêu cầu của trình duyệt thông thường.
User-Agent hiện tại để ngụy trang
Sử dụng User-Agent mới nhất của các trình duyệt thực tế. Dưới đây là các ví dụ cho năm 2024:
# Chrome 120 trên Windows 10
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
# Chrome 120 trên macOS
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
# Firefox 121 trên Windows
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Cấu hình tiêu đề trong Selenium
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
# Tiêu đề bổ sung qua CDP
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
"platform": 'Win32',
"acceptLanguage": 'en-US,en;q=0.9'
})
Cấu hình tiêu đề trong Puppeteer
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
await page.setExtraHTTPHeaders({
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document'
});
Các tiêu đề Sec-Fetch-* cực kỳ quan trọng — chúng xuất hiện trong Chrome 76+ và việc thiếu chúng tiết lộ các phiên bản trình duyệt cũ hoặc bot.
Mô phỏng Canvas và WebGL Fingerprint
Canvas và WebGL fingerprinting là một phương pháp phát hiện mạnh mẽ, vì các trình duyệt headless tạo ra các dấu vân tay giống nhau. Các hệ thống chống bot tạo ra một Canvas vô hình, vẽ văn bản lên đó và tính toán băm các pixel. Nếu hàng ngàn yêu cầu có băm giống nhau — đó là bot.
Thêm tiếng ồn vào Canvas
Đoạn mã sau thêm tiếng ồn ngẫu nhiên vào dấu vân tay Canvas, làm cho mỗi yêu cầu trở nên độc nhất:
await page.evaluateOnNewDocument(() => {
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
const originalToBlob = HTMLCanvasElement.prototype.toBlob;
const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
// Hàm thêm tiếng ồn
const addNoise = (canvas, context) => {
const imageData = originalGetImageData.call(context, 0, 0, canvas.width, canvas.height);
for (let i = 0; i < imageData.data.length; i += 4) {
imageData.data[i] += Math.floor(Math.random() * 10) - 5;
imageData.data[i + 1] += Math.floor(Math.random() * 10) - 5;
imageData.data[i + 2] += Math.floor(Math.random() * 10) - 5;
}
context.putImageData(imageData, 0, 0);
};
HTMLCanvasElement.prototype.toDataURL = function() {
addNoise(this, this.getContext('2d'));
return originalToDataURL.apply(this, arguments);
};
});
Mô phỏng các tham số WebGL
WebGL tiết lộ thông tin về card đồ họa và trình điều khiển. Trong chế độ headless, các tham số này tiết lộ kết xuất phần mềm:
await page.evaluateOnNewDocument(() => {
const getParameter = WebGLRenderingContext.prototype.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
// Mô phỏng card đồ họa thực tế
if (parameter === 37445) {
return 'Intel Inc.';
}
if (parameter === 37446) {
return 'Intel Iris OpenGL Engine';
}
return getParameter.call(this, parameter);
};
});
Tham số 37445 là UNMASKED_VENDOR_WEBGL, và 37446 là UNMASKED_RENDERER_WEBGL. Trong chế độ headless, chúng trả về "Google SwiftShader", điều này tiết lộ tự động hóa.
Selenium Stealth: giải pháp sẵn có cho Python
Thư viện selenium-stealth tự động áp dụng hàng chục bản vá để ngụy trang Selenium. Đây là giải pháp đơn giản nhất cho các nhà phát triển Python, không yêu cầu cấu hình thủ công cho từng tham số.
Cài đặt và cấu hình cơ bản
pip install selenium-stealth
from selenium import webdriver
from selenium_stealth import stealth
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
# Áp dụng các bản vá stealth
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
driver.get("https://bot.sannysoft.com")
driver.save_screenshot("test.png")
Thư viện tự động xóa navigator.webdriver, thêm window.chrome, mô phỏng các plugin, ngụy trang WebGL và áp dụng hơn 20+ bản vá khác. Điều này bao phủ 80% các trường hợp phát hiện.
Cấu hình nâng cao với proxy
Để ngụy trang hoàn toàn, kết hợp selenium-stealth với proxy dân cư — chúng cung cấp địa chỉ IP thực của người dùng gia đình, điều này rất quan trọng để vượt qua các hệ thống chống bot tiên tiến:
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "ip:port"
proxy.ssl_proxy = "ip:port"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
driver = webdriver.Chrome(desired_capabilities=capabilities, options=options)
stealth(driver, languages=["en-US", "en"], vendor="Google Inc.", platform="Win32")
Puppeteer Extra Stealth Plugin cho Node.js
Đối với Puppeteer, có một plugin puppeteer-extra-plugin-stealth, là giải pháp tiên tiến nhất cho việc ngụy trang các trình duyệt headless trong hệ sinh thái JavaScript. Nó chứa 23 mô-đun độc lập, mỗi mô-đun ngụy trang một khía cạnh cụ thể của tự động hóa.
Cài đặt và sử dụng cơ bản
npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.goto('https://bot.sannysoft.com');
await page.screenshot({ path: 'test.png' });
await browser.close();
})();
Những gì Stealth Plugin ngụy trang
Plugin tự động áp dụng các bản vá sau:
- Xóa
navigator.webdriver - Thêm đối tượng
window.chrome - Mô phỏng API
navigator.permissions - Ngụy trang
navigator.pluginsvànavigator.mimeTypes - Mô phỏng Canvas và WebGL fingerprint
- Ngụy trang User-Agent và ngôn ngữ
- Sửa các bất thường trong iframe contentWindow
- Mô phỏng Battery API, Media Devices, WebRTC
Cấu hình với proxy và các tham số bổ sung
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const AdblockerPlugin = require('puppeteer-extra-plugin-adblocker');
puppeteer.use(StealthPlugin());
puppeteer.use(AdblockerPlugin({ blockTrackers: true }));
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: [
'--proxy-server=http://your-proxy:port',
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process'
]
});
const page = await browser.newPage();
// Xác thực proxy
await page.authenticate({
username: 'your-username',
password: 'your-password'
});
await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
})();
Playwright: cấu hình chống phát hiện
Playwright có kiến trúc tinh vi hơn so với Puppeteer và để lại ít dấu vết tự động hóa hơn. Tuy nhiên, để vượt qua các hệ thống chống bot tiên tiến, cần cấu hình bổ sung. Đối với Playwright, có một phiên bản plugin stealth — playwright-extra.
Cài đặt playwright-extra
npm install playwright-extra playwright-extra-plugin-stealth playwright
const { chromium } = require('playwright-extra');
const stealth = require('playwright-extra-plugin-stealth');
chromium.use(stealth());
(async () => {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
viewport: { width: 1920, height: 1080 },
locale: 'en-US',
timezoneId: 'America/New_York'
});
const page = await context.newPage();
await page.goto('https://bot.sannysoft.com');
await page.screenshot({ path: 'test.png' });
await browser.close();
})();
Cấu hình ngữ cảnh trình duyệt để ngụy trang tối đa
Playwright cho phép tạo ra các ngữ cảnh trình duyệt cách ly với các cấu hình riêng biệt. Điều này hữu ích cho việc sử dụng nhiều tài khoản hoặc thu thập dữ liệu song song:
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
viewport: { width: 1440, height: 900 },
locale: 'en-US',
timezoneId: 'America/Los_Angeles',
permissions: ['geolocation'],
geolocation: { latitude: 37.7749, longitude: -122.4194 },
colorScheme: 'light',
deviceScaleFactor: 2,
isMobile: false,
hasTouch: false,
// Cấu hình proxy cho ngữ cảnh
proxy: {
server: 'http://your-proxy:port',
username: 'user',
password: 'pass'
}
});
Các tham số geolocation và timezoneId phải tương ứng với địa chỉ IP của proxy, nếu không các hệ thống chống bot sẽ phát hiện sự không phù hợp (ví dụ, IP từ California nhưng timezone là New York).
Xoay vòng proxy để giảm rủi ro bị chặn
Ngay cả một trình duyệt headless được ngụy trang hoàn hảo cũng có thể bị chặn nếu nó sử dụng một địa chỉ IP cho hàng trăm yêu cầu. Các hệ thống chống bot hiện đại phân tích tần suất yêu cầu từ một IP và chặn các hoạt động nghi ngờ. Xoay vòng proxy là một yếu tố bảo vệ cần thiết khi thu thập dữ liệu.
Các loại proxy cho việc thu thập dữ liệu: so sánh
| Loại proxy | Tốc độ | Trust Score | Tốt hơn cho |
|---|---|---|---|
| Datacenter | Rất cao (50-200 ms) | Thấp | Các trang web đơn giản, thu thập dữ liệu hàng loạt |
| Dân cư | Trung bình (300-1000 ms) | Cao | Các trang web bảo mật, mạng xã hội |
| Di động | Thấp (500-2000 ms) | Rất cao | Các ứng dụng di động, Instagram, TikTok |
Để thu thập dữ liệu từ các trang web bảo mật (chợ điện tử, mạng xã hội, nền tảng quảng cáo), khuyến nghị sử dụng proxy dân cư, vì chúng có địa chỉ IP thực của người dùng gia đình và không bị đưa vào danh sách đen của các hệ thống chống bot.
Triển khai xoay vòng proxy trong Puppeteer
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const proxyList = [
'http://user1:pass1@proxy1:port',
'http://user2:pass2@proxy2:port',
'http://user3:pass3@proxy3:port'
];
async function scrapeWithRotation(urls) {
for (let i = 0; i < urls.length; i++) {
const proxy = proxyList[i % proxyList.length];
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${proxy}`]
});
const page = await browser.newPage();
try {
await page.goto(urls[i], { waitUntil: 'networkidle2' });
const data = await page.evaluate(() => document.body.innerText);
console.log(data);
} catch (error) {
console.error(`Lỗi trên ${urls[i]}:`, error);
} finally {
await browser.close();
}
// Đợi giữa các yêu cầu
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
scrapeWithRotation([
'https://example1.com',
'https://example2.com',
'https://example3.com'
]);
Xoay vòng qua proxy dựa trên phiên
Một số nhà cung cấp proxy (bao gồm ProxyCove) cung cấp xoay vòng dựa trên phiên — mỗi yêu cầu tự động nhận được một IP mới mà không cần khởi động lại trình duyệt. Điều này được thực hiện thông qua định dạng URL proxy đặc biệt:
// Định dạng: username-session-RANDOM:password@gateway:port
const generateSessionProxy = () => {
const sessionId = Math.random().toString(36).substring(7);
return `http://username-session-${sessionId}:password@gateway.proxycove.com:12321`;
};
const browser = await puppeteer.launch({
args: [`--proxy-server=${generateSessionProxy()}`]
});
Cách kiểm tra chất lượng ngụy trang: công cụ kiểm tra
Sau khi cấu hình ngụy trang, cần kiểm tra xem trình duyệt headless của bạn mô phỏng người dùng thông thường tốt đến mức nào. Có một số trang web chuyên dụng phân tích hàng chục thông số của trình duyệt và cho thấy những dấu vết tự động hóa nào còn lại.
Các công cụ kiểm tra chính
- bot.sannysoft.com — kiểm tra hơn 15 thông số phát hiện, bao gồm webdriver, đối tượng Chrome, plugin, Canvas
- arh.antoinevastel.com/bots/areyouheadless — chuyên về phát hiện headless Chrome
- pixelscan.net — phân tích fingerprint nâng cao với hình ảnh hóa tất cả các thông số
- abrahamjuliot.github.io/creepjs — phân tích chi tiết nhất (hơn 200 thông số), cho thấy mức độ tin cậy của trình duyệt
- iphey.com — kiểm tra địa chỉ IP xem có thuộc về proxy và VPN hay không
Tự động hóa kiểm tra
Tạo một đoạn mã để kiểm tra tự động ngụy trang sau mỗi thay đổi cấu hình:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
async function testStealth() {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
// Kiểm tra 1: Sannysoft
await page.goto('https://bot.sannysoft.com');
await page.screenshot({ path: 'test-sannysoft.png', fullPage: true });
// Kiểm tra 2: Bạn có phải là headless không
await page.goto('https://arh.antoinevastel.com/bots/areyouheadless');
const headlessDetected = await page.evaluate(() => {
return document.body.innerText.includes('You are not Chrome headless');
});
console.log('Phát hiện headless:', !headlessDetected);
// Kiểm tra 3: Thuộc tính Webdriver
const webdriverPresent = await page.evaluate(() => navigator.webdriver);
console.log('navigator.webdriver:', webdriverPresent);
// Kiểm tra 4: Đối tượng Chrome
const chromePresent = await page.evaluate(() => !!window.chrome);
console.log('window.chrome hiện diện:', chromePresent);
await browser.close();
}
testStealth();
Danh sách kiểm tra ngụy trang thành công
Trình duyệt headless của bạn được ngụy trang đúng cách nếu:
navigator.webdrivertrả vềundefinedwindow.chrometồn tại và chứa đối tượngruntimenavigator.plugins.lengthlớn hơn 0- Nhà cung cấp WebGL và trình kết xuất hiển thị card đồ họa thực tế, không phải SwiftShader
- Dấu vân tay Canvas là duy nhất cho mỗi phiên
- User-Agent tương ứng với phiên bản Chrome/Firefox hiện tại
- Địa chỉ IP của proxy không nằm trong danh sách đen (kiểm tra qua iphey.com)
- Timezone và locale tương ứng với vị trí địa lý của địa chỉ IP
Kết luận
Ngụy trang trình duyệt headless là một nhiệm vụ phức tạp, yêu cầu chú ý đến hàng chục thông số. Các hệ thống chống bot hiện đại sử dụng học máy và phân tích hàng trăm đặc điểm của trình duyệt đồng thời, vì vậy việc chỉ thay thế User-Agent đã không còn hiệu quả. Để thu thập dữ liệu thành công, cần kết hợp nhiều phương pháp bảo vệ.
Các yếu tố chính của ngụy trang hiệu quả: xóa các dấu hiệu JavaScript của tự động hóa (navigator.webdriver, các biến CDP), mô phỏng Canvas và WebGL fingerprint, cấu hình các tiêu đề HTTP thực tế và sử dụng các proxy chất lượng. Các giải pháp sẵn có (selenium-stealth cho Python, puppeteer-extra-plugin-stealth cho Node.js) bao phủ 80% các trường hợp, nhưng để vượt qua các bảo vệ tiên tiến cần cấu hình bổ sung.
Một điểm quan trọng — lựa chọn proxy. Ngay cả một trình duyệt được ngụy trang hoàn hảo cũng sẽ bị chặn nếu sử dụng các địa chỉ IP từ danh sách đen hoặc thực hiện quá nhiều yêu cầu từ một IP. Để thu thập dữ liệu từ các trang web bảo mật, chúng tôi khuyên bạn nên sử dụng proxy dân cư với xoay vòng tự động — chúng đảm bảo điểm tin cậy cao và rủi ro bị chặn tối thiểu, vì chúng sử dụng địa chỉ IP thực của người dùng gia đình thay vì địa chỉ máy chủ.
Thường xuyên kiểm tra chất lượng ngụy trang qua các dịch vụ chuyên dụng (bot.sannysoft.com, pixelscan.net) và điều chỉnh cấu hình theo sự thay đổi trong các hệ thống chống bot. Việc thu thập dữ liệu là một cuộc chạy đua vũ trang liên tục giữa các nhà phát triển bot và các nhà tạo ra bảo vệ, vì vậy cấu hình hoạt động hôm nay có thể cần cập nhật trong vài tháng tới.