Socks5Proxy

Puppeteer proxy setup, pagkonekta gamit ang --proxy-server at page.authenticate

Ang gabay na ito ay nagpapaliwanag kung paano ikonekta ang HTTP proxy ng Socks5Proxy sa --proxy-server argument at page.authenticate authentication kapag nagpapatakbo ng Chrome gamit ang Puppeteer, SOCKS5 connection, at code para magbukas ng browser na nahahati sa iba't ibang IP.

Paano gumagana ang proxy sa Puppeteer?

Sa Puppeteer, ang proxy ay itinuturo sa Chrome launch arguments. Kung ilalagay mo ang address sa --proxy-server, lahat ng page sa browser na iyon ay gagamit ng parehong proxy. Ang HTTP proxy username at password ay hindi pwedeng ilagay sa launch arguments, kaya ipasa mo ito gamit ang page.authenticate pagkatapos buksan ang page. Kapag humingi ng authentication ang proxy, awtomatikong irereply ito ng Puppeteer.

Ginagamit ang IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, username spx_user, password spx_pass.

npm install puppeteer

Paano ikonekta ang HTTP proxy at authentication?

Ilagay ang --proxy-server=198.51.100.23:8000 sa args ng launch, at pagkatapos gumawa ng page gamit ang newPage, ipasa ang username at password sa page.authenticate. Ang authentication ay kailangan sa bawat page, kaya ilagay ang parehong tawag sa bawat bagong page.

Bukas pa rin ang HTTPS site. Gumagawa ang browser ng CONNECT tunnel at nagko-communicate sa loob nito nang naka-encrypt.

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();

Paano gamitin ang SOCKS5 proxy?

Ilagay ang socks5:// address sa --proxy-server. Gayunpaman, hindi sinusuportahan ng Chrome ang username/password authentication para sa SOCKS proxy, kaya hindi applicable ang page.authenticate sa SOCKS5. Para makakonekta gamit ang SOCKS5, gamitin ang IP authorization sa dashboard para i-register ang IPv4 ng server kung saan isinasagawa ang code na ito.

Kung kailangang kumonekta gamit ang username at password, ang pinakasimpleng paraan ay gamitin ang HTTP port ng parehong IP. Dahil pareho ang IP, ang lokasyon na nakikita sa target site ay pareho.

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();

Paano i-divide ang browser sa iba't ibang IP?

Ang Chrome ay gumagamit ng isang proxy bawat browser instance, kaya kung kailangan mo ng iba't ibang IP, kailangan mong magbukas ng hiwalay na browser. Ang code sa ibaba ay kumukuha ng ip:port:user:pass list mula sa API at nagbubukas ng browser para sa unang 3, pagkatapos ay nagpi-print ng IP na nakikita sa bawat page.

Ang pagbubukas ng maraming browser ay kumakain ng malaking memorya. Magandang mag-setup ng work queue at limitahan ang bilang ng sabay-sabay na browser instances.

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();
  }
}));

Paano mas mapapabilis ang pagbukas ng page?

Kapag dumadaan sa proxy, lahat ng images, fonts, videos ay dadaan din kaya mas malaki ang bandwidth at oras. Kung text at data lang ang kailangan, pwedeng i-block ang image/font requests gamit ang page.setRequestInterception para mas mabilis at makatipid sa shared plan bandwidth.

Mahalaga rin ang waitUntil value. Ang networkidle0 ay naghihintay hanggang matapos ang lahat ng request, kaya maaari itong maging mabagal. Mas mainam na gamitin ang page.waitForSelector para lumipat agad sa susunod na hakbang kapag nakita na ang kinakailangang elemento.

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

Pwede bang gumamit ng iba't ibang IP bawat page sa iisang browser?

Ang --proxy-server ng Chrome ay inilalapat sa buong browser, na nagpapahirap sa pagbibigay ng iba't ibang IP bawat page. Ang Puppeteer 22 at mas mataas ay nagpapahintulot ng proxyServer option sa browser.createBrowserContext para magamit ang iba't ibang proxy bawat context. Ang mga context ay may hiwalay na cookies at storage, na angkop para sa mga gawain bawat account.

Maaari ring ipasa ang username at password sa mga page na ginawa sa context gamit ang page.authenticate. Mas mababa ang memory usage kumpara sa pagbukas ng maraming browser.

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();

Ano ang dapat i-match para magmukhang user mula sa bansang iyon?

Gamitin ang page.setExtraHTTPHeaders para sa Accept-Language at page.emulateTimezone para sa timezone ayon sa IP country. Kung magkaiba ang language at timezone sa IP country, maaaring magpakita ang page sa maling wika o ibang date display.

Gamitin ang page.setViewport para sa screen size. Para sa mobile view, pwede mong gamitin ang device presets mula sa puppeteer's KnownDevices sa page.emulate.

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

Paano panatilihing stable ang browser sa long-running tasks?

Mas stable kung isara at buksan ulit ang browser pagkatapos ng ilang pages. Long-running browsers ay kumakain ng memory at mas prone sa crashes.

Siguraduhing tawagin ang page.close sa try at finally block, at lagyan ng timeout ang goto para hindi mag-hang sa unresponsive page. Subukan uli ang failed task gamit ang bagong browser at ibang proxy.

Mag-record ng response time at errors per proxy para madaling makita kung alin ang mabagal. Pwedeng mag-contact sa customer support o baguhin ang task batch.

Paano malulutas ang mga common errors?

Ang net::ERR_INVALID_AUTH_CREDENTIALS o 407 ay nangyayari kapag mali ang value sa page.authenticate o hindi ito tinawag pagkatapos ng newPage. Siguraduhing tinawag ito bago ang goto sa bawat page.

Ang net::ERR_PROXY_CONNECTION_FAILED ay nangyayari kapag mali ang address o port. Siguraduhing ginamit ang HTTP port para sa HTTP address at SOCKS5 port para sa SOCKS5 address. Kung tinanggihan ang koneksyon sa SOCKS5, siguraduhing nairehistro ang outgoing IP ng server sa IP authorization.

Puppeteer proxy setup, page.authenticate authentication | Socks5Proxy