Hızlı cevap
Node.js'de dönen proxyyi nasıl kullanırım?
fetch ile http://gw.crawlrelay.com:7777 için bir undici ProxyAgent oluştur ve bunu dispatcher olarak geçir. axios veya got ile, https-proxy-agent veya hpagent gibi bir proxy ajan geçir ve axios'ta proxy: false ayarla. CrawlRelay konut proxyleri ülkeyi ve oturumu kullanıcı adından $0,50/GB baz alarak okur. KYC olmadan, kripto ile ödenir.
Node.js kurulumu genel bakış
| fetch / undici | new ProxyAgent({ uri, token }), sonra fetch(url, { dispatcher }) |
|---|---|
| axios | httpsAgent: new HttpsProxyAgent(url) ve proxy: false |
| got | hpagent'den agent: { https: new HttpsProxyAgent({ proxy }) } |
| SOCKS5 | socks5h:// URL ile 7778 portunda socks-proxy-agent |
| İstek başına yeni IP | İstek başına yeni bir agent veya yeni bir oturum kimliği; havuzdaki bağlantılar çıkışlarını korur |
| Modül formatı | Örnekler ES modülleridir (.mjs veya "type": "module") ve top-level await içerir |
Node'un fetch'i ile proxy nasıl kullanılır?
Node'un global fetch'u undici üzerine kurulu ama varsayılan olarak HTTP_PROXY veya HTTPS_PROXY okumaz. Undici yükleyin ve dispatcher olarak bir ProxyAgent geçin. token alanı, kimlik bilgilerini Proxy-Authorization başlığı olarak gönderir, dolayısıyla parola asla loglanabilecek bir URL içinde görünmez.
import { ProxyAgent, fetch } from "undici";
const credentials = Buffer.from("USERNAME-country-us:PASSWORD").toString("base64");
const dispatcher = new ProxyAgent({
uri: "http://gw.crawlrelay.com:7777",
token: `Basic ${credentials}`,
});
const res = await fetch("https://api.ipify.org?format=json", {
dispatcher,
signal: AbortSignal.timeout(30000),
});
console.log(res.status, await res.json());
await dispatcher.close();Axios ile proxy nasıl kullanılır?
HTTPS siteleri için axios'un kendi proxy seçeneğine güvenmeyin: bu, isteği CONNECT tüneli olmadan proxy'ye gönderir, ki birçok proxy bunu reddeder. Bunu proxy: false ile kapatın ve uygun tüneli açan bir agent iletin.
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";
const agent = new HttpsProxyAgent("http://USERNAME-country-de:[email protected]:7777");
const client = axios.create({ httpsAgent: agent, httpAgent: agent, proxy: false, timeout: 30000 });
const { data } = await client.get("https://api.ipify.org?format=json");
console.log(data.ip);got ile proxy nasıl kullanılır?
got her protokol için bir agent alır. hpagent, Node'un http.Agent politikasını takip eder: keep-alive kapalıdır, ancak keepAlive: true geçerseniz açılır. Her isteğin yeni bir bağlantıda olmasını istediğinizde kapalı bırakın ya da aşağıda gösterildiği gibi keepAlive: false ayarlayın, böylece genellikle yeni bir çıkış kullanılır.
import got from "got";
import { HttpsProxyAgent } from "hpagent";
const proxy = "http://USERNAME-country-fr:[email protected]:7777";
const body = await got("https://api.ipify.org", {
agent: { https: new HttpsProxyAgent({ proxy, keepAlive: false }) },
timeout: { request: 30000 },
retry: { limit: 2, statusCodes: [429, 502, 503, 504] },
}).text();
console.log(body);Node.js'te SOCKS5 nasıl kullanılır?
socks-proxy-agent'ı socks5h:// şemasıyla kullanın, böylece ana bilgisayar adı çıkışta çözülür. Node'un http ve https modülleriyle ve bir agent kabul eden her kütüphane ile çalışır.
import https from "node:https";
import { SocksProxyAgent } from "socks-proxy-agent";
const agent = new SocksProxyAgent("socks5h://USERNAME-country-gb:[email protected]:7778");
const req = https.get("https://api.ipify.org", { agent, timeout: 30000 }, (res) => {
let body = "";
res.on("data", (chunk) => (body += chunk));
res.on("end", () => console.log(res.statusCode, body));
});
req.on("timeout", () => req.destroy(new Error("timeout after 30 s")));
req.on("error", (err) => console.error(err.code, err.message));Kitaplıksız host başına eşzamanlılığı nasıl sınırlandırırım?
10.000 URL üzerinde Promise.all 10.000 isteği aynı anda açar. Her host için küçük bir sınırlayıcı, her siteyi kibar bir seviyede tutar ve tarama genel olarak paralel devam eder. Aşağıdaki sürüm bağımlılıksızdır ve üstteki herhangi bir istemci ile çalışır.
import { ProxyAgent, fetch } from "undici";
const PER_HOST = 4;
const active = new Map();
const waiting = new Map();
const dispatcher = new ProxyAgent("http://USERNAME-country-us:[email protected]:7777");
async function withHostSlot(url, task) {
const host = new URL(url).hostname;
while ((active.get(host) ?? 0) >= PER_HOST) {
await new Promise((resolve) => {
if (!waiting.has(host)) waiting.set(host, []);
waiting.get(host).push(resolve);
});
}
active.set(host, (active.get(host) ?? 0) + 1);
try {
return await task();
} finally {
active.set(host, active.get(host) - 1);
waiting.get(host)?.shift()?.();
}
}
const urls = ["https://example.com/", "https://example.org/", "https://example.net/"];
const results = await Promise.all(
urls.map((url) =>
withHostSlot(url, async () => {
const res = await fetch(url, { dispatcher, signal: AbortSignal.timeout(30000) });
return [url, res.status, (await res.arrayBuffer()).byteLength];
}).catch((err) => [url, err.name, 0])
)
);
console.table(results);
await dispatcher.close();Neden aynı IP'yi iki kere alıyorum veya ECONNRESET hatası alıyorum?
Agentlar bağlantıları havuzlar ve havuzdaki bağlantı açıldığı çıkışı korur. İstek başına yeni IP için istek başına yeni bir agent oluşturup sonra kapatın, agent içinde keep-alive'ı kapatın veya her isteğin kullanıcı adında benzersiz bir -session-<id> kullanın.
ECONNRESET ve socket hang up genelde karşı tarafın kapattığı havuzdaki bir soketin tekrar kullanılmasından ya da bağlantının düştüğü bir çıkıştan kaynaklanır. GET isteklerini yeni bağlantıda bir kere yeniden deneyin. connection reset sayfası detayları açıklar.
Node.js ve proxyler: sorular
Node.js fetch HTTP_PROXY destekliyor mu?
Bugünün çoğu projede kullanılan sürümlerde varsayılan olarak hayır: global fetch proxy ortam değişkenlerini görmezden gelir, dispatcher geçilmedikçe. Yukarıda gösterildiği gibi undici ProxyAgent kullanın veya süreçteki her istek proxyyi kullanmalıysa undici'nin setGlobalDispatcher() ile global dispatcher ayarlayın.
Neden axios proxy arkasındaki HTTPS sitelerinde hata verir?
Axios'un yerleşik proxy seçeneği HTTPS isteklerini birçok proxy'nin reddettiği biçimde proxyye yollar, CONNECT tüneli açmaz. proxy: false ayarlayın ve HttpsProxyAgent'yi httpsAgent olarak geçin. Böylece istek düzgün bir tünel üzerinden gider ve TLS sadece sizin kodunuz ve site arasında olur.
Tek bir Node.js işleminden farklı ülkeler nasıl gönderirim?
Her ülke için kendi kullanıcı adıyla (örneğin USERNAME-country-de veya USERNAME-country-jp) bir agent oluşturun ve isteğe göre agent seçin. Agentlar ucuzdur, onları ayrı tutmak bağlantı havuzlarını ve dolayısıyla çıkışlarını da ayırır.
Node.js’te hangi zaman aşımını ayarlamalıyım?
Her zaman bir tane ayarlayın: fetch için AbortSignal.timeout(30000), axios için timeout: 30000, got için timeout: { request: 30000 }. Otuz saniye HTML sayfalar için uygundur; yavaş hedefler ve mobil çıkışlar için 60 saniye verin ve daha uzun beklemek yerine yeni bağlantıda bir kere yeniden deneyin.
Node.js tarayıcınızı bağlayın
$5,94, 50 GB üzerinden 10 GB, $0,50/GB.