Rehber · Güncelleme 2026-11-02

Node.js ile Rotating Proxy: axios, fetch ve Puppeteer

Node.js ile rotating proxy: axios’ta agent yolu, undici ProxyAgent ile fetch, Puppeteer’da page.authenticate, rotasyon doğrulama deneyi ve hata listesi.

Node.js ile Rotating Proxy: axios, fetch ve Puppeteer

Node.js ile rotating proxy: üç istemci, tek gateway

Node.js ile rotating proxy kullanmak için panelden aldığınız host, port, kullanıcı adı ve şifreyi http://kullanici:sifre@host:port biçiminde tek bir adrese çevirir, bu adresi kullandığınız HTTP istemcisine verirsiniz. Çıkış IP’sini her istekte gateway seçer; kodunuzun işi isteği doğru istemciyle, doğru ayarlarla göndermektir. Zor kısım, Node ekosisteminde üç ayrı istemci ailesinin proxy’yi üç farklı yoldan almasıdır.

axios, proxy bilgisini ya kendi proxy seçeneğiyle ya da bir agent nesnesiyle alır. Node 18 ve sonrasındaki yerleşik fetch ise undici kütüphanesi üzerine kuruludur ve proxy’yi dispatcher adı verilen bir nesneyle tanır. Puppeteer tarayıcıyı başlatırken komut satırı argümanıyla proxy alır, kimlik bilgisini ise sayfa düzeyinde ayrı bir çağrıyla ister. Üçünde de yanlış katmana yazılan ayar sessizce yok sayılır ve istek kendi IP’nizden çıkar; ayarı yaptıktan sonra çıkış IP’sini mutlaka ölçün.

Örnekler RotatingProxy kataloğundaki beş ürünle çalışır; beşi de HTTP, HTTPS ve SOCKS5 kabul eder. IPv4 datacenter, IPv4 residential ve mobile ürünler GB bazlı, IPv6 ürünler port bazlı satılır; kod tarafında bu fark yalnız kota ölçümünü etkiler, bağlantı biçimini değiştirmez. Kimlik bilgisi koda yazılmaz: örneklerde process.env.PROXY_URL okunur, şifrede @ ya da : varsa encodeURIComponent ile kaçırılır.

axios: yerleşik proxy seçeneği mi, agent mı?

axios’un kendi proxy seçeneği şu biçimdedir: axios.get(url, { proxy: { protocol: "http", host, port, auth: { username, password } } }). HTTP hedeflerde sorunsuz çalışır. HTTPS hedeflerde ise bu seçenek sürüme göre tutarsız davranır; isteğin proxy’ye CONNECT tüneliyle değil düz HTTP isteği gibi gittiği durumlar görülür ve sonuç bazen hata, bazen sertifika uyarısıdır. Kütüphane sahiplerinin ve topluluğun yıllardır verdiği cevap aynıdır: HTTPS için agent yolunu kullanın.

Agent yolu iki paketle kurulur: npm install axios https-proxy-agent. Kod şöyledir: import { HttpsProxyAgent } from "https-proxy-agent"; const agent = new HttpsProxyAgent(process.env.PROXY_URL); const client = axios.create({ httpsAgent: agent, httpAgent: agent, proxy: false, timeout: 30000 }). Buradaki proxy: false satırı atlanırsa axios ortam değişkenlerinden proxy okumaya çalışır ve agent ile çakışır; iki yoldan yalnız biri açık kalmalıdır.

axios.create ile üretilen istemci sonraki tüm çağrılarda aynı agent’ı taşır. Çok adımlı bir akış (giriş, filtre, sayfalama) için bir istemci, bağımsız sayfa taraması için ayrı bir istemci açmak, oturum kimlikli ve kimliksiz proxy adreslerini karıştırmamanın en kolay yoludur. SOCKS5 gerekirse paket değişir: npm install socks-proxy-agent, ardından new SocksProxyAgent("socks5://kullanici:sifre@host:port") aynı httpsAgent alanına verilir.

fetch ve undici: dispatcher mantığı

Node 18 ve sonrasında fetch yerleşiktir, ama proxy ayarı almaz; ortam değişkenlerini de varsayılan olarak okumaz. Proxy için undici paketinin ProxyAgent sınıfı kullanılır: npm install undici; import { ProxyAgent, fetch } from "undici"; const agent = new ProxyAgent(process.env.PROXY_URL); const r = await fetch("https://hedef.site/urun/1", { dispatcher: agent, signal: AbortSignal.timeout(30000) }). ProxyAgent adresteki kullanıcı adı ve şifreyi kendisi ayrıştırır ve HTTPS hedefler için CONNECT tünelini kendisi kurar.

Aynı agent’ı her çağrıda yazmamak için setGlobalDispatcher(agent) çağrılır; bundan sonra undici’den içe aktarılan fetch proxy üzerinden gider. Dikkat edilecek nokta, bu ayarın npm’den kurulan undici paketini bağlamasıdır; Node’un kendi yerleşik fetch’i ayrı bir undici kopyası taşır. Karışıklığı önlemek için ya fetch’i de undici’den içe aktarın ya da dispatcher’ı her çağrıda açıkça verin. Yeni Node sürümlerinde ortam değişkenlerinden proxy okuyan deneysel bir anahtar var; kullanmadan önce kendi sürümünüzün belgesinden doğrulayın.

undici SOCKS desteklemez; SOCKS5 zorunluysa axios ve socks-proxy-agent çiftine dönün ya da ürünün HTTP uç noktasını kullanın. Eşzamanlılık için ProxyAgent’a bağlantı sınırı verilebilir: new ProxyAgent({ uri: process.env.PROXY_URL, connections: 20 }). Sınırsız Promise.all hem hedefi hem kendi kotanızı gereksiz zorlar; 20 civarı bir başlangıç değeri çoğu iş için yeterlidir ve hata oranı izlenerek artırılır.

Puppeteer: tarayıcı başına proxy, sayfa başına kimlik

Puppeteer’da proxy tarayıcı başlatılırken verilir: const browser = await puppeteer.launch({ args: ["--proxy-server=http://host:port"] }). Chromium bu argümanda kullanıcı adı ve şifre kabul etmez; kimlik bilgisi sayfa açıldıktan sonra ayrı verilir: const page = await browser.newPage(); await page.authenticate({ username, password }). authenticate çağrısı goto’dan önce yapılmalıdır, yoksa ilk istek 407 ile döner ve sayfa boş kalır.

Tek tarayıcı tek proxy adresi taşır; bu, rotating gateway ile sorun değildir, çünkü IP’yi adres değil gateway değiştirir. Her sekmede farklı ülke ya da farklı oturum kimliği gerekiyorsa tarayıcı bağlamı kullanılır: const ctx = await browser.createBrowserContext({ proxyServer: "http://host:port" }); const page = await ctx.newPage(); await page.authenticate(...). Eski sürümlerde aynı seçenek createIncognitoBrowserContext adıyla bulunur. Bağlam başına ayrı proxy adresi ya da oturum kimliği verilerek aynı tarayıcıda iki ayrı IP davranışı elde edilir.

Tarayıcı, bir sayfa için onlarca alt istek açar ve hepsi kotadan düşer. GB bazlı üründe sayfa başına tüketimi düşürmek için page.setRequestInterception(true) ile görsel, yazı tipi ve medya isteklerini durdurun: istek türü image, font ya da media ise request.abort(), değilse request.continue(). Bu tek ayar, ürün sayfası taramalarında aktarılan veriyi gözle görülür biçimde azaltır; ne kadar azalacağı hedefe bağlıdır, kendi deneme taramanızda ölçün.

Rotasyon gerçekten çalışıyor mu? Beş istekli deney

Proxy ayarı yapıldıktan sonra ilk iş, IP’nin değiştiğini görmektir. Kendi sunucunuzda istemci IP’sini düz metin döndüren bir uç nokta açın ya da bu işi yapan herhangi bir adresi kullanın, sonra beş kez isteyin: const ips = new Set(); for (let i = 0; i < 5; i++) { const r = await fetch(IP_URL, { dispatcher: agent }); ips.add((await r.text()).trim()); } console.log(ips.size). Değer 5’e yakınsa istek başına rotasyon çalışıyor; 1 ise ya oturum parametresi açık ya da bağlantı yeniden kullanılıyor.

Bağlantı yeniden kullanımı Node’da varsayılan davranıştır: undici her zaman bağlantı havuzu tutar, Node 19 ve sonrasında yerleşik http agent’ı da keep-alive ile çalışır. Aynı TCP bağlantısında art arda giden istekler bazı gateway yapılandırmalarında aynı çıkış IP’sinde kalır. Her istekte yeni IP için axios’ta new HttpsProxyAgent(url, { keepAlive: false }) ya da Connection: close başlığı, undici’de her istek için yeni ProxyAgent ya da pipelining: 0 ve düşük keepAliveTimeout kullanılır. Deneyi iki ayarla da çalıştırın; iki sayı arasındaki fark keep-alive’ın etkisini gösterir.

Aynı IP’de kalmak istediğiniz işler için yol ters çevrilir: IPv4 residential ve mobile ürünlerde sticky oturum, IPv6 ürünlerde oturum yapılandırmalı rotasyon vardır; oturum kimliği panelde tanımlanan sözdizimiyle kullanıcı adına eklenir. Node tarafında bunun karşılığı iş başına ayrı proxy adresi üretmektir: sepet akışı için oturum kimlikli adresle bir agent, bağımsız tarama için kimliksiz adresle ikinci bir agent. Gateway’in parametreleri nasıl taşıdığı gateway mantığı rehberinde ayrıntılı anlatılıyor.

Hata, neden, çözüm: Node’a özgü belirtiler

407 Proxy Authentication Required: axios’ta hata nesnesinin response.status alanı 407 döner. undici’de HTTPS hedefte tünel kurulamadığı için Proxy response (407) !== 200 when HTTP Tunneling biçiminde bir hata fırlatılır; HTTP hedefte ise normal bir 407 yanıtı gelir. Üç nedeni vardır: şifredeki kaçırılmamış özel karakter, yanlış kullanıcı adı ya da IP izni modunda sunucunuzun IP’sinin panelde kayıtlı olmaması. Önce new URL(process.env.PROXY_URL) ile adresi ayrıştırıp username ve password alanlarını yazdırın.

ECONNREFUSED ve ENOTFOUND: Proxy host ya da port yanlış, HTTP ile SOCKS5 uç noktaları karışmış ya da giden port güvenlik duvarında kapalı. Hata, hedefe değil proxy’ye ulaşılamadığını söyler; aynı adresi curl ile denemek sorunun kodda mı ağda mı olduğunu ayırır. UND_ERR_CONNECT_TIMEOUT ve ETIMEDOUT: Proxy üzerinden bağlantı kurma süresi doğrudan erişime göre uzar; bağlantı zaman aşımını birkaç saniyenin altına çekmeyin, okuma zaman aşımını hedefin tipik süresine göre verin. undici’de bu ayar ProxyAgent’a connect: { timeout: 10000 } ile geçilir.

Sertifika hatası (UNABLE_TO_VERIFY_LEAF_SIGNATURE, self signed certificate): HTTPS hedefe CONNECT tüneli yerine düz HTTP isteği gidiyor demektir; axios’ta yerleşik proxy seçeneğinden agent yoluna geçin. NODE_TLS_REJECT_UNAUTHORIZED=0 ile doğrulamayı kapatmak çözüm değildir, trafiğinizi açığa çıkarır. 429 Too Many Requests: Bu yanıtı proxy değil hedef döndürür; IP değişse bile aynı başlık seti ve aynı tempo sınıra takılır. Retry-After varsa o kadar bekleyin, yoksa üstel bekleme uygulayın; ayrıntılı kurgu retry ve backoff rehberinde var. Yeniden denemeyi hata sınıfına göre kurun: bağlantı hatasında dene, 4xx yanıtta deneme.

Sık sorulan sorular

axios proxy ayarı HTTPS sitede neden çalışmıyor? Yerleşik proxy seçeneği HTTPS hedeflerde her sürümde CONNECT tüneli kurmaz. https-proxy-agent ile httpsAgent verin ve proxy: false yazın; bu düzen HTTP ve HTTPS hedeflerin ikisinde de aynı biçimde çalışır.

SOCKS5 proxy Node.js’te nasıl kullanılır? axios için socks-proxy-agent paketi httpsAgent alanına verilir, Puppeteer için --proxy-server=socks5://host:port yeterlidir ama Chromium SOCKS5 kimlik doğrulamasını desteklemez; bu durumda IP izni ya da HTTP uç noktası gerekir. undici SOCKS desteklemez.

Puppeteer’da her sayfaya farklı IP verilebilir mi? Rotating gateway ile her yeni bağlantı zaten farklı IP alır. Sayfa başına farklı ülke ya da sabit oturum gerekiyorsa createBrowserContext seçeneğinde ayrı proxy adresi ya da oturum kimlikli kullanıcı adı verilir; sayfa açıldıktan sonra authenticate çağrısı tekrarlanır.

Ortam değişkeni (HTTPS_PROXY) ile proxy tanımlanır mı? axios bu değişkenleri varsayılan olarak okur; agent kullanıyorsanız proxy: false ile kapatın. Yerleşik fetch ve undici varsayılan olarak okumaz; dispatcher açıkça verilir. Yeni Node sürümlerindeki deneysel ortam değişkeni desteğini sürüm belgesinden doğrulayın.

Kota nasıl ölçülür? GB bazlı üründe gelen ve giden veri kotadan düşer. Deneme taramasında yanıtların content-length değerini ya da Buffer uzunluğunu toplayıp istek sayısına bölün; ortalama yanıt boyutu kota tahmininin tek güvenilir girdisidir. Puppeteer’da istek kesmeyi açıp kapayarak iki ölçüm almak, tarayıcı tabanlı taramanın gerçek maliyetini gösterir.

İlgili ürünler

İç bağlantılar