Socks5Proxy

Puppeteer proxy ayarları, --proxy-server ve page.authenticate ile bağlama

Bu rehber, Puppeteer ile Chrome'u çalıştırırken Socks5Proxy'nin HTTP proxy'sini --proxy-server argümanı ve page.authenticate kimlik doğrulaması ile bağlama yöntemini, SOCKS5 bağlantısını ve birden fazla IP ile tarayıcıları ayırma kodunu açıklar.

Puppeteer'da proxy nasıl çalışır?

Puppeteer'da proxy, Chrome'u başlatırken verilen argümanlarla ayarlanır. --proxy-server'a adres verirseniz, o tarayıcıdaki tüm sayfalar aynı proxy'yi kullanır. HTTP proxy'sinin kullanıcı adı ve şifresini başlatma argümanlarıyla veremezsiniz, bu yüzden sayfayı açtıktan sonra page.authenticate ile geçirmeniz gerekir. Böylece proxy kimlik doğrulama istediğinde Puppeteer otomatik yanıt verir.

Örnekte IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, kullanıcı adı spx_user ve şifre spx_pass kullanılmaktadır.

npm install puppeteer

HTTP proxy ve kimlik doğrulama nasıl bağlanır?

launch'ın args'ına --proxy-server=198.51.100.23:8000 ekleyin ve newPage ile sayfa oluşturduktan hemen sonra page.authenticate'e kullanıcı adı ve şifreyi geçirin. Yetkilendirme her sayfa için yapılmalıdır, bu yüzden yeni bir sayfa oluşturduğunuzda aynı çağrıyı ekleyin.

HTTPS siteleri de sorunsuz açılır. Tarayıcı CONNECT tüneli oluşturur ve bu tünel içinde şifrelenmiş olarak iletişim kurar.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

SOCKS5 proxy nasıl kullanılır?

--proxy-server'e socks5:// adresini girmeniz yeterli. Ancak Chrome, SOCKS proxy'lerinde kullanıcı adı/şifre kimlik doğrulamasını desteklemez, bu nedenle page.authenticate SOCKS5 için geçerli değildir. SOCKS5 bağlantısı için, bu kodun çalıştığı sunucunun IPv4 adresini IP yetkilendirme ile kaydedin.

Kullanıcı adı ve şifre ile bağlantı kurmanız gereken bir ortamdaysanız, aynı IP'nin HTTP portunu kullanmak en basit çözümdür. Aynı IP olduğu için hedef sitede görünen konum aynıdır.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Farklı IP'lerle birden fazla tarayıcı nasıl açılır?

Chrome başlatılan her tarayıcı için tek bir proxy kullanır, bu nedenle farklı IP'lere ihtiyaç duyulduğunda tarayıcıları ayrı ayrı başlatmak gerekir. Aşağıdaki kod, API'den ip:port:user:pass listesini alarak ilk 3'ü kullanarak tarayıcıları tek tek başlatır ve her sayfada görünen IP'yi yazdırır.

Tarayıcıları çok açarsanız çok fazla bellek kullanır. Bir iş kuyruğu oluşturun ve aynı anda çalıştırılacak tarayıcı sayısını belirleyin.

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

Sayfaları daha hızlı açmak için ne yapmalıyım?

Proxy üzerinden resimler, yazı tipleri, videolar bile proxy ile alındığından bant genişliği ve zaman daha fazla harcanır. İhtiyacınız olan yalnızca metin ve veriyse, page.setRequestInterception ile resim ve yazı tipi isteklerini engelleyerek hızı artırabilir ve paylaşımlı planların aylık bant genişliğinden tasarruf edebilirsiniz.

waitUntil değeri de önemlidir. networkidle0 tüm istekler bitene kadar bekler ve yavaş olabilir, bu yüzden gerekli öğeler göründüğünde hemen bir sonraki adıma geçmek için page.waitForSelector kullanmak daha iyidir.

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

Bir tarayıcıda sayfa başına farklı IP kullanabilir miyim?

Chrome'un --proxy-server seçeneği tüm tarayıcıya uygulandığından sayfa başına farklı IP vermek zordur. Puppeteer 22 ve üzeri, browser.createBrowserContext'e proxyServer seçeneği ekleyerek her bağlam için farklı proxy kullanabilir. Bağlamlar çerez ve depolama alanı olarak ayrıldığından hesap bazlı işlemler için de uygundur.

Bağlamda oluşturulan sayfalar da page.authenticate ile kullanıcı adı ve şifre gönderilebilir. Birden fazla tarayıcı açmaktan daha az bellek kullanır.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

O ülkenin kullanıcısı gibi görünmek için neyi ayarlamalıyım?

IP ülkesine göre page.setExtraHTTPHeaders ile Accept-Language'ı, page.emulateTimezone ile zaman dilimini ayarlayın. Dil ve zaman dilimi IP ülkesinden farklıysa sayfa yanlış dilde görünebilir veya tarih formatı farklı olabilir.

Ekran boyutunu page.setViewport ile ayarlayın, telefon ekranı gerekiyorsa puppeteer'ın KnownDevices'ındaki cihaz ayarlarını page.emulate'e aktarın.

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

Uzun süren işlemlerde tarayıcıyı nasıl stabil tutabilirim?

Gün boyu çalışan işlemlerde, tarayıcıyı bir kere açıp sürekli kullanmak yerine belirli sayıda sayfa işlendikten sonra kapatıp yeniden açmak daha stabildir. Uzun süre açık kalan tarayıcılar giderek daha fazla bellek tüketir ve bir hata oluştuğunda tüm işlemler durabilir.

Her sayfa için try ve finally ile page.close'u mutlaka çağırın ve goto'ya timeout ekleyerek yanıt vermeyen sayfalarda takılıp kalmayın. Başarısız olan işlemleri farklı bir proxy ile yeni bir tarayıcı açarak tekrar deneyebilirsiniz.

Proxy yanıt sürelerini ve hatalarını proxy bazında kaydederseniz, yavaş olanları tespit edip dashboard destek ekibine başvurabilir veya iş akışınızı değiştirebilirsiniz.

Sık karşılaşılan hatalar nasıl çözülür?

net::ERR_INVALID_AUTH_CREDENTIALS veya 407, page.authenticate değerinin yanlış olduğu veya newPage'den sonra çağrılmadığı durumlarda olur. Her sayfada goto'dan önce çağrıldığını kontrol edin.

net::ERR_PROXY_CONNECTION_FAILED, adres veya port yanlış olduğunda olur. HTTP adresi için HTTP portu, SOCKS5 adresi için SOCKS5 portu kullandığınızdan emin olun. SOCKS5'te bağlantı reddedilirse, IP yetkilendirmesinde sunucunun çıkış IP'sinin kayıtlı olup olmadığını kontrol edin.

Puppeteer proxy ayarları, page.authenticate kimlik doğrulaması | Socks5Proxy