Node.js'de got-scraping ile Proxy Tabanlı Web Scraping Rehberi

Node.js'de got-scraping kütüphanesinin header-generator, HTTP/2 ve proxy desteğini üretim ölçeğinde nasıl kullanacağınızı öğrenin. Residential proxy rotation, retry hooks ve Crawlee entegrasyonu dahil.

got-scraping in Node.js: A Developer's Guide with Residential Proxies
Bu makalede

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.txt kuralları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.
  • useHeaderGeneratortrue olarak ayarlandığında, her istek için tutarlı bir tarayıcı başlık seti otomatik üretilir.
  • headerGeneratorOptionsbrowsers, devices, operatingSystems alanları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:

  1. beforeRequest hook — her istek öncesi yeni bir session-xxx ID üretilir, bu da ProxyHat'tan farklı bir residential IP döndürür.
  2. retry yapı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.
  3. afterResponse hook — 403 alındığında, IP'nin engellendiğini varsayar ve yeni bir proxy URL'i ile retry yapar. Bu, IP rotasyonunun sadece retry mekanizması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.

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.

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.txt ne diyor? https://example.com/robots.txt dosyası, 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-limit ile 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-xxx flag'leri ile geo-targeting ve sticky session yapın.
  • Retry hook'ları: afterResponse hook'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 CheerioCrawler kullanı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.

Sık sorulan sorular

Node.js'de got-scraping nedir?

got-scraping, Apify tarafından geliştirilen ve got HTTP istemcisini genişleten bir Node.js kütüphanesidir. header-generator modülü ile tutarlı tarayıcı başlık setleri üretir, HTTP/2 destekler ve proxyUrl seçeneği ile proxy entegrasyonu sağlar. Ham got veya axios isteklerinin aksine, modern anti-bot sistemlerine karşı gerçekçi bir tarayıcı parmak izi simüle eder.

got-scraping proxy kullanıcıları için neden önemlidir?

got-scraping, header-generator ile tutarlı tarayıcı başlıkları üretir ve HTTP/2 kullanır, ancak IP adresi hala veri merkezi bloğundan geliyorsa anti-bot sistemleri isteği engelleyebilir. Residential proxy entegrasyonu, gerçekçi başlıklar + gerçek İSS IP adresi kombinasyonunu sağlar ve bu ikili, Cloudflare, Datadome gibi sistemleri aşmak için gereken iki temel bileşendir.

got-scraping için hangi proxy tipi en iyisidir?

Residential proxy'ler, got-scraping ile en iyi sonuçları verir çünkü gerçek İSS'lere ait IP adresleri kullanır ve gerçek kullanıcı trafiğinden ayırt edilemez. Datacenter proxy'ler daha hızlı ve ucuzdur ancak ASN veritabanları tarafından kolayca tespit edilir. Mobile proxy'ler en yüksek güven seviyesine sahiptir ancak maliyetleri daha yüksektir. Çoğu scraping senaryosu için residential proxy'ler en iyi dengeyi sunar.

got-scraping ile engellenmeyi nasıl önlersiniz?

Dört temel strateji vardır: (1) useHeaderGenerator ile tutarlı tarayıcı başlık setleri kullanın; (2) her istek için farklı residential IP kullanın — ProxyHat'ta session flag ile sticky session veya rotating mod; (3) afterResponse hook'unda 403 durum kodunu yakalayın ve yeni IP ile retry yapın; (4) p-limit ile eşzamanlılığı 10-20 civarında sınırlayın ve hedef sitenin rate limit'ini aşmayın.

Başlamaya hazır mısınız?

148'den fazla ülkede residential, ISP ve mobil proxy'ler. Ücretsiz hesap oluşturun.

Ücretsiz hesap oluştur
← Bloga Dön