[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-tr-nodejs-got-scraping-proxy-rehberi":3},{"success":4,"payload":5,"related":62,"errors":156},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":29,"noindex_google_only":29,"allow_follow":4,"published_at":30,"updated_at":30,"content_updated_at":31,"featured_image_url":32,"featured_image_alt":33,"card_image_url":34,"reading_time_minutes":35,"author":36,"categories":40,"tags":47,"alternates":48,"locale_paths":57,"views":61},176,"nodejs-got-scraping-proxy-rehberi","Node.js'de got-scraping ile Proxy Tabanlı Web Scraping Rehberi","Node.js'de got-scraping kütüphanesinin header-generator, HTTP\u002F2 ve proxy desteğini üretim ölçeğinde nasıl kullanacağınızı öğrenin. Residential proxy rotation, retry hooks ve Crawlee entegrasyonu dahil.","\u003Cp>Node.js'de got-scraping, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fapify\u002Fgot-scraping\" rel=\"noopener noreferrer\">Apify'in got tabanlı HTTP istemcisidir\u003C\u002Fa> 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, \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> üzerinden residential IP rotasyonuna, retry hook'larından Crawlee'in \u003Ccode>CheerioCrawler\u003C\u002Fcode>'ına kadar her şeyi ele alacağız.\u003C\u002Fp>\n\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Yasal uyarı:\u003C\u002Fstrong> Bu rehber yalnızca herkese açık verilerin toplanmasını ele alır. ABD'de CFAA ve AB'de \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> kapsamında, bir sitenin Hizmet Şartları'nı ihlal eden scraping eylemleri hukuki risk taşıyabilir. Her zaman \u003Ccode>robots.txt\u003C\u002Fcode> kurallarına uyun, hız sınırlarına saygı gösterin ve mümkünse resmi API'leri tercih edin.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\u003Ch2>Node.js'de got-scraping Neden Gerekli?\u003C\u002Fh2>\n\n\u003Cp>Ham \u003Ccode>got\u003C\u002Fcode> veya \u003Ccode>axios\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Cp>Bir gerçek Chrome 120 tarayıcısı, istek gönderirken şu başlık sırasını kullanır: \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>sec-ch-ua-mobile\u003C\u002Fcode>, \u003Ccode>sec-ch-ua-platform\u003C\u002Fcode>, \u003Ccode>upgrade-insecure-requests\u003C\u002Fcode>, \u003Ccode>user-agent\u003C\u002Fcode>, \u003Ccode>accept\u003C\u002Fcode>, \u003Ccode>sec-fetch-site\u003C\u002Fcode>, \u003Ccode>sec-fetch-mode\u003C\u002Fcode>, \u003Ccode>sec-fetch-user\u003C\u002Fcode>, \u003Ccode>sec-fetch-dest\u003C\u002Fcode>, \u003Ccode>accept-encoding\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode>. Sıradan bir \u003Ccode>got\u003C\u002Fcode> isteği ise \u003Ccode>accept\u003C\u002Fcode>, \u003Ccode>user-agent\u003C\u002Fcode>, \u003Ccode>accept-encoding\u003C\u002Fcode> sırasını gönderir — bu, bir Cloudflare veya Datadome bot yönetimi sisteminin isteği anında işaretlemesi için yeterlidir.\u003C\u002Fp>\n\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FGlossary\u002FForbidden_request_header\" rel=\"noopener noreferrer\">MDN'ye göre\u003C\u002Fa>, \u003Ccode>sec-ch-ua\u003C\u002Fcode> başlıkları tarayıcılar tarafından otomatik eklenir ve programatik olarak değiştirilemez. got-scraping'in \u003Ccode>header-generator\u003C\u002Fcode> 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.\u003C\u002Fp>\n\n\u003Ch3>HTTP\u002F2 Desteği ve TLS Parmak İzi\u003C\u002Fh3>\n\n\u003Cp>got-scraping, \u003Ccode>got\u003C\u002Fcode>'un HTTP\u002F2 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\u002F2 kullanır. HTTP\u002F1.1 üzerinden gelen bir istek, tarayıcı parmak izi doğru olsa bile şüpheli görünebilir. HTTP\u002F2 ayrıca tek bir TCP bağlantısında çoklu istek (multiplexing) sağlar, bu da ortalama yanıt süresini ~200ms azaltabilir.\u003C\u002Fp>\n\n\u003Ch2>got-scraping'in İdiomatik API Yüzeyi\u003C\u002Fh2>\n\n\u003Cp>got-scraping, \u003Ccode>got\u003C\u002Fcode>'u genişleterek çalışır. Temel ilkelar şunlardır:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>got.extend()\u003C\u002Fcode>\u003C\u002Fstrong> — got-scraping, \u003Ccode>got\u003C\u002Fcode>'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 \u003Ccode>.extend()\u003C\u002Fcode> yapabilirsiniz.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>useHeaderGenerator\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>true\u003C\u002Fcode> olarak ayarlandığında, her istek için tutarlı bir tarayıcı başlık seti otomatik üretilir.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>headerGeneratorOptions\u003C\u002Fcode>\u003C\u002Fstrong> — \u003Ccode>browsers\u003C\u002Fcode>, \u003Ccode>devices\u003C\u002Fcode>, \u003Ccode>operatingSystems\u003C\u002Fcode> alanlarıyla profil seçimi yaparsınız. Örneğin \u003Ccode>{ browsers: ['chrome'], devices: ['desktop'], operatingSystems: ['windows'] }\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>proxyUrl\u003C\u002Fcode>\u003C\u002Fstrong> — HTTP\u002F1 ve HTTP\u002F2 proxy'leri için standart proxy URL formatı: \u003Ccode>http:\u002F\u002Fuser:pass@host:port\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch3>Temel Yapılandırma Örneği\u003C\u002Fh3>\n\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\n\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;],\n  },\n  timeout: { request: 15000 },\n});\n\nconst response = await client.get(&apos;https:\u002F\u002Fexample.com&apos;);\nconsole.log(response.statusCode);\nconsole.log(response.headers); \u002F\u002F tutarlı sec-ch-ua seti\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Bu örnekte \u003Ccode>gotScraping.extend()\u003C\u002Fcode> ile bir istemci oluşturuyoruz. \u003Ccode>useHeaderGenerator: true\u003C\u002Fcode> sayesinde her istek, Windows masaüstü Chrome profiline uygun başlıklar alır. Başlık sırası, \u003Ccode>sec-ch-ua\u003C\u002Fcode> değerleri ve \u003Ccode>accept-language\u003C\u002Fcode> tümü birbiriyle tutarlıdır — yani bir Windows Chrome kullanıcısının mantıksal başlık setini simüle eder.\u003C\u002Fp>\n\n\u003Ch2>Residential Proxy'ler: Neden IP Adresi Önemli?\u003C\u002Fh2>\n\n\u003Cp>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. \u003Ca href=\"\u002Ftr\u002Fuse-cases\u002Fweb-scraping\">Web scraping\u003C\u002Fa> bağlamında, Cloudflare ve benzeri sistemler ASN (Autonomous System Number) veritabanları kullanarak IP'leri sınıflandırır: \u003Ccode>AS14618\u003C\u002Fcode> (Amazon AWS), \u003Ccode>AS15169\u003C\u002Fcode> (Google Cloud) gibi veri merkezi ASN'leri genellikle bot olarak işaretlenir.\u003C\u002Fp>\n\n\u003Cp>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.\u003C\u002Fp>\n\n\u003Ch3>ProxyHat Residential Proxy Entegrasyonu\u003C\u002Fh3>\n\n\u003Cp>ProxyHat'ın residential proxy ağına bağlanmak için \u003Ccode>gate.proxyhat.com\u003C\u002Fcode> gateway'ini kullanırsınız. Kimlik doğrulama, kullanıcı adı içine gömülü flag'lerle yapılır:\u003C\u002Fp>\n\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Parametre\u003C\u002Fth>\n\u003Cth>Format\u003C\u002Fth>\n\u003Cth>Örnek\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Gateway\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>gate.proxyhat.com\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>HTTP Port\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>8080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>SOCKS5 Port\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>1080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Ülke hedefleme\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>user-country-US\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>http:\u002F\u002Fuser-country-US:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Şehir hedefleme\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>http:\u002F\u002Fuser-country-DE-region-state_of_berlin-city-berlin:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Sticky session\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>user-sid-abc123\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>http:\u002F\u002Fuser-sid-abc123:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cp>\u003Ca href=\"\u002Ftr\u002Flocations\">ProxyHat lokasyonlar\u003C\u002Fa> sayfasından 90+ ülkeye erişebilirsiniz. Residential proxy'ler her istekte farklı bir IP verir (rotating mod), ancak \u003Ccode>session\u003C\u002Fcode> flag'i ile aynı IP'yi 10-30 dakika boyunca tutabilirsiniz (sticky mod).\u003C\u002Fp>\n\n\u003Ch2>Node.js'de got-scraping Proxy Rotation: Çalışan Örnek\u003C\u002Fh2>\n\n\u003Cp>Ş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:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\nimport { randomUUID } from &apos;crypto&apos;;\n\n\u002F\u002F ProxyHat kimlik bilgileri\nconst PROXYHAT_USER = &apos;your_username&apos;;\nconst PROXYHAT_PASS = &apos;your_password&apos;;\nconst GATEWAY = &apos;gate.proxyhat.com:8080&apos;;\n\n\u002F\u002F Her istek için benzersiz session ID üret\nfunction buildProxyUrl(country = &apos;US&apos;) {\n  const sessionId = randomUUID().slice(0, 8);\n  const username = `${PROXYHAT_USER}-country-${country}-sid-${sessionId}`;\n  return `http:\u002F\u002F${username}:${PROXYHAT_PASS}@${GATEWAY}`;\n}\n\n\u002F\u002F got-scraping istemcisini genişlet\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;, &apos;macos&apos;],\n  },\n  timeout: { request: 20000 },\n  retry: {\n    limit: 3,\n    statusCodes: [403, 429, 500, 502, 503],\n    backoffLimit: 5000,\n  },\n  hooks: {\n    beforeRequest: [\n      (options) =&gt; {\n        \u002F\u002F Her istek için yeni residential IP\n        options.proxyUrl = buildProxyUrl(&apos;US&apos;);\n      },\n    ],\n    afterResponse: [\n      (response, retryWithMergedOptions) =&gt; {\n        if (response.statusCode === 403) {\n          \u002F\u002F 403 = muhtemelen IP engellendi, yeni IP ile retry\n          const newProxy = buildProxyUrl(&apos;US&apos;);\n          return retryWithMergedOptions({\n            proxyUrl: newProxy,\n          });\n        }\n        return response;\n      },\n    ],\n  },\n});\n\n\u002F\u002F Kullanım\nasync function scrapePage(url) {\n  const response = await client.get(url);\n  return response.body;\n}\n\nconst html = await scrapePage(&apos;https:\u002F\u002Fexample.com&apos;);\nconsole.log(`İndirilen içerik: ${html.length} bayt`);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>Bu örnekte üç önemli mekanizma çalışır:\u003C\u002Fp>\n\n\u003Col>\n\u003Cli>\u003Ccode>beforeRequest\u003C\u002Fcode> hook — her istek öncesi yeni bir \u003Ccode>sid-xxx\u003C\u002Fcode> ID üretilir, bu da ProxyHat'tan farklı bir residential IP döndürür.\u003C\u002Fli>\n\u003Cli>\u003Ccode>retry\u003C\u002Fcode> 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.\u003C\u002Fli>\n\u003Cli>\u003Ccode>afterResponse\u003C\u002Fcode> hook — 403 alındığında, IP'nin engellendiğini varsayar ve yeni bir proxy URL'i ile retry yapar. Bu, IP rotasyonunun sadece \u003Ccode>retry\u003C\u002Fcode> mekanizmasına değil, response seviyesinde de çalışmasını sağlar.\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Ch3>SOCKS5 ile Daha Güvenli Bağlantı\u003C\u002Fh3>\n\n\u003Cp>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:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>const socksProxyUrl = `socks5:\u002F\u002F${PROXYHAT_USER}-country-DE-sid-${sessionId}:${PROXYHAT_PASS}@gate.proxyhat.com:1080`;\n\nconst response = await gotScraping({\n  url: &apos;https:\u002F\u002Fexample.com&apos;,\n  proxyUrl: socksProxyUrl,\n  useHeaderGenerator: true,\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>SOCKS5, port \u003Ccode>1080\u003C\u002Fcode> üzerinden çalışır ve özellikle yüksek güvenlik gerektiren hedeflerde daha iyi başarı oranları verebilir.\u003C\u002Fp>\n\n\u003Ch2>Üretim Desenleri: Concurrency, Cookie Jar ve Crawlee\u003C\u002Fh2>\n\n\u003Ch3>Sınırlı Eşzamanlılık (Bounded Concurrency)\u003C\u002Fh3>\n\n\u003Cp>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. \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fp-limit\" rel=\"noopener noreferrer\">p-limit\u003C\u002Fa> ile eşzamanlılık sınırı koyabilirsiniz:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import pLimit from &apos;p-limit&apos;;\n\nconst limit = pLimit(10); \u002F\u002F maksimum 10 eşzamanlı istek\n\nconst urls = [&apos;https:\u002F\u002Fexample.com\u002Fpage\u002F1&apos;, &apos;https:\u002F\u002Fexample.com\u002Fpage\u002F2&apos;, \u002F* ... *\u002F];\n\nconst results = await Promise.all(\n  urls.map(url =&gt; limit(() =&gt; scrapePage(url)))\n);\n\nconsole.log(`Toplam ${results.length} sayfa indirildi`);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>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.\u003C\u002Fp>\n\n\u003Ch3>Cookie Jar ile Oturum Sürekliliği\u003C\u002Fh3>\n\n\u003Cp>Bazı siteler, ilk ziyarette bir cookie set eder ve sonraki isteklerde bu cookie'nin varlığını kontrol eder. \u003Ccode>tough-cookie\u003C\u002Fcode> tabanlı cookie jar kullanarak bu davranışı simüle edebilirsiniz:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\nimport { CookieJar } from &apos;tough-cookie&apos;;\n\nconst cookieJar = new CookieJar();\n\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  cookieJar,\n  hooks: {\n    beforeRequest: [(opts) =&gt; { opts.proxyUrl = buildProxyUrl(&apos;US&apos;); }],\n  },\n});\n\n\u002F\u002F İlk istek cookie set eder\nawait client.get(&apos;https:\u002F\u002Fexample.com\u002Flogin&apos;);\n\u002F\u002F İkinci istek cookie&apos;yi otomatik gönderir\nawait client.get(&apos;https:\u002F\u002Fexample.com\u002Fdashboard&apos;);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Crawlee CheerioCrawler'a Geçiş\u003C\u002Fh3>\n\n\u003Cp>URL sayısı 100'ü aştığında, manuel concurrency yönetimi yetersiz kalır. \u003Ca href=\"https:\u002F\u002Fcrawlee.dev\u002F\" rel=\"noopener noreferrer\">Crawlee\u003C\u002Fa>, Apify'in scraping framework'üdür ve got-scraping'i \u003Ccode>CheerioCrawler\u003C\u002Fcode> içinde kullanır:\u003C\u002Fp>\n\n\u003Cpre>\u003Ccode>import { CheerioCrawler } from &apos;crawlee&apos;;\n\nconst crawler = new CheerioCrawler({\n  requestHandler: async ({ $, request }) =&gt; {\n    const title = $(&apos;title&apos;).text();\n    const links = $(&apos;a&apos;).map((_, el) =&gt; $(el).attr(&apos;href&apos;)).get();\n    console.log(`${request.url}: ${title} (${links.length} link)`);\n  },\n  maxConcurrency: 10,\n  maxRequestRetries: 3,\n  \u002F\u002F ProxyHat proxy&apos;leri burada da kullanılır\n  proxyConfiguration: {\n    proxyUrls: [\n      `http:\u002F\u002F${PROXYHAT_USER}-country-US-sid-s1:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,\n      `http:\u002F\u002F${PROXYHAT_USER}-country-US-sid-s2:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,\n      `http:\u002F\u002F${PROXYHAT_USER}-country-US-sid-s3:${PROXYHAT_PASS}@gate.proxyhat.com:8080`,\n    ],\n  },\n});\n\nawait crawler.run([\n  &apos;https:\u002F\u002Fexample.com\u002Fpage\u002F1&apos;,\n  &apos;https:\u002F\u002Fexample.com\u002Fpage\u002F2&apos;,\n  &apos;https:\u002F\u002Fexample.com\u002Fpage\u002F3&apos;,\n]);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>CheerioCrawler, got-scraping'in \u003Ccode>useHeaderGenerator\u003C\u002Fcode> özelliğini varsayılan olarak etkinleştirir. Proxy rotation, \u003Ccode>proxyConfiguration\u003C\u002Fcode> üzerinden otomatik yapılır — her istek farklı bir proxy URL'i seçilir. Daha fazla bilgi için \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">ProxyHat dokümantasyonunu\u003C\u002Fa> inceleyin.\u003C\u002Fp>\n\n\u003Ch2>Headless Browser Ne Zaman Kaçınılmaz?\u003C\u002Fh2>\n\n\u003Cp>got-scraping, statik HTML içeriği için mükemmeldir. Ancak şu senaryolarda headless browser (Playwright, Puppeteer) gerekir:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>JavaScript rendering: İçerik, istemci tarafında React\u002FVue\u002FAngular ile render ediliyorsa, ham HTML boş gelir.\u003C\u002Fli>\n\u003Cli>Cloudflare challenge: Bazı Cloudflare korumalı siteleri, JS challenge'ı çözmek için gerçek bir tarayıcı motoru gerektirir.\u003C\u002Fli>\n\u003Cli>İnteraktif akışlar: Buton tıklama, form doldurma, scroll ile lazy loading tetikleme.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>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.\u003C\u002Fp>\n\n\u003Ch2>Etiğe Dair Notlar\u003C\u002Fh2>\n\n\u003Cp>Scraping yapmadan önce şu soruları sorun:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>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.\u003C\u002Fli>\n\u003Cli>\u003Ccode>robots.txt\u003C\u002Fcode> ne diyor? \u003Ccode>https:\u002F\u002Fexample.com\u002Frobots.txt\u003C\u002Fcode> dosyası, hangi yolların crawl edilebileceğini belirtir. Bu kurallara uymak zorunlu olmasa da, etik bir uygulamadır.\u003C\u002Fli>\n\u003Cli>Hız limiti: Hedef sunucuya saniyede 10'dan fazla istek göndermek, sunucu kaynaklarını tüketir. \u003Ccode>p-limit\u003C\u002Fcode> ile eşzamanlılığı sınırın.\u003C\u002Fli>\n\u003Cli>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.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>\u003Ca href=\"\u002Ftr\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa> 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.\u003C\u002Fp>\n\n\u003Ch2>Key Takeaways\u003C\u002Fh2>\n\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>got-scraping, ham got\u002Faxios'un yerini alır: Tutarlı tarayıcı başlık setleri üretir, HTTP\u002F2 destekler ve proxy entegrasyonu yerleşiktir.\u003C\u002Fli>\n\u003Cli>Header-generator tek başına yeterli değildir: Residential proxy olmadan, veri merkezi IP'leri anti-bot sistemleri tarafından engellenir.\u003C\u002Fli>\n\u003Cli>ProxyHat gateway'i: \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> (HTTP) ve \u003Ccode>:1080\u003C\u002Fcode> (SOCKS5) üzerinden, kullanıcı adında \u003Ccode>-country-XX-sid-xxx\u003C\u002Fcode> flag'leri ile geo-targeting ve sticky session yapın.\u003C\u002Fli>\n\u003Cli>Retry hook'ları: \u003Ccode>afterResponse\u003C\u002Fcode> hook'unda 403 durum kodunu yakalayın ve yeni IP ile retry yapın — bu, IP engellemelerine karşı en etkili savunmadır.\u003C\u002Fli>\n\u003Cli>Ölçeklendirmek için Crawlee: 100+ URL için \u003Ccode>CheerioCrawler\u003C\u002Fcode> kullanın; otomatik queue yönetimi, retry ve proxy rotation yerleşiktir.\u003C\u002Fli>\n\u003Cli>Headless browser son çare: 10-25x daha yavaş ve 10-25x daha fazla RAM kullanır. Önce got-scraping deneyin.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\n\u003Cp>Üretim ölçeğinde scraping için \u003Ca href=\"\u002Ftr\u002Fpricing\">ProxyHat fiyatlandırmasını\u003C\u002Fa> 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.\u003C\u002Fp>","Node.js'de got-scraping Proxy Rehberi | ProxyHat","Node.js'de got-scraping ile residential proxy rotation, header-generator ve retry hook'ları. Üretim ölçeğinde web scraping için tam rehber.","\u002Ftr\u002Fblog\u002Fnodejs-got-scraping-proxy-rehberi",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-og.webp",[17,20,23,26],{"question":18,"answer":19},"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\u002F2 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.",{"question":21,"answer":22},"got-scraping proxy kullanıcıları için neden önemlidir?","got-scraping, header-generator ile tutarlı tarayıcı başlıkları üretir ve HTTP\u002F2 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.",{"question":24,"answer":25},"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.",{"question":27,"answer":28},"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.",false,"2026-08-04T16:05:06+00:00","2026-10-03T08:57:49+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fnodejs-got-scraping-proxy-rehberi-card.webp",12,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[41],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},4,"gelistirici-rehberleri","Geliştirici Rehberleri","Geliştirici Rehberleri | ProxyHat Blog","Proxy entegrasyonu için kod eğitimleri ve SDK rehberleri.",[],{"it":49,"ru":50,"en":51,"zh":52,"fr":53,"pl":54,"ko":55,"ja":56,"x-default":51},"\u002Fit\u002Fblog\u002Fguida-got-scraping-nodejs-proxy","\u002Fru\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fcn\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Ffr\u002Fblog\u002Fgot-scraping-nodejs-proxy-residentiel-1","\u002Fpl\u002Fblog\u002Fgot-scraping-nodejs-proxy","\u002Fko\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide-1","\u002Fja\u002Fblog\u002Fgot-scraping-nodejs-purokishi",{"it":49,"ru":50,"de":58,"es":59,"en":51,"pt":60,"zh":52,"fr":53,"pl":54,"ko":55,"ja":56,"tr":13},"\u002Fde\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Fes\u002Fblog\u002Fguia-got-scraping-nodejs-proxy-residencial","\u002Fpt\u002Fblog\u002Fguia-got-scraping-nodejs-proxies-residenciais",121,[63,97,124,140],{"id":64,"slug":65,"title":66,"excerpt":67,"featured_image_url":68,"featured_image_alt":69,"card_image_url":70,"og_image_url":71,"published_at":72,"updated_at":73,"content_updated_at":74,"reading_time_minutes":75,"is_featured":29,"indexable":4,"views":76,"author":77,"categories":78,"tags":80},210,"ai-ajanlari-icin-proxy-kurulumu","AI Ajanları için Proxy Kurulumu: browser-use, Crawl4AI ve MCP","Bulut VM'lerindeki ajanlar internete datacenter IP'lerinden çıkar. browser-use, Crawl4AI ve bir MCP sunucusu için güncel, çalışan proxy yapılandırmalarını; sticky ve rotasyon için bir karar tablosunu ve kaçınılması gereken maliyet tuzaklarını derledik.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-master.webp","Proxy Setup for AI Agents: browser-use, Crawl4AI and an MCP Server","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fai-ajanlari-icin-proxy-kurulumu-og.webp","2026-10-24T09:00:00+00:00","2026-10-24T09:00:20+00:00","2026-10-03T09:41:40+00:00",14,15,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[79],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[81,85,89,93],{"id":82,"slug":83,"name":84},1,"web-scraping","Web Scraping",{"id":86,"slug":87,"name":88},2,"residential-proxy","Residential Proxy",{"id":90,"slug":91,"name":92},9,"python","Python",{"id":94,"slug":95,"name":96},22,"playwright","Playwright",{"id":98,"slug":99,"title":100,"excerpt":101,"featured_image_url":102,"featured_image_alt":103,"card_image_url":104,"og_image_url":105,"published_at":106,"updated_at":107,"content_updated_at":74,"reading_time_minutes":75,"is_featured":29,"indexable":4,"views":108,"author":109,"categories":110,"tags":112},206,"camoufox-residential-proxy-python-rehberi","Camoufox ve Residential Proxy: Kod Odaklı Python Rehberi","C++ düzeyinde yamalanmış Firefox olan Camoufox'u residential proxy arkasında çalıştırma: güncel Python API'si, geoip'in neden sabit oturum gerektirdiği, parmak izi tutarlılık listesi ve Patchright ya da nodriver'ın ne zaman daha uygun olduğu.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-master.webp","Camoufox with Residential Proxies: A Code-First Python Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcamoufox-residential-proxy-python-rehberi-og.webp","2026-10-13T09:00:00+00:00","2026-10-13T09:00:22+00:00",31,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[111],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[113,114,115,119,120],{"id":82,"slug":83,"name":84},{"id":86,"slug":87,"name":88},{"id":116,"slug":117,"name":118},6,"anti-tespit","Anti-Tespit",{"id":90,"slug":91,"name":92},{"id":121,"slug":122,"name":123},21,"headless-tarayici","Headless Tarayıcı",{"id":125,"slug":126,"title":127,"excerpt":128,"featured_image_url":129,"featured_image_alt":130,"card_image_url":131,"og_image_url":132,"published_at":133,"updated_at":133,"content_updated_at":134,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":135,"author":136,"categories":137,"tags":139},175,"colly-doner-proxy-rehberi","Colly'de Döner Proxy Kullanımı: Go ile Üretim Seviyesinde Web Scraping","Go'nun Colly çerçevesinde döner proxy'leri idiomatik şekilde nasıl entegre edeceğinizi öğrenin. Collector modeli, RoundRobinProxySwitcher, residential IP rotasyonu ve üretim desenlerini kapsayan geliştirici odaklı rehber.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fcolly-doner-proxy-rehberi-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T08:57:48+00:00",71,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[138],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":141,"slug":142,"title":143,"excerpt":144,"featured_image_url":145,"featured_image_alt":146,"card_image_url":147,"og_image_url":148,"published_at":149,"updated_at":149,"content_updated_at":150,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":151,"author":152,"categories":153,"tags":155},195,"bybit-v5-market-api-dondurulen-proxy","Döndürülen Proxy'lerle Bybit V5 Market API Nasıl Scrape Edilir","Bybit V5 Market API'sini döndürülen residential proxy'lerle scrape etmek için tam rehber: orderbook, tickers, kline uç noktaları, rate limit yönetimi, geo-block aşımı ve ProxyHat entegrasyonu ile çalışan kod örnekleri.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Ftr\u002Fbybit-v5-market-api-dondurulen-proxy-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T02:43:17+00:00",87,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[154],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],[]]