Node.js'de scraping yaparken got veya axios ile ilk birkaç istek başarılı olur, sonra aniden 403 veya 429 hataları yağmaya başlar. Sorun genellikle kodunuzda değil; tarayıcı gibi görünmeyen bir HTTP istemcisinin, Cloudflare veya Akamai gibi WAF'lar tarafından kolayca tanınmasındadır. İşte Node.js'de got-scraping tam bu noktada devreye girer: Apify'ın got tabanlı bu kütüphanesi, tutarlı tarayıcı header setleri üretir, HTTP/2 destekler ve proxy yönlendirmesini first-class bir özellik olarak sunar.
Bu rehber, got-scraping'i ProxyHat residential proxy'leriyle nasıl entegre edeceğinizi, header generator'ın nasıl çalıştığını ve üretim ortamında ölçeklenirken hangi tuzaklara düşeceğinizi ele alır. Yalnızca herkese açık verilerle çalışın; FTC'nin veri gizliliği yönergelerini ve GDPR kapsamındaki yükümlülükleri unutmayın; robots.txt ve sitelerin kullanım şartlarını mutlaka dikkate alın.
Node.js'de got-scraping Neden Gereklidir?
Ham got veya axios istekleri, modern anti-bot sistemlerinin çoğunda hızla işaretlenir. Bunun üç temel nedeni vardır:
- Header tutarsızlığı:
User-AgentChrome 120 diyor amasec-ch-uaChrome 119 değerleri içeriyor. İnsan tarayıcıları bu tür çelişkiler göndermez; botlar gönderir. - Header sırası: HTTP/2'de header sırası şifrelenmiş olsa da, bazı CDN'ler HPACK sıkıştırma desenlerinden parmak izi çıkarır. Gerçek tarayıcılar belirli bir header sırası kullanır.
- TLS parmak izi (JA3/JA4): Node.js'in TLS yığını, Chrome veya Firefox'tan farklı bir ClientHello üretir. Bu, header'lar mükemmel olsa bile istemciyi ele verebilir.
got-scraping, ilk iki sorunu çözmek için header-generator adlı bir bileşen kullanır. Bu bileşen, gerçek tarayıcı profillerinden üretilen tutarlı header setleri çıkarır: accept, accept-encoding, accept-language, sec-ch-ua, sec-fetch-* ve daha fazlası, tek bir tarayıcıya ait olacak şekilde birlikte oluşturulur. HTTP/2 desteği sayesinde, modern sitelere yapılan istekler tek bir TCP bağlantısı üzerinden multiplexed gönderilir ve bu, hem performansı artırır hem de istemci davranışını gerçek tarayıcıya yaklaştırır.
got-scraping,got'un üzerine yazılmış bir wrapper'dır;got.extend()ile genişletilmiş bir istemci döndürür. Bu nedenle tümgotopsiyonları ve hook'ları geçerlidir.
got-scraping'in İdiomatik API Yüzeyi
got-scraping'in gücü, got.extend() üzerine kurulu olmasıdır. Kütüphane, birkaç eklenti ve seçenekle birlikte gelir:
useHeaderGenerator ve headerGeneratorOptions
useHeaderGenerator bayrağı true olduğunda, got-scraping her istek için header-generator kullanarak tutarlı bir header seti üretir. headerGeneratorOptions ile bu setin tarayıcı, işletim sistemi ve cihaz profilini daraltabilirsiniz:
import { gotScraping } from 'got-scraping';
const client = gotScraping.extend({
useHeaderGenerator: true,
headerGeneratorOptions: {
browsers: ['chrome'],
operatingSystems: ['windows', 'macos'],
devices: ['desktop'],
locales: ['en-US', 'de-DE'],
httpVersion: '2',
},
retry: { limit: 3 },
timeout: { request: 15000 },
});
const res = await client.get('https://example.com');
console.log(res.statusCode, res.headers['content-type']);
Bu örnekte header-generator, Chrome'un Windows veya macOS masaüstü sürümlerine özgü header'lar üretir. httpVersion: '2' ile HTTP/2 kullanılır; bu, header'ların HTTP/2 spesifikasyonuna uygun şekilde (küçük harfli, pseudo-header'lar dahil) gönderilmesini sağlar. MDN'in sec-ch-ua dokümantasyonuna göre bu başlık, Chrome'un client hint'lerinin merkezidir ve tutarlı bir tarayıcı profili için kritik öneme sahiptir.
proxyUrl Opsiyonu
got-scraping, hem HTTP/1.1 hem de HTTP/2 proxy'leri destekler. proxyUrl opsiyonu, http:// veya socks5:// şemalı bir URL kabul eder:
const res = await gotScraping.get('https://example.com', {
proxyUrl: 'http://user-country-DE:pass@gate.proxyhat.com:8080',
useHeaderGenerator: true,
});
Proxy URL'i, kullanıcının kullanıcı adına gömülen geo-targeting ve session flag'leriyle birlikte gelir. Bu, ProxyHat'ın residential proxy altyapısını got-scraping ile entegre etmenin en doğal yoludur.
Residential Proxy'ler Neden Kritik Hale Gelir
Header'lar ve TLS parmak izi ne kadar gerçekçi olursa olsun, istek bir veri merkezi IP'sinden geliyorsa birçok site bunu yine de engeller. Veri merkezi IP blokları (RFC 1918 ve benzeri aralıklar) genellikle ASN veritabanlarında "hosting" veya "cloud" olarak etiketlidir ve bu, bot trafiğinin tipik kaynağıdır.
Residential proxy'ler, gerçek İSS'lere ait IP'lerden trafiği yönlendirir. ProxyHat'ın residential ağı, 99.9% uptime hedefiyle çalışır ve 1500+ eşzamanlı oturum kapasitesi sunar. Bu, header-generator'ın ürettiği gerçekçi tarayıcı profili ile birleştiğinde, isteklerin gerçek bir kullanıcıdan ayırt edilmesini son derece zorlaştırır.
| Proxy Tipi | IP Kaynağı | Tespit Zorluğu | h>Başarılı İstek Oranı (Tahmini)Maliyet | |
|---|---|---|---|---|
| Datacenter | Bulut/hosting sağlayıcıları | Kolay (ASN tabanlı) | %40–60 | Düşük |
| Residential | Gerçek İSS atamaları | Zor | %85–95 | Orta |
| Mobile | Mobil operatör IP'leri | Çok zor | %90–98 | Yüksek |
SOCKS5 Üzerinden Port 1080
Bazı hedef siteler yalnızca HTTPS üzerinden çalışır ve bazı ağ ortamları HTTP CONNECT proxy'lerini kısıtlar. Bu durumda SOCKS5 kullanabilirsiniz:
const res = await gotScraping.get('https://example.com', {
proxyUrl: 'socks5://user-country-US:pass@gate.proxyhat.com:1080',
useHeaderGenerator: true,
});
SOCKS5, daha düşük ek yük ve daha geniş protokol desteği sunar. ProxyHat'ın gate.proxyhat.com:1080 endpoint'i, HTTP proxy portundan bağımsız olarak aynı residential havuza erişim sağlar.
ProxyHat ile Dönen Residential Endpoint'ler: Çalışan Örnek
Aşağıdaki örnek, ProxyHat residential proxy'leri üzerinden her istek için yeni bir oturum kimliği üretir. Bu, "sticky session" yerine per-request rotation sağlar; ancak ProxyHat'ın kullanıcı adındaki session flag'i ile belirli bir IP'ye sabitlenebilirsiniz.
import { gotScraping } from 'got-scraping';
import { randomUUID } from 'crypto';
const PROXYHAT_GATE = 'gate.proxyhat.com';
const PROXYHAT_PORT = 8080;
const PROXYHAT_USER = 'myuser';
const PROXYHAT_PASS = 'mypass';
function buildProxyUrl(country = 'US', session = null) {
const sid = session || randomUUID().slice(0, 8);
const username = `${PROXYHAT_USER}-country-${country}-session-${sid}`;
return `http://${username}:${PROXYHAT_PASS}@${PROXYHAT_GATE}:${PROXYHAT_PORT}`;
}
const client = gotScraping.extend({
useHeaderGenerator: true,
headerGeneratorOptions: {
browsers: ['chrome'],
operatingSystems: ['windows', 'macos'],
devices: ['desktop'],
httpVersion: '2',
},
retry: {
limit: 4,
statusCodes: [403, 429, 500, 502, 503],
backoffLimit: 5000,
},
hooks: {
beforeRequest: [
(options) => {
// Her istek için yeni bir residential endpoint seç
options.proxyUrl = buildProxyUrl('US');
},
],
afterResponse: [
(response, retryWithMergedOptions) => {
if (response.statusCode === 403) {
// IP engellenmiş olabilir; yeni proxy ile yeniden dene
return retryWithMergedOptions({
proxyUrl: buildProxyUrl('US'),
});
}
return response;
},
],
},
});
async function scrape(urls) {
const results = [];
for (const url of urls) {
try {
const res = await client.get(url, { timeout: { request: 15000 } });
results.push({ url, status: res.statusCode, length: res.body.length });
} catch (err) {
results.push({ url, error: err.message });
}
}
return results;
}
const urls = [
'https://example.com/page-1',
'https://example.com/page-2',
'https://example.com/page-3',
];
const out = await scrape(urls);
console.table(out);
Bu örnekte dikkat etmeniz gereken birkaç nokta:
beforeRequesthook'u, her istek için yeni birproxyUrlatar; böylece IP rotasyonu otomatikleşir.afterResponsehook'u, 403 yanıtı alındığında yeni bir proxy ile yeniden dener; bu, engellenmiş IP'lerin atılmasını sağlar.retryopsiyonu,got'un yerel yeniden deneme mekanizmasını kullanır;backoffLimit: 5000ile maksimum 5 saniyelik geri çekilme süresi belirlenir.
Daha fazla ülke konumu için ProxyHat lokasyonlar sayfasını inceleyebilirsiniz. Fiyatlandırma detayları için ProxyHat fiyatlandırma sayfasına bakın.
Üretim Desenleri: Retry, Concurrency, Cookie Jar ve Crawlee
Retry ve afterResponse Hook'ları
got'un hook sistemi, got-scraping'de de tam olarak çalışır. beforeRequest, beforeRedirect, afterResponse ve beforeError hook'ları ile istek yaşam döngüsünün her aşamasına müdahale edebilirsiniz. Özellikle afterResponse, 403/429 yanıtlarında proxy değişikliği yapmak için idealdir.
Bounded Concurrency ile p-limit
Binlerce URL'i paralel olarak kazımak istediğinizde, sınırsız eşzamanlılık hem yerel makinenizi hem de hedef siteyi zorlar. p-limit paketi ile eşzamanlı istek sayısını sınırlayın:
import pLimit from 'p-limit';
const limit = pLimit(20); // Aynı anda en fazla 20 istek
async function scrapeBatch(urls) {
const tasks = urls.map((url) =>
limit(() => client.get(url).then(
(res) => ({ url, status: res.statusCode }),
(err) => ({ url, error: err.message })
))
);
return Promise.all(tasks);
}
20 eşzamanlı istek, tipik bir residential proxy kurulumu için iyi bir başlangıç noktasıdır. Daha agresif değerler, ProxyHat hesabınızın oturum limitine ve hedef sitenin rate limit'ine bağlı olarak ayarlanmalıdır.
Cookie Jar Kullanımı
Bazı siteler, oturum tanımlama bilgilerini (cookie) ilk yanıtta ayarlar ve sonraki isteklerde bunları bekler. got'un yerleşik cookieJar opsiyonu ile bunu yönetebilirsiniz:
import { gotScraping } from 'got-scraping';
import { CookieJar } from 'tough-cookie';
const cookieJar = new CookieJar();
const client = gotScraping.extend({
useHeaderGenerator: true,
cookieJar,
proxyUrl: 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080',
});
// İlk istek cookie ayarlar, ikinci istek otomatik olarak gönderir
await client.get('https://example.com/login');
await client.get('https://example.com/dashboard');
Sticky session ile birlikte cookie jar kullanmak, oturum tabanlı sitelerde tutarlılık sağlar.
Crawlee'nin CheerioCrawler'ına Geçiş
Proje büyüdükçe, URL kuyruğu yönetimi, deduplication ve hata işleme karmaşıklaşır. Crawlee, got-scraping'in üzerine inşa edilmiş bir framework'tür ve CheerioCrawler ile HTML kazıma için tam bir pipeline sunar:
import { CheerioCrawler } from 'crawlee';
const crawler = new CheerioCrawler({
requestHandler: async ({ $, request }) => {
const title = $('title').text();
console.log(request.url, title);
},
maxConcurrency: 20,
useHeaderGenerator: true,
proxyConfiguration: {
newUrlFunction: () =>
`http://user-country-US-session-${randomUUID().slice(0,8)}:pass@gate.proxyhat.com:8080`,
},
});
await crawler.run(['https://example.com/page-1', 'https://example.com/page-2']);
CheerioCrawler, got-scraping'in tüm yeteneklerini miras alır ve üstüne request queue, retry logic ve otomatik enstrümantasyon ekler. Daha fazla scraping kullan örneği için web scraping kullanım sayfamıza veya SERP izleme için SERP tracking sayfamıza bakın.
Headless Browser Ne Zaman Kaçınılmazdır?
got-scraping, HTTP düzeyinde mükemmel bir araçtır; ancak bazı siteler içeriği yalnızca JavaScript çalıştıktan sonra render eder. Eğer hedef sitenin HTML kaynağında veri yoksa ve bir API endpoint'i de bulunamıyorsa, headless browser (Playwright veya Puppeteer) kaçınılmaz olur. Bu durumda bile, residential proxy kullanımı aynı şekilde geçerlidir; Playwright'ın proxy opsiyonu ile ProxyHat endpoint'ini doğrudan tarayıcıya bağlayabilirsiniz.
Ancak headless browser, HTTP istemcisinden 10–20 kat daha yavaştır ve daha fazla bellek tüketir. Mümkün olduğunda got-scraping ile HTTP düzeyinde kazıyın; yalnızca gerçekten gerekli olduğunda browser'a geçin.
Etik ve Yasal Açıklama
Bu rehber, yalnızca herkese açık verilerin toplanması içindir. Amerika'da CFAA ve Avrupa'da GDPR, erişim yetkisi olmayan verilere ulaşmayı veya kişisel verileri izinsiz işlemeyi yasaklar. Aşağıdaki kurallara uyun:
- robots.txt'i honor edin: Bir sitenin robots.txt dosyası, hangi yolların taranabileceğini belirtir.
- Rate limit'lere saygı gösterin: Saniyede yüzlerce istek göndermek, hem hedef sunucuya zarar verebilir hem de yasal soruna yol açabilir.
- Resmi API'leri tercih edin: Bir sitenin public API'si varsa, scraping yerine onu kullanın.
- Kişisel verileri işlemeyin: GDPR kapsamında, kişisel verilerin toplanması açık rıza gerektirir.
ProxyHat, dokümantasyonunda proxy kullanımına ilişkin ek yönergeler sunar.
Key Takeaways
- got-scraping,
gotüzerine kuruludur; header-generator ile tutarlı tarayıcı profilleri üretir ve HTTP/2 destekler.useHeaderGenerator+headerGeneratorOptionsile tarayıcı, işletim sistemi ve cihaz profilini daraltın.- Residential proxy'ler, header ve TLS ne kadar gerçekçi olursa olsun, veri merkezi IP engellemelerini aşmak için gereklidir.
beforeRequestveafterResponsehook'ları ile proxy rotasyonunu istek yaşam döngüsüne yerleştirin.p-limitile bounded concurrency,cookieJarile oturum tutarlılığı sağlayın.- Proje büyüdüğünde Crawlee'nin
CheerioCrawler'ına geçin; got-scraping yeteneklerini miras alır.- Headless browser yalnızca JS-rendered içerik için son çare olsun; 10–20 kat daha maliyetlidir.
- Herkese açık verilerle çalışın, robots.txt ve rate limit'lere uyun, resmi API'leri tercih edin.
Node.js'de got-scraping ile ProxyHat residential proxy'lerini birleştirmek, ölçeklenebilir ve engellemeye dayanıklı bir veri kazıma pipeline'ı kurmanın en verimli yollarından biridir. Yukarıdaki örnekleri kendi projenize uyarlayarak başlayın ve ProxyHat fiyatlandırma seçeneklerini inceleyerek ihtiyacınıza uygun planı seçin.






