Modern web siteleri otomatik tarayıcıları (Selenium, Puppeteer, Playwright) tanımayı öğrendi ve bu tarayıcıların isteklerini engelliyor. Headless tarayıcılar, anti-bot sistemlerinin otomasyonu milisaniyeler içinde tespit etmesine olanak tanıyan onlarca dijital iz bırakıyor. Bu rehberde, parselleyicilerinizin engellenmeden stabil bir şekilde çalışması için Python ve JavaScript'te kod örnekleri ile headless tarayıcıların maskeleme yöntemlerini inceleyeceğiz.
Makale, web scraping, test otomasyonu veya korumalı sitelerden veri toplama ile ilgilenen geliştiriciler için hazırlanmıştır. Tespit etme tekniklerinin detaylarını ve koruma aşma için pratik çözümleri ele alacağız.
Web siteleri headless tarayıcıları nasıl tespit eder: temel yöntemler
Anti-bot sistemleri, yüzlerce parametreyi analiz ederek çok katmanlı bir tarayıcı kontrolü kullanır. Headless tarayıcılar, basit bir User-Agent değişikliği ile gizlenemeyecek birçok belirti ile normal tarayıcılardan farklıdır. Tespit yöntemlerini anlamak, etkili maskelemenin ilk adımıdır.
JavaScript otomasyon işaretleri
En yaygın yöntem, yalnızca otomatik tarayıcılarda görünen JavaScript özelliklerini kontrol etmektir:
navigator.webdriver— Selenium ve Puppeteer'detruedönerwindow.chrome— headless Chrome'da yokturnavigator.plugins.length— headless modda 0'dırnavigator.languages— genellikle boş bir dizi veya sadece "en-US" içerirnavigator.permissions— API, headless modda farklı çalışır
Chrome DevTools Protokolü analizi
Puppeteer ve Playwright, tarayıcıyı Chrome DevTools Protokolü (CDP) üzerinden yönetir. CDP bağlantısının varlığı, window.cdc_ nesnelerini analiz eden özel JavaScript kontrolleri ile tespit edilebilir veya fare ve klavye olaylarının davranışındaki anormallikler kontrol edilebilir.
Canvas ve WebGL Parmak İzi
Headless tarayıcılar, yazılım tabanlı render kullanarak aynı Canvas ve WebGL parmak izlerini oluşturur. Anti-bot sistemleri, görünmez bir Canvas öğesi oluşturur, üzerine metin veya şekiller çizer ve görüntünün hash'ini hesaplar. Eğer binlerce kullanıcı aynı hash'e sahipse, bu botların bir işareti olabilir.
Davranış analizi
Modern sistemler (DataDome, PerimeterX, Cloudflare Bot Yönetimi) fare hareketlerini, kaydırma hızını, tıklama kalıplarını analiz eder. Headless tarayıcılar, eylemleri anında ve doğal gecikmeler olmadan gerçekleştirir, bu da otomasyonu açığa çıkarır. Ayrıca olaylar da analiz edilir: normal bir tarayıcıda tıklamadan önce her zaman bir mousemove olayı gerçekleşirken, botlar genellikle fare hareketi olmadan tıklama yapar.
Önemli: Modern anti-bot sistemleri, aynı anda yüzlerce parametreyi analiz etmek için makine öğrenimi kullanır. Sadece bir parametreyi (örneğin, User-Agent) maskelemek, engellemelerden korumaz — kapsamlı bir yaklaşım gereklidir.
navigator.webdriver ve diğer JavaScript işaretlerinin kaldırılması
navigator.webdriver özelliği, Selenium ve diğer WebDriver araçlarının tespit edilmesinin en basit yoludur. Normal bir tarayıcıda bu özellik undefined dönerken, otomatik bir tarayıcıda true döner. Bunu, sayfa yüklenmeden önce JavaScript kodu çalıştırarak kaldırabilirsiniz.
Selenium (Python): CDP üzerinden webdriver kaldırma
Selenium için, herhangi bir sayfa yüklenmeden önce JavaScript çalıştırmak için Chrome DevTools Protokolü kullanılmalıdır:
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)
# CDP üzerinden navigator.webdriver kaldırma
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
'''
})
driver.get('https://example.com')
--disable-blink-features=AutomationControlled seçeneği, Chrome'un otomasyon modunda eklediği bayrağı devre dışı bırakır. Bu, diğer yöntemlerle birleştirilmesi gereken temel bir korumadır.
Puppeteer (Node.js): Page.evaluateOnNewDocument ile maskeleme
Puppeteer'de, sayfa yüklenmeden önce kod çalıştırmak için page.evaluateOnNewDocument() yöntemi kullanılır:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--disable-blink-features=AutomationControlled']
});
const page = await browser.newPage();
// WebDriver ve diğer işaretlerin kaldırılması
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// Chrome nesnesinin eklenmesi
window.chrome = {
runtime: {}
};
// Eklentilerin taklidi
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
});
await page.goto('https://example.com');
})();
Playwright: yerleşik maskeleme seçenekleri
Playwright, kutudan çıktığı gibi daha gelişmiş bir maskeleme sunar, ancak ek ayarlar yine de gereklidir:
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 Protokolü'nün maskelemesi
Puppeteer ve Playwright, CDP bağlantısının izlerini bırakır, bu izler window nesnelerini analiz ederek tespit edilebilir. Anti-bot sistemleri, DevTools Protokolü üzerinden bağlandığında Chrome'un oluşturduğu cdc_, $cdc_ veya __webdriver_ ile başlayan değişkenleri arar.
CDP değişkenlerinin kaldırılması
Aşağıdaki script, otomasyon ile ilgili tüm değişkenleri window nesnesinden kaldırır:
await page.evaluateOnNewDocument(() => {
// cdc_ ile başlayan tüm değişkenlerin kaldırılması
const cdcProps = Object.keys(window).filter(prop =>
prop.includes('cdc_') ||
prop.includes('$cdc_') ||
prop.includes('__webdriver_')
);
cdcProps.forEach(prop => {
delete window[prop];
});
// CDP'yi gizlemek için document.__proto__'nun yeniden tanımlanması
const originalQuery = document.querySelector;
document.querySelector = function(selector) {
if (selector.includes('cdc_')) return null;
return originalQuery.call(this, selector);
};
});
Yamanmış Chromium sürümlerinin kullanımı
CDP izlerini bırakmayan modifiye edilmiş Chromium derlemeleri mevcuttur. Örneğin, puppeteer-extra kütüphanesi, puppeteer-extra-plugin-stealth eklentisi ile birlikte CDP'yi maskelemek için otomatik olarak onlarca yamanın uygulanmasını sağlar.
User-Agent ve HTTP başlıklarının ayarlanması
Headless tarayıcılar, eski veya gerçekçi olmayan User-Agent dizeleri kullanır. Örneğin, Puppeteer varsayılan olarak User-Agent'a "HeadlessChrome" kelimesini ekler. Ayrıca, normal tarayıcıların isteklerinde bulunan ek başlıkları da ayarlamak gerekir.
Maskeleme için güncel User-Agent'lar
Gerçek tarayıcıların güncel User-Agent'larını kullanın. İşte 2024 yılı için örnekler:
# Windows 10'da Chrome 120
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
# macOS'ta Chrome 120
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
# Windows'ta Firefox 121
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Selenium'de başlık ayarlama
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 üzerinden ek başlıklar
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'de başlık ayarlama
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-* başlıkları kritik öneme sahiptir — bunlar Chrome 76+'da ortaya çıkmıştır ve yoklukları eski tarayıcı sürümlerini veya botları açığa çıkarır.
Canvas ve WebGL Parmak İzi taklidi
Canvas ve WebGL parmak izi, headless tarayıcıların aynı parmak izlerini oluşturması nedeniyle güçlü bir tespit yöntemidir. Anti-bot sistemleri, görünmez bir Canvas oluşturur, üzerine metin çizer ve piksellerin hash'ini hesaplar. Eğer binlerce istek aynı hash'e sahipse, bu botlardır.
Canvas'a gürültü ekleme
Aşağıdaki script, Canvas parmak izine rastgele gürültü ekleyerek her isteği benzersiz hale getirir:
await page.evaluateOnNewDocument(() => {
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
const originalToBlob = HTMLCanvasElement.prototype.toBlob;
const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;
// Gürültü ekleme fonksiyonu
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 parametrelerinin taklidi
WebGL, ekran kartı ve sürücüler hakkında bilgi açığa çıkarır. Headless modda bu parametreler yazılım tabanlı render ile açığa çıkar:
await page.evaluateOnNewDocument(() => {
const getParameter = WebGLRenderingContext.prototype.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
// Gerçek ekran kartının taklidi
if (parameter === 37445) {
return 'Intel Inc.';
}
if (parameter === 37446) {
return 'Intel Iris OpenGL Engine';
}
return getParameter.call(this, parameter);
};
});
37445 parametresi UNMASKED_VENDOR_WEBGL, 37446 ise UNMASKED_RENDERER_WEBGL'dir. Headless modda bunlar "Google SwiftShader" döner, bu da otomasyonu açığa çıkarır.
Selenium Stealth: Python için hazır çözümler
selenium-stealth kütüphanesi, Selenium'u maskelemek için otomatik olarak onlarca yamanın uygulanmasını sağlar. Bu, Python geliştiricileri için en basit çözümdür ve her parametreyi manuel olarak ayarlama gerektirmez.
Kurulum ve temel ayarlar
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 yamalarının uygulanması
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")
Kütüphane otomatik olarak navigator.webdriver'ı kaldırır, window.chrome'ı ekler, eklentileri taklit eder, WebGL'i maskelemekte ve 20'den fazla yama uygular. Bu, tespit durumlarının %80'ini kapsar.
Proxy ile gelişmiş ayar
Tam maskeleme için selenium-stealth'i rezidans proxy'leri ile birleştirin — bunlar, gelişmiş anti-bot sistemlerini aşmak için kritik öneme sahip olan gerçek ev kullanıcılarının IP adreslerini sağlar:
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 Eklentisi için Node.js
Puppeteer için puppeteer-extra-plugin-stealth eklentisi, JavaScript ekosisteminde headless tarayıcıları maskelemek için en gelişmiş çözümdür. Her biri otomasyonun belirli bir yönünü maskeleyen 23 bağımsız modül içerir.
Kurulum ve temel kullanım
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 Eklentisi neyi maskeleyebilir
Eklenti otomatik olarak aşağıdaki yamaları uygular:
navigator.webdriver'ın kaldırılmasıwindow.chromenesnesinin eklenmesinavigator.permissionsAPI'sinin taklidinavigator.pluginsvenavigator.mimeTypes'ın maskelemesi- Canvas ve WebGL parmak izinin taklidi
- User-Agent ve dillerin maskelemesi
- iframe contentWindow'daki anormalliklerin düzeltilmesi
- Battery API, Media Devices, WebRTC'nin taklidi
Proxy ve ek parametrelerle ayar
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();
// Proxy kimlik doğrulaması
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: anti-tespit ayarları
Playwright, Puppeteer'e kıyasla daha gelişmiş bir mimariye sahiptir ve otomasyon izlerini daha az bırakır. Ancak, gelişmiş anti-bot sistemlerini aşmak için ek ayarlar gereklidir. Playwright için stealth eklentisinin bir portu mevcuttur — playwright-extra.
playwright-extra'nın kurulumu
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();
})();
Maksimum maskeleme için tarayıcı bağlamının ayarlanması
Playwright, bireysel ayarlarla izole tarayıcı bağlamları oluşturmanıza olanak tanır. Bu, çoklu hesap yönetimi veya paralel parselleme için faydalıdır:
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,
// Bağlam için proxy ayarı
proxy: {
server: 'http://your-proxy:port',
username: 'user',
password: 'pass'
}
});
geolocation ve timezoneId parametreleri, proxy'nin IP adresine uygun olmalıdır, aksi takdirde anti-bot sistemleri tutarsızlık tespit eder (örneğin, Kaliforniya'dan bir IP, ancak New York'tan bir zaman dilimi).
Engellenme riskini azaltmak için proxy döngüsü
Mükemmel bir şekilde maskelemeye sahip bir headless tarayıcı bile, yüzlerce istek için tek bir IP adresi kullanıyorsa engellenebilir. Modern anti-bot sistemleri, bir IP'den gelen isteklerin sıklığını analiz eder ve şüpheli etkinlikleri engeller. Proxy döngüsü, parselleme sırasında koruma için zorunlu bir unsurdur.
Parselleme için proxy türleri: karşılaştırma
| Proxy Türü | Hız | Güven Skoru | En İyi Kullanım |
|---|---|---|---|
| Datacenter | Çok yüksek (50-200 ms) | Düşük | Basit siteler, toplu parselleme |
| Rezidans | Orta (300-1000 ms) | Yüksek | Korunan siteler, sosyal medya |
| Mobil | Düşük (500-2000 ms) | Çok yüksek | Mobil uygulamalar, Instagram, TikTok |
Korunan siteleri (pazar yerleri, sosyal medya, reklam platformları) parsellemek için rezidans proxy'leri önerilir, çünkü bunlar gerçek ev kullanıcılarının IP adreslerini kullanır ve anti-bot sistemlerinin kara listelerine düşmez.
Puppeteer'de proxy döngüsünün uygulanması
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();
}
// İstekler arasında gecikme
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
scrapeWithRotation([
'https://example1.com',
'https://example2.com',
'https://example3.com'
]);
Oturum tabanlı proxy ile döngü
Bazı proxy sağlayıcıları (ProxyCove dahil) oturum tabanlı döngü sunar — her istek otomatik olarak yeni bir IP alır, tarayıcıyı yeniden başlatmaya gerek kalmadan. Bu, proxy'nin özel URL formatı ile gerçekleştirilir:
// Format: 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()}`]
});
Maskeleme kalitesini nasıl test edilir: test araçları
Maskeleme ayarlarını yaptıktan sonra, headless tarayıcınızın normal bir kullanıcıyı ne kadar iyi taklit ettiğini kontrol etmeniz gerekir. Tarayıcı parametrelerini analiz eden ve otomasyon izlerinin ne kadar kaldığını gösteren birkaç özel web sitesi vardır.
Temel test araçları
- bot.sannysoft.com — webdriver, Chrome nesnesi, eklentiler, Canvas dahil 15'ten fazla tespit parametresini kontrol eder
- arh.antoinevastel.com/bots/areyouheadless — headless Chrome tespitine odaklanır
- pixelscan.net — tüm parametrelerin görselleştirilmesi ile gelişmiş parmak izi analizi
- abrahamjuliot.github.io/creepjs — en detaylı analiz (200+ parametre), tarayıcının güven seviyesini gösterir
- iphey.com — IP adresinin proxy ve VPN'e ait olup olmadığını kontrol eder
Test otomasyonu
Ayar değişikliklerinden sonra maskeleme kalitesini otomatik olarak kontrol etmek için bir script oluşturun:
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();
// Test 1: Sannysoft
await page.goto('https://bot.sannysoft.com');
await page.screenshot({ path: 'test-sannysoft.png', fullPage: true });
// Test 2: Are you headless
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('Headless detected:', !headlessDetected);
// Test 3: Webdriver özelliği
const webdriverPresent = await page.evaluate(() => navigator.webdriver);
console.log('navigator.webdriver:', webdriverPresent);
// Test 4: Chrome nesnesi
const chromePresent = await page.evaluate(() => !!window.chrome);
console.log('window.chrome mevcut:', chromePresent);
await browser.close();
}
testStealth();
Başarılı maskeleme kontrol listesi
Headless tarayıcınız doğru bir şekilde maskelemeye sahipse:
navigator.webdriverundefineddönerwindow.chromemevcut veruntimenesnesini içerirnavigator.plugins.length0'dan büyüktür- WebGL vendor ve renderer gerçek ekran kartını gösterir, SwiftShader değil
- Canvas parmak izi her oturum için benzersizdir
- User-Agent, güncel Chrome/Firefox sürümüne uygundur
- Proxy'nin IP adresi kara listelerde değildir (iphey.com üzerinden kontrol)
- Zaman dilimi ve yerel ayar, IP adresinin coğrafi konumuna uygundur
Sonuç
Headless tarayıcıları maskelemek, onlara dikkat edilmesi gereken birçok parametre gerektiren karmaşık bir görevdir. Modern anti-bot sistemleri, makine öğrenimi kullanarak tarayıcı özelliklerini aynı anda yüzlerce kez analiz eder, bu nedenle basit bir User-Agent değişikliği artık işe yaramaz. Başarılı bir parselleme için birkaç koruma yönteminin birleştirilmesi gereklidir.
Etkili maskelemenin ana unsurları: otomasyon JavaScript işaretlerinin (navigator.webdriver, CDP değişkenleri) kaldırılması, Canvas ve WebGL parmak izinin taklidi, gerçekçi HTTP başlıklarının ayarlanması ve kaliteli proxy'lerin kullanılmasıdır. Hazır çözümler (Python için selenium-stealth, Node.js için puppeteer-extra-plugin-stealth) tespit durumlarının %80'ini kapsar, ancak gelişmiş korumaları aşmak için ek ayarlar gereklidir.
Kritik bir nokta — proxy seçimi. Mükemmel bir şekilde maskelemeye sahip bir tarayıcı bile, kara listelerdeki IP adreslerini kullanıyorsa veya tek bir IP'den çok fazla istek yapıyorsa engellenir. Korunan siteleri parsellemek için, gerçek ev kullanıcılarının IP adreslerini kullanan rezidans proxy'leri ile otomatik döngü kullanmanızı öneririz — bunlar yüksek güven skoru ve minimum engellenme riski sağlar.
Maskeleme kalitesini düzenli olarak özel hizmetler (bot.sannysoft.com, pixelscan.net) aracılığıyla test edin ve ayarları anti-bot sistemlerindeki değişikliklere göre uyarlayın. Parselleme, bot geliştiricileri ile koruma yaratıcıları arasında sürekli bir silahlanma yarışıdır, bu nedenle bugün çalışan bir yapılandırma birkaç ay içinde güncellemeler gerektirebilir.