Puppeteer प्रॉक्सी सेटिंग, --proxy-server और page.authenticate से कनेक्शन
यह गाइड Puppeteer से Chrome चलाते समय Socks5Proxy के HTTP प्रॉक्सी को --proxy-server आर्ग्युमेंट और page.authenticate ऑथेंटिकेशन से कनेक्ट करने का तरीका, SOCKS5 कनेक्शन, और कई IPs से ब्राउज़र इंस्टेंसेस चलाने का कोड समझाती है।
Puppeteer में प्रॉक्सी कैसे काम करता है?
Puppeteer Chrome लॉन्च करते समय पास किए गए तर्कों के साथ प्रॉक्सी निर्धारित करता है। --proxy-server में पता डालने पर उस ब्राउज़र के सभी पृष्ठ एक ही प्रॉक्सी का उपयोग करते हैं। HTTP प्रॉक्सी के उपयोगकर्ता नाम और पासवर्ड को लॉन्च तर्कों के साथ नहीं डाला जा सकता है, इसलिए पृष्ठ खोलने के बाद page.authenticate के साथ पास किया जाता है। इससे प्रॉक्सी प्रमाणीकरण का अनुरोध करने पर Puppeteer स्वचालित रूप से जवाब देता है।
उदाहरण में IP 198.51.100.23, HTTP पोर्ट 8000, SOCKS5 पोर्ट 1080, यूजरनेम spx_user, पासवर्ड spx_pass का उपयोग किया गया है।
npm install puppeteerHTTP प्रॉक्सी और प्रमाणीकरण कैसे कनेक्ट करें?
launch के args में --proxy-server=198.51.100.23:8000 डालें और newPage से पृष्ठ बनाने के तुरंत बाद page.authenticate में यूजरनेम और पासवर्ड पास करें। प्रमाणीकरण हर पृष्ठ के लिए करना होता है इसलिए हर नए पृष्ठ बनाने पर समान कॉल डालें।
HTTPS साइटें भी सीधे खुलती हैं। ब्राउज़र CONNECT टनल बनाता है और उसके अंदर एन्क्रिप्टेड संचार करता है।
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-server में socks5:// एड्रेस डालें। हालांकि, Chrome SOCKS प्रॉक्सी के यूजरनेम और पासवर्ड ऑथेंटिकेशन का समर्थन नहीं करता है, इसलिए page.authenticate SOCKS5 पर लागू नहीं होता है। SOCKS5 से कनेक्ट करने के लिए, डैशबोर्ड में इस कोड को चलाने वाले सर्वर के IPv4 को रजिस्टर करने के लिए IP ऑथेंटिकेशन का उपयोग करें।
यदि यूजरनेम और पासवर्ड द्वारा कनेक्ट करना आवश्यक है, तो एक ही IP के HTTP पोर्ट का उपयोग करना सबसे सरल है। एक ही IP होने के कारण लक्ष्य साइट पर दिखाई देने वाला स्थान समान होता है।
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();कई आईपी के साथ ब्राउज़र को अलग-अलग कैसे खोलें?
Chrome एक ब्राउज़र इंस्टेंस के लिए एक प्रॉक्सी का उपयोग करता है, इसलिए यदि आपको अलग-अलग IP की आवश्यकता है, तो आपको अलग-अलग ब्राउज़र इंस्टेंस चलाने की आवश्यकता होगी। नीचे दिया गया कोड API से ip:port:user:pass सूची प्राप्त करता है और पहले 3 का उपयोग करके अलग-अलग ब्राउज़र इंस्टेंस खोलता है, और प्रत्येक पेज पर दिखाई देने वाले IP को प्रिंट करता है।
एक साथ कई ब्राउज़र खोलने से मेमोरी ज्यादा यूज़ होती है। वर्क क्यू बनाकर और कंकरेंट ब्राउज़र इंस्टेंसेस की संख्या लिमिट करने की सलाह दी जाती है।
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();
}
}));पेज को तेज़ी से कैसे खोलें?
प्रॉक्सी के माध्यम से छवियाँ, फॉन्ट, वीडियो भी डाउनलोड होते हैं जो बैंडविड्थ खाते हैं। केवल टेक्स्ट और डेटा चाहिए तो page.setRequestInterception से छवि/फॉन्ट अनुरोध ब्लॉक करें।
waitUntil मान भी महत्वपूर्ण है। networkidle0 सभी अनुरोध समाप्त होने तक प्रतीक्षा करता है इसलिए धीमा हो सकता है, आवश्यक तत्व दिखाई देने पर page.waitForSelector का उपयोग करके अगले चरण पर जाएं।
await page.setRequestInterception(true);
page.on("request", (req) => {
const type = req.resourceType();
if (type === "image" || type === "font" || type === "media") req.abort();
else req.continue();
});क्या एक ही ब्राउज़र में अलग-अलग पेजेज़ के लिए अलग-अलग IPs यूज़ कर सकते हैं?
Chrome का --proxy-server पूरे ब्राउज़र पर लागू होता है, इसलिए प्रत्येक पेज के लिए अलग IP देना मुश्किल होता है। Puppeteer 22 और उसके बाद के संस्करण में browser.createBrowserContext के साथ proxyServer ऑप्शन का उपयोग करके प्रत्येक कॉन्टेक्स्ट के लिए अलग प्रॉक्सी का उपयोग किया जा सकता है। कॉन्टेक्स्ट कुकीज़ और स्टोरेज को अलग करते हैं, जो खाता-विशिष्ट कार्यों के लिए भी उपयुक्त है।
page.authenticate के माध्यम से कॉन्टेक्स्ट में बनाए गए पेजों को यूजरनेम और पासवर्ड पास किया जा सकता है। यह मल्टीपल ब्राउज़र इंस्टेंस चलाने की तुलना में मेमोरी कुशल है।
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();उस देश के उपयोगकर्ता की तरह दिखने के लिए क्या मिलान करना चाहिए?
IP देश के अनुसार page.setExtraHTTPHeaders से Accept-Language और page.emulateTimezone से टाइमज़ोन सेट करें। अगर भाषा और टाइमज़ोन IP देश से अलग हैं तो पेज गलत भाषा में दिख सकता है या डेट फॉर्मेट अलग हो सकता है।
स्क्रीन आकार page.setViewport से सेट करें, और यदि मोबाइल स्क्रीन की आवश्यकता हो तो Puppeteer के KnownDevices में उपलब्ध डिवाइस कॉन्फ़िगरेशन को 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 });लंबे समय तक चलने वाले टास्क में ब्राउज़र को स्थिर कैसे रखें?
पूरे दिन चलने वाले कार्यों के लिए ब्राउज़र को एक बार खोलकर लगातार उपयोग करने के बजाय, एक निश्चित संख्या में पेज प्रोसेस करने के बाद बंद करके नया खोलना अधिक स्थिर होता है। लंबे समय तक खुले ब्राउज़र अधिक मेमोरी उपयोग करते हैं, और एक बार एरर आने पर बाद के सभी कार्य रुक सकते हैं।
प्रत्येक पेज के लिए try और finally में page.close को अवश्य कॉल करें, और goto में टाइमआउट सेट करें ताकि अनुत्तरित पेज पर रुकावट न हो। असफल कार्यों को दूसरे प्रॉक्सी से नए ब्राउज़र में फिर से प्रयास करें।
प्रॉक्सी प्रतिक्रिया समय और त्रुटियों को रिकॉर्ड करने से धीमे IP की पहचान करने और समर्थन से संपर्क करने में मदद मिलती है।
सामान्य त्रुटियों को कैसे हल करें?
net::ERR_INVALID_AUTH_CREDENTIALS या 407 तब होता है जब page.authenticate मान गलत हो या newPage के बाद कॉल न किया गया हो। हर पृष्ठ पर goto से पहले कॉल किया गया है या नहीं जांचें।
net::ERR_PROXY_CONNECTION_FAILED तब होता है जब पता या पोर्ट गलत हो। HTTP पते के लिए HTTP पोर्ट और SOCKS5 पते के लिए SOCKS5 पोर्ट का उपयोग किया गया है या नहीं जांचें। SOCKS5 में कनेक्शन अस्वीकृत होने पर IP प्रमाणीकरण में सर्वर का आउटगोइंग IP पंजीकृत है या नहीं जांचें।