Node.js'de got-scraping, Apify'in got tabanlı HTTP istemcisidir ve sıradan HTTP isteklerini engellemek için tasarlanmış modern anti-bot sistemlerine karşı tutarlı, gerçekçi tarayıcı parmak izleri üretir. Bu rehberde, got-scraping proxy entegrasyonunu sıfırdan üretim seviyesine kadar adım adım inceleyeceğiz: header-generator'ın nasıl çalıştığından, gate.proxyhat.com:8080 üzerinden residential IP rotasyonuna, retry hook'larından Crawlee'in CheerioCrawler'ına kadar her şeyi ele alacağız.
Yasal uyarı: Bu rehber yalnızca herkese açık verilerin toplanmasını ele alır. ABD'de CFAA ve AB'de GDPR kapsamında, bir sitenin Hizmet Şartları'nı ihlal eden scraping eylemleri hukuki risk taşıyabilir. Her zaman
robots.txtkurallarına uyun, hız sınırlarına saygı gösterin ve mümkünse resmi API'leri tercih edin.
Node.js'de got-scraping Neden Gerekli?
Ham got veya axios ile yapılan istekler, modern anti-bot sistemlerinde genellikle ilk saniyede yakalanır. Bunun nedeni yalnızca eksik User-Agent başlığı değildir; sorun, HTTP başlıklarının tutarsızlığı ve TLS parmak izinin tarayıcıyla örtüşmemesidir.
Bir gerçek Chrome 120 tarayıcısı, istek gönderirken şu başlık sırasını kullanır: sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode, sec-fetch-user, sec-fetch-dest, accept-encoding, accept-language. Sıradan bir got isteği ise accept, user-agent, accept-encoding sırasını gönderir — bu, bir Cloudflare veya Datadome bot yönetimi sisteminin isteği anında işaretlemesi için yeterlidir.
MDN'ye göre, sec-ch-ua başlıkları tarayıcılar tarafından otomatik eklenir ve programatik olarak değiştirilemez. got-scraping'in header-generator modülü, bu başlık setlerini tutarlı bir şekilde üretir: belirli bir tarayıcı sürümü, işletim sistemi ve cihaz tipi seçer, ardından o profile ait tüm başlıkları doğru sırayla ve doğru değerlerle birlikte gönderir.
HTTP/2 Desteği ve TLS Parmak İzi
got-scraping, got'un HTTP/2 desteğini kullanır. Bu kritiktir çünkü gerçek tarayıcılar Google, Cloudflare korumalı siteler ve büyük e-ticaret platformları için HTTP/2 kullanır. HTTP/1.1 üzerinden gelen bir istek, tarayıcı parmak izi doğru olsa bile şüpheli görünebilir. HTTP/2 ayrıca tek bir TCP bağlantısında çoklu istek (multiplexing) sağlar, bu da ortalama yanıt süresini ~200ms azaltabilir.
got-scraping'in İdiomatik API Yüzeyi
got-scraping, got'u genişleterek çalışır. Temel ilkelar şunlardır:
got.extend()— got-scraping,got'u genişleten önceden yapılandırılmış bir instance döndürür. Kendi hook'larınızı ve seçeneklerinizi eklemek için tekrar.extend()yapabilirsiniz.useHeaderGenerator—trueolarak ayarlandığında, her istek için tutarlı bir tarayıcı başlık seti otomatik üretilir.headerGeneratorOptions—browsers,devices,operatingSystemsalanlarıyla profil seçimi yaparsınız. Örneğin{ browsers: ['chrome'], devices: ['desktop'], operatingSystems: ['windows'] }.proxyUrl— HTTP/1 ve HTTP/2 proxy'leri için standart proxy URL formatı:http://user:pass@host:port.
Temel Yapılandırma Örneği
import { gotScraping } from 'got-scraping';
const client = gotScraping.extend({
useHeaderGenerator: true,
headerGeneratorOptions: {
browsers: ['chrome'],
devices: ['desktop'],
operatingSystems: ['windows'],
},
timeout: { request: 15000 },
});
const response = await client.get('https://example.com');
console.log(response.statusCode);
console.log(response.headers); // tutarlı sec-ch-ua seti
Bu örnekte gotScraping.extend() ile bir istemci oluşturuyoruz. useHeaderGenerator: true sayesinde her istek, Windows masaüstü Chrome profiline uygun başlıklar alır. Başlık sırası, sec-ch-ua değerleri ve accept-language tümü birbiriyle tutarlıdır — yani bir Windows Chrome kullanıcısının mantıksal başlık setini simüle eder.
Residential Proxy'ler: Neden IP Adresi Önemli?
Başlıklar ve TLS parmak izi mükemmel olsa bile, IP adresiniz hala bir veri merkezi bloğundan geliyorsa birçok anti-bot sistemi sizi engeller. Web scraping bağlamında, Cloudflare ve benzeri sistemler ASN (Autonomous System Number) veritabanları kullanarak IP'leri sınıflandırır: AS14618 (Amazon AWS), AS15169 (Google Cloud) gibi veri merkezi ASN'leri genellikle bot olarak işaretlenir.
Residential proxy'ler, gerçek İSS'lere ait IP adresleri kullanır — Comcast, Deutsche Telekom, Vodafone gibi. Bu IP'ler, gerçek bir kullanıcının evinden gelen trafikten ayırt edilemez. got scraping header generator ile üretilen tutarlı tarayıcı başlıkları + residential IP kombinasyonu, en katı anti-bot sistemlerini bile aşmak için gereken iki temel bileşeni sağlar.
ProxyHat Residential Proxy Entegrasyonu
ProxyHat'ın residential proxy ağına bağlanmak için gate.proxyhat.com gateway'ini kullanırsınız. Kimlik doğrulama, kullanıcı adı içine gömülü flag'lerle yapılır:
| Parametre | Format | Örnek |
|---|---|---|
| Gateway | gate.proxyhat.com |
— |
| HTTP Port | 8080 |
— |
| SOCKS5 Port | 1080 |
— |
| Ülke hedefleme | user-country-US |
http://user-country-US:pass@gate.proxyhat.com:8080 |
| Şehir hedefleme | user-country-DE-city-berlin |
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080 |
| Sticky session | user-session-abc123 |
http://user-session-abc123:pass@gate.proxyhat.com:8080 |
ProxyHat lokasyonlar sayfasından 90+ ülkeye erişebilirsiniz. Residential proxy'ler her istekte farklı bir IP verir (rotating mod), ancak session flag'i ile aynı IP'yi 10-30 dakika boyunca tutabilirsiniz (sticky mod).
Node.js'de got-scraping Proxy Rotation: Çalışan Örnek
Şimdi, her istek için farklı bir residential IP kullanan, retry hook'ları ile hataları yöneten ve ProxyHat'ın kullanıcı adı formatını dinamik olarak üreten tam bir örnek inceleyelim:
import { gotScraping } from 'got-scraping';
import { randomUUID } from 'crypto';
// ProxyHat kimlik bilgileri
const PROXYHAT_USER = 'your_username';
const PROXYHAT_PASS = 'your_password';
const GATEWAY = 'gate.proxyhat.com:8080';
// Her istek için benzersiz session ID üret
function buildProxyUrl(country = 'US') {
const sessionId = randomUUID().slice(0, 8);
const username = `${PROXYHAT_USER}-country-${country}-session-${sessionId}`;
return `http://${username}:${PROXYHAT_PASS}@${GATEWAY}`;
}
// got-scraping istemcisini genişlet
const client = gotScraping.extend({
useHeaderGenerator: true,
headerGeneratorOptions: {
browsers: ['chrome'],
devices: ['desktop'],
operatingSystems: ['windows', 'macos'],
},
timeout: { request: 20000 },
retry: {
limit: 3,
statusCodes: [403, 429, 500, 502, 503],
backoffLimit: 5000,
},
hooks: {
beforeRequest: [
(options) => {
// Her istek için yeni residential IP
options.proxyUrl = buildProxyUrl('US');
},
],
afterResponse: [
(response, retryWithMergedOptions) => {
if (response.statusCode === 403) {
// 403 = muhtemelen IP engellendi, yeni IP ile retry
const newProxy = buildProxyUrl('US');
return retryWithMergedOptions({
proxyUrl: newProxy,
});
}
return response;
},
],
},
});
// Kullanım
async function scrapePage(url) {
const response = await client.get(url);
return response.body;
}
const html = await scrapePage('https://example.com');
console.log(`İndirilen içerik: ${html.length} bayt`);
Bu örnekte üç önemli mekanizma çalışır:
beforeRequesthook — her istek öncesi yeni birsession-xxxID üretilir, bu da ProxyHat'tan farklı bir residential IP döndürür.retryyapılandırması — 403, 429 ve 5xx durum kodlarında otomatik olarak 3 kez retry yapılır, her seferinde 5 saniyeye kadar artan bekleme süresi uygulanır.afterResponsehook — 403 alındığında, IP'nin engellendiğini varsayar ve yeni bir proxy URL'i ile retry yapar. Bu, IP rotasyonunun sadeceretrymekanizmasına değil, response seviyesinde de çalışmasını sağlar.
SOCKS5 ile Daha Güvenli Bağlantı
Bazı durumlarda HTTP proxy yeterli değildir — özellikle hedef site TLS inspection yapıyorsa, HTTP proxy'nin CONNECT tüneli şüphe uyandırabilir. SOCKS5, daha düşük seviyeli bir protokoldür ve trafiği daha az müdahaleyle iletir:
const socksProxyUrl = `socks5://${PROXYHAT_USER}-country-DE-session-${sessionId}:${PROXYHAT_PASS}@gate.proxyhat.com:1080`;
const response = await gotScraping({
url: 'https://example.com',
proxyUrl: socksProxyUrl,
useHeaderGenerator: true,
});
SOCKS5, port 1080 üzerinden çalışır ve özellikle yüksek güvenlik gerektiren hedeflerde daha iyi başarı oranları verebilir.
Üretim Desenleri: Concurrency, Cookie Jar ve Crawlee
Sınırlı Eşzamanlılık (Bounded Concurrency)
100 concurrent session ile scraping yaparken, tüm istekleri aynı anda göndermek hem hedef sunucuyu aşırı yükler hem de proxy sağlayıcınızın rate limit'ini aşar. p-limit ile eşzamanlılık sınırı koyabilirsiniz:
import pLimit from 'p-limit';
const limit = pLimit(10); // maksimum 10 eşzamanlı istek
const urls = ['https://example.com/page/1', 'https://example.com/page/2', /* ... */];
const results = await Promise.all(
urls.map(url => limit(() => scrapePage(url)))
);
console.log(`Toplam ${results.length} sayfa indirildi`);
10 eşzamanlı istek, ortalama bir hedef için güvenli bir başlangıçtır. ProxyHat residential proxy'leri 100+ eşzamanlı bağlantıyı destekler, ancak hedef sitenin rate limit'ini aşmamak için bu sayıyı hedefe göre ayarlamanız gerekir.
Cookie Jar ile Oturum Sürekliliği
Bazı siteler, ilk ziyarette bir cookie set eder ve sonraki isteklerde bu cookie'nin varlığını kontrol eder. tough-cookie tabanlı cookie jar kullanarak bu davranışı simüle edebilirsiniz:
import { gotScraping } from 'got-scraping';
import { CookieJar } from 'tough-cookie';
const cookieJar = new CookieJar();
const client = gotScraping.extend({
useHeaderGenerator: true,
cookieJar,
hooks: {
beforeRequest: [(opts) => { opts.proxyUrl = buildProxyUrl('US'); }],
},
});
// İlk istek cookie set eder
await client.get('https://example.com/login');
// İkinci istek cookie'yi otomatik gönderir
await client.get('https://example.com/dashboard');
Crawlee CheerioCrawler'a Geçiş
URL sayısı 100'ü aştığında, manuel concurrency yönetimi yetersiz kalır. Crawlee, Apify'in scraping framework'üdür ve got-scraping'i CheerioCrawler içinde kullanır:
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
requestHandler: async ({ $, request }) => {
const title = $('title').text();
const links = $('a').map((_, el) => $(el).attr('href')).get();
console.log(`${request.url}: ${title} (${links.length} link)`);
},
maxConcurrency: 10,
maxRequestRetries: 3,
// ProxyHat proxy'leri burada da kullanılır
proxyConfiguration: {
proxyUrls: [
`http://${PROXYHAT_USER}-country-US-session-s1:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,
`http://${PROXYHAT_USER}-country-US-session-s2:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,
`http://${PROXYHAT_USER}-country-US-session-s3:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,
],
},
});
await crawler.run([
'https://example.com/page/1',
'https://example.com/page/2',
'https://example.com/page/3',
]);
CheerioCrawler, got-scraping'in useHeaderGenerator özelliğini varsayılan olarak etkinleştirir. Proxy rotation, proxyConfiguration üzerinden otomatik yapılır — her istek farklı bir proxy URL'i seçilir. Daha fazla bilgi için ProxyHat dokümantasyonunu inceleyin.
Headless Browser Ne Zaman Kaçınılmaz?
got-scraping, statik HTML içeriği için mükemmeldir. Ancak şu senaryolarda headless browser (Playwright, Puppeteer) gerekir:
- JavaScript rendering: İçerik, istemci tarafında React/Vue/Angular ile render ediliyorsa, ham HTML boş gelir.
- Cloudflare challenge: Bazı Cloudflare korumalı siteleri, JS challenge'ı çözmek için gerçek bir tarayıcı motoru gerektirir.
- İnteraktif akışlar: Buton tıklama, form doldurma, scroll ile lazy loading tetikleme.
Headless browser maliyetlidir: tek bir sayfa yükleme ~2-5 saniye sürer ve RAM kullanımı ~200-500 MB'tır. got-scraping ile bir sayfa ortalama 200-500ms'de indirilir ve RAM kullanımı ~20 MB'tır. Bu yüzden, headless browser'ı yalnızca gerektiğinde kullanın ve mümkün olduğunca got-scraping ile statik HTML çekmeyi tercih edin.
Etiğe Dair Notlar
Scraping yapmadan önce şu soruları sorun:
- Resmi API var mı? Birçok platform (Reddit, Twitter, GitHub) ücretsiz veya ucuz API'ler sunar. API, scraping'ten her zaman daha hızlı, daha güvenilir ve daha az risklidir.
robots.txtne diyor?https://example.com/robots.txtdosyası, hangi yolların crawl edilebileceğini belirtir. Bu kurallara uymak zorunlu olmasa da, etik bir uygulamadır.- Hız limiti: Hedef sunucuya saniyede 10'dan fazla istek göndermek, sunucu kaynaklarını tüketir.
p-limitile eşzamanlılığı sınırın. - Kişisel veri: GDPR kapsamında, kişisel veri içeren içerik scraping etmek özel izin gerektirir. Yalnızca herkese açık, kişisel olmayan verileri toplayın.
SERP tracking ve fiyat izleme gibi kullanım senaryoları, herkese açık verilerle çalıştığı için genellikle düşük risklidir. Ancak her durumda, hedef sitenin ToS'unu okuyun ve gerektiğinde hukuk danışmanı alın.
Key Takeaways
- got-scraping, ham got/axios'un yerini alır: Tutarlı tarayıcı başlık setleri üretir, HTTP/2 destekler ve proxy entegrasyonu yerleşiktir.
- Header-generator tek başına yeterli değildir: Residential proxy olmadan, veri merkezi IP'leri anti-bot sistemleri tarafından engellenir.
- ProxyHat gateway'i:
gate.proxyhat.com:8080(HTTP) ve:1080(SOCKS5) üzerinden, kullanıcı adında-country-XX-session-xxxflag'leri ile geo-targeting ve sticky session yapın.- Retry hook'ları:
afterResponsehook'unda 403 durum kodunu yakalayın ve yeni IP ile retry yapın — bu, IP engellemelerine karşı en etkili savunmadır.- Ölçeklendirmek için Crawlee: 100+ URL için
CheerioCrawlerkullanın; otomatik queue yönetimi, retry ve proxy rotation yerleşiktir.- Headless browser son çare: 10-25x daha yavaş ve 10-25x daha fazla RAM kullanır. Önce got-scraping deneyin.
Üretim ölçeğinde scraping için ProxyHat fiyatlandırmasını inceleyebilir ve residential proxy paketinizle başlayabilirsiniz. Yukarıdaki desenleri kullanarak, Node.js'de got-scraping proxy entegrasyonunu sağlam ve ölçeklenebilir bir şekilde kurabilirsiniz.






