وبسایتهای مدرن یاد گرفتهاند که مرورگرهای خودکار (Selenium، Puppeteer، Playwright) را شناسایی کنند و درخواستهای آنها را مسدود کنند. مرورگرهای بدون سر دهها اثر دیجیتال را باقی میگذارند که سیستمهای ضد ربات به سرعت اتوماسیون را شناسایی میکنند. در این راهنما، تمام روشهای پنهانسازی مرورگرهای بدون سر را با مثالهای کد در Python و JavaScript بررسی خواهیم کرد تا پارسرهای شما به طور پایدار بدون مسدود شدن کار کنند.
این مقاله برای توسعهدهندگانی که در زمینه وباسکرپینگ، اتوماسیون تست یا جمعآوری دادهها از وبسایتهای محافظتشده فعالیت میکنند، طراحی شده است. ما جزئیات فنی تشخیص و راهحلهای عملی برای دور زدن حفاظت را بررسی خواهیم کرد.
چگونه وبسایتها مرورگرهای بدون سر را شناسایی میکنند: روشهای اصلی
سیستمهای ضد ربات از بررسی چندلایه مرورگر استفاده میکنند و صدها پارامتر را تحلیل میکنند. مرورگرهای بدون سر به دلیل ویژگیهای مختلفی که نمیتوان آنها را با جایگزینی ساده User-Agent پنهان کرد، با مرورگرهای معمولی متفاوت هستند. درک روشهای تشخیص، اولین قدم برای پنهانسازی مؤثر است.
نشانگرهای JavaScript اتوماسیون
رایجترین روش، بررسی ویژگیهای JavaScript است که تنها در مرورگرهای خودکار ظاهر میشوند:
navigator.webdriver— در Selenium و Puppeteertrueرا برمیگرداندwindow.chrome— در Chrome بدون سر وجود نداردnavigator.plugins.length— در حالت بدون سر برابر 0 استnavigator.languages— اغلب آرایهای خالی یا فقط شامل "en-US" استnavigator.permissions— API در حالت بدون سر بهطور متفاوتی عمل میکند
تحلیل پروتکل Chrome DevTools
Puppeteer و Playwright مرورگر را از طریق پروتکل Chrome DevTools (CDP) کنترل میکنند. وجود اتصال CDP را میتوان از طریق بررسیهای خاص JavaScript شناسایی کرد که اشیاء window.cdc_ را تحلیل میکنند یا ناهنجاریها در رفتار رویدادهای ماوس و کیبورد را بررسی میکنند.
Canvas و WebGL Fingerprinting
مرورگرهای بدون سر اثرات یکسانی از Canvas و WebGL تولید میکنند، زیرا از رندرینگ نرمافزاری به جای رندرینگ سختافزاری استفاده میکنند. سیستمهای ضد ربات یک عنصر Canvas نامرئی ایجاد میکنند، روی آن متن یا اشکالی رسم میکنند و هش تصویر را محاسبه میکنند. اگر هزاران کاربر هش یکسانی داشته باشند — این نشانه رباتها است.
تحلیل رفتاری
سیستمهای مدرن (DataDome، PerimeterX، Cloudflare Bot Management) حرکات ماوس، سرعت اسکرول و الگوهای کلیک را تحلیل میکنند. مرورگرهای بدون سر بهطور آنی و بدون تأخیرهای طبیعی عمل میکنند که اتوماسیون را فاش میکند. همچنین رویدادها تحلیل میشوند: در یک مرورگر معمولی قبل از کلیک همیشه یک رویداد mousemove رخ میدهد، در حالی که رباتها اغلب بدون حرکت قبلی ماوس کلیک میکنند.
مهم: سیستمهای مدرن ضد ربات از یادگیری ماشین برای تحلیل همزمان صدها پارامتر استفاده میکنند. پنهانسازی تنها یک پارامتر (مانند User-Agent) شما را در برابر مسدود شدن محافظت نمیکند — نیاز به یک رویکرد جامع است.
حذف navigator.webdriver و دیگر نشانگرهای JavaScript
ویژگی navigator.webdriver — سادهترین روش برای تشخیص Selenium و دیگر ابزارهای WebDriver است. در یک مرورگر معمولی، این ویژگی undefined را برمیگرداند، اما در مرورگر خودکار — true را برمیگرداند. میتوان آن را با اجرای کد JavaScript قبل از بارگذاری صفحه حذف کرد.
Selenium (Python): حذف webdriver از طریق CDP
برای Selenium باید از پروتکل Chrome DevTools برای اجرای JavaScript قبل از بارگذاری هر صفحه استفاده کنید:
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)
# حذف navigator.webdriver از طریق CDP
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
'''
})
driver.get('https://example.com')
گزینه --disable-blink-features=AutomationControlled پرچم را غیرفعال میکند که Chrome در حالت اتوماسیون اضافه میکند. این یک حفاظت پایهای است که باید با روشهای دیگر ترکیب شود.
Puppeteer (Node.js): پنهانسازی از طریق Page.evaluateOnNewDocument
در Puppeteer از روش page.evaluateOnNewDocument() برای اجرای کد قبل از بارگذاری صفحه استفاده میشود:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled']
});
const page = await browser.newPage();
// حذف webdriver و دیگر نشانگرها
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// افزودن شی chrome
window.chrome = {
runtime: {}
};
// شبیهسازی پلاگینها
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
});
await page.goto('https://example.com');
})();
Playwright: گزینههای داخلی پنهانسازی
Playwright پنهانسازی پیشرفتهتری از جعبه خارج دارد، اما تنظیمات اضافی همچنان ضروری است:
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');
})();
پنهانسازی پروتکل Chrome DevTools
Puppeteer و Playwright اثرات اتصال CDP را باقی میگذارند که میتوان آنها را از طریق تحلیل اشیاء window شناسایی کرد. سیستمهای ضد ربات به دنبال متغیرهایی با پیشوند cdc_، $cdc_ یا __webdriver_ هستند که Chrome هنگام اتصال از طریق پروتکل DevTools ایجاد میکند.
حذف متغیرهای CDP
اسکریپت زیر تمام متغیرهای مرتبط با اتوماسیون را از شیء window حذف میکند:
await page.evaluateOnNewDocument(() => {
// حذف تمام متغیرهای با پیشوند cdc_
const cdcProps = Object.keys(window).filter(prop =>
prop.includes('cdc_') ||
prop.includes('$cdc_') ||
prop.includes('__webdriver_')
);
cdcProps.forEach(prop => {
delete window[prop];
});
// بازتعریف document.__proto__ برای پنهانسازی CDP
const originalQuery = document.querySelector;
document.querySelector = function(selector) {
if (selector.includes('cdc_')) return null;
return originalQuery.call(this, selector);
};
});
استفاده از نسخههای پچ شده Chromium
نسخههای اصلاحشدهای از Chromium وجود دارند که اثرات CDP را باقی نمیگذارند. به عنوان مثال، کتابخانه puppeteer-extra با پلاگین puppeteer-extra-plugin-stealth بهطور خودکار دهها پچ برای پنهانسازی CDP اعمال میکند.
تنظیم User-Agent و هدرهای HTTP
مرورگرهای بدون سر از رشتههای User-Agent قدیمی یا غیرواقعی استفاده میکنند. به عنوان مثال، Puppeteer بهطور پیشفرض کلمه "HeadlessChrome" را به User-Agent اضافه میکند. علاوه بر این، باید هدرهای اضافی را تنظیم کنید که در درخواستهای مرورگرهای معمولی وجود دارند.
User-Agentهای بهروز برای پنهانسازی
از User-Agentهای جدید مرورگرهای واقعی استفاده کنید. در اینجا نمونههایی برای سال 2024 آورده شده است:
# Chrome 120 بر روی 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 بر روی 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 بر روی Windows
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
تنظیم هدرها در 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')
# هدرهای اضافی از طریق 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'
})
تنظیم هدرها در 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'
});
هدرهای Sec-Fetch-* به شدت مهم هستند — آنها از Chrome 76+ ظاهر شدهاند و نبود آنها نسخههای قدیمی مرورگرها یا رباتها را فاش میکند.
شبیهسازی Canvas و WebGL Fingerprint
Canvas و WebGL fingerprinting — یک روش قدرتمند برای تشخیص است، زیرا مرورگرهای بدون سر اثرات یکسانی تولید میکنند. سیستمهای ضد ربات یک Canvas نامرئی ایجاد میکنند، روی آن متن رسم میکنند و هش پیکسلها را محاسبه میکنند. اگر هزاران درخواست هش یکسانی داشته باشند — این رباتها هستند.
افزودن نویز به Canvas
اسکریپت زیر نویز تصادفی به اثر Canvas اضافه میکند و هر درخواست را منحصر به فرد میکند:
await page.evaluateOnNewDocument(() => {
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
const originalToBlob = HTMLCanvasElement.prototype.toBlob;
const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
// تابع افزودن نویز
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);
};
});
شبیهسازی پارامترهای WebGL
WebGL اطلاعاتی درباره کارت گرافیک و درایورها فاش میکند. در حالت بدون سر، این پارامترها رندرینگ نرمافزاری را فاش میکنند:
await page.evaluateOnNewDocument(() => {
const getParameter = WebGLRenderingContext.prototype.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
// شبیهسازی کارت گرافیک واقعی
if (parameter === 37445) {
return 'Intel Inc.';
}
if (parameter === 37446) {
return 'Intel Iris OpenGL Engine';
}
return getParameter.call(this, parameter);
};
});
پارامتر 37445 — UNMASKED_VENDOR_WEBGL است، و 37446 — UNMASKED_RENDERER_WEBGL. در حالت بدون سر، آنها "Google SwiftShader" را برمیگردانند که اتوماسیون را فاش میکند.
Selenium Stealth: راهحلهای آماده برای Python
کتابخانه selenium-stealth بهطور خودکار دهها پچ برای پنهانسازی Selenium اعمال میکند. این سادهترین راهحل برای توسعهدهندگان Python است که نیاز به تنظیم دستی هر پارامتر ندارد.
نصب و تنظیمات پایه
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)
# اعمال پچهای 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")
این کتابخانه بهطور خودکار navigator.webdriver را حذف میکند، window.chrome را اضافه میکند، پلاگینها را شبیهسازی میکند، WebGL را پنهان میکند و بیش از 20 پچ دیگر را اعمال میکند. این 80% موارد تشخیص را پوشش میدهد.
تنظیمات پیشرفته با پروکسی
برای پنهانسازی کامل، selenium-stealth را با پروکسیهای مسکونی ترکیب کنید — آنها آدرسهای IP واقعی کاربران خانگی را فراهم میکنند که برای دور زدن سیستمهای ضد ربات پیشرفته حیاتی است:
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 برای Node.js
برای Puppeteer پلاگینی به نام puppeteer-extra-plugin-stealth وجود دارد که پیشرفتهترین راهحل برای پنهانسازی مرورگرهای بدون سر در اکوسیستم JavaScript است. این شامل 23 ماژول مستقل است که هر کدام جنبه خاصی از اتوماسیون را پنهان میکنند.
نصب و استفاده پایه
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();
})();
چه چیزی را Stealth Plugin پنهان میکند
این پلاگین بهطور خودکار پچهای زیر را اعمال میکند:
- حذف
navigator.webdriver - افزودن شی
window.chrome - شبیهسازی API
navigator.permissions - پنهانسازی
navigator.pluginsوnavigator.mimeTypes - شبیهسازی Canvas و WebGL fingerprint
- پنهانسازی User-Agent و زبانها
- اصلاح ناهنجاریها در iframe contentWindow
- شبیهسازی Battery API، Media Devices، WebRTC
تنظیمات با پروکسی و پارامترهای اضافی
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();
// احراز هویت پروکسی
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: تنظیم ضد تشخیص
Playwright معماری بهتری نسبت به Puppeteer دارد و اثرات اتوماسیون کمتری را باقی میگذارد. با این حال، برای دور زدن سیستمهای ضد ربات پیشرفته نیاز به تنظیمات اضافی است. برای Playwright یک پورت از پلاگین stealth وجود دارد — playwright-extra.
نصب 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();
})();
تنظیمات زمینه مرورگر برای حداکثر پنهانسازی
Playwright به شما این امکان را میدهد که زمینههای ایزوله مرورگر با تنظیمات فردی ایجاد کنید. این برای چند حساب کاربری یا پارسینگ موازی مفید است:
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,
// تنظیم پروکسی برای زمینه
proxy: {
server: 'http://your-proxy:port',
username: 'user',
password: 'pass'
}
});
پارامترهای geolocation و timezoneId باید با IP آدرس پروکسی مطابقت داشته باشند، در غیر این صورت سیستمهای ضد ربات عدم تطابق را شناسایی میکنند (به عنوان مثال، IP از کالیفرنیا، اما timezone نیویورک).
چرخش پروکسی برای کاهش ریسک مسدود شدن
حتی یک مرورگر بدون سر که بهطور ایدهآل پنهان شده باشد، میتواند مسدود شود اگر از یک آدرس IP برای صدها درخواست استفاده کند. سیستمهای ضد ربات مدرن فرکانس درخواستها از یک IP را تحلیل میکنند و فعالیت مشکوک را مسدود میکنند. چرخش پروکسی یک عنصر ضروری در حفاظت هنگام پارس کردن است.
انواع پروکسی برای پارس کردن: مقایسه
| نوع پروکسی | سرعت | نمره اعتماد | بهتر برای |
|---|---|---|---|
| مرکز داده | بسیار بالا (50-200 میلیثانیه) | پایین | وبسایتهای ساده، پارسینگ انبوه |
| مسکونی | متوسط (300-1000 میلیثانیه) | بالا | وبسایتهای محافظتشده، شبکههای اجتماعی |
| موبایل | پایین (500-2000 میلیثانیه) | بسیار بالا | برنامههای موبایل، Instagram، TikTok |
برای پارس کردن وبسایتهای محافظتشده (بازارها، شبکههای اجتماعی، پلتفرمهای تبلیغاتی) پروکسیهای مسکونی توصیه میشوند، زیرا آنها آدرسهای IP واقعی کاربران خانگی دارند و در لیستهای سیاه سیستمهای ضد ربات قرار نمیگیرند.
پیادهسازی چرخش پروکسی در 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(`Error on ${urls[i]}:`, error);
} finally {
await browser.close();
}
// تأخیر بین درخواستها
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
scrapeWithRotation([
'https://example1.com',
'https://example2.com',
'https://example3.com'
]);
چرخش از طریق پروکسیهای مبتنی بر جلسه
برخی از ارائهدهندگان پروکسی (از جمله ProxyCove) چرخش مبتنی بر جلسه را ارائه میدهند — هر درخواست بهطور خودکار یک IP جدید دریافت میکند بدون نیاز به راهاندازی مجدد مرورگر. این از طریق فرمت خاص URL پروکسی پیادهسازی میشود:
// فرمت: 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()}`]
});
چگونه کیفیت پنهانسازی را بررسی کنیم: ابزارهای تست
پس از تنظیم پنهانسازی، باید بررسی کنید که چقدر خوب مرورگر بدون سر شما کاربر معمولی را شبیهسازی میکند. چندین وبسایت تخصصی وجود دارند که دهها پارامتر مرورگر را تحلیل میکنند و نشان میدهند که چه اثراتی از اتوماسیون باقی مانده است.
ابزارهای اصلی تست
- bot.sannysoft.com — بیش از 15 پارامتر تشخیص را بررسی میکند، از جمله webdriver، شی Chrome، پلاگینها، Canvas
- arh.antoinevastel.com/bots/areyouheadless — بر روی تشخیص Chrome بدون سر تخصص دارد
- pixelscan.net — تحلیل پیشرفته fingerprint با تجسم تمام پارامترها
- abrahamjuliot.github.io/creepjs — دقیقترین تحلیل (بیش از 200 پارامتر)، سطح اعتماد مرورگر را نشان میدهد
- iphey.com — بررسی IP آدرس برای تعلق به پروکسی و VPN
اتوماسیون تست
یک اسکریپت برای بررسی خودکار پنهانسازی پس از هر تغییر در تنظیمات ایجاد کنید:
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();
// تست 1: Sannysoft
await page.goto('https://bot.sannysoft.com');
await page.screenshot({ path: 'test-sannysoft.png', fullPage: true });
// تست 2: آیا شما بدون سر هستید
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('بدون سر شناسایی شد:', !headlessDetected);
// تست 3: ویژگی Webdriver
const webdriverPresent = await page.evaluate(() => navigator.webdriver);
console.log('navigator.webdriver:', webdriverPresent);
// تست 4: شی Chrome
const chromePresent = await page.evaluate(() => !!window.chrome);
console.log('شی window.chrome موجود است:', chromePresent);
await browser.close();
}
testStealth();
چکلیست پنهانسازی موفق
مرورگر بدون سر شما به درستی پنهان شده است اگر:
navigator.webdriverundefinedرا برمیگرداندwindow.chromeوجود دارد و شامل شیءruntimeاستnavigator.plugins.lengthبزرگتر از 0 است- فروشنده و رندرر WebGL کارت گرافیک واقعی را نشان میدهند، نه SwiftShader
- Canvas fingerprint برای هر جلسه منحصر به فرد است
- User-Agent با نسخه فعلی Chrome/Firefox مطابقت دارد
- آدرس IP پروکسی در لیستهای سیاه نیست (بررسی از طریق iphey.com)
- Timezone و locale با جغرافیای IP مطابقت دارند
نتیجهگیری
پنهانسازی مرورگرهای بدون سر یک وظیفه پیچیده است که نیاز به توجه به دهها پارامتر دارد. سیستمهای ضد ربات مدرن از یادگیری ماشین استفاده میکنند و همزمان صدها ویژگی مرورگر را تحلیل میکنند، بنابراین جایگزینی ساده User-Agent دیگر کار نمیکند. برای پارس موفق، باید چندین روش حفاظت را ترکیب کنید.
عناصر اصلی پنهانسازی مؤثر: حذف نشانگرهای JavaScript اتوماسیون (navigator.webdriver، متغیرهای CDP)، شبیهسازی Canvas و WebGL fingerprint، تنظیم هدرهای HTTP واقعگرایانه و استفاده از پروکسیهای با کیفیت. راهحلهای آماده (selenium-stealth برای Python، puppeteer-extra-plugin-stealth برای Node.js) 80% موارد را پوشش میدهند، اما برای دور زدن حفاظتهای پیشرفته نیاز به تنظیمات اضافی است.
نکته حیاتی — انتخاب پروکسی. حتی یک مرورگر بهطور ایدهآل پنهان شده نیز مسدود خواهد شد اگر از آدرسهای IP موجود در لیستهای سیاه استفاده کند یا تعداد زیادی درخواست از یک IP ارسال کند. برای پارس کردن وبسایتهای محافظتشده، توصیه میکنیم از پروکسیهای مسکونی با چرخش خودکار استفاده کنید — آنها نمره اعتماد بالایی و ریسک مسدود شدن کمی دارند، زیرا از آدرسهای IP واقعی کاربران خانگی به جای آدرسهای سروری استفاده میکنند.
بهطور منظم کیفیت پنهانسازی را از طریق خدمات تخصصی (bot.sannysoft.com، pixelscan.net) تست کنید و تنظیمات را بر اساس تغییرات در سیستمهای ضد ربات تطبیق دهید. پارس کردن — یک مسابقه تسلیحاتی دائمی بین توسعهدهندگان رباتها و سازندگان حفاظت است، بنابراین پیکربندی که امروز کار میکند ممکن است نیاز به بهروزرسانی در چند ماه آینده داشته باشد.