Back to Blog

जावास्क्रिप्ट प्रॉक्सी रेंडरिंग: ब्लॉकिंग और त्रुटियों से बचने के तरीके

JavaScript रेंडरिंग के लिए प्रॉक्सी के साथ काम करते समय विशेष दृष्टिकोण की आवश्यकता होती है। आइए समझते हैं कि कौन सी समस्याएं उत्पन्न होती हैं और उन्हें कैसे हल किया जाए।

📅December 4, 2025
```html

प्रॉक्सी के माध्यम से JavaScript रेंडरिंग: ब्लॉकेड और त्रुटियों से कैसे बचें

जब आप ऐसी वेब साइटों को पार्स करते हैं जो JavaScript के माध्यम से सामग्री लोड करती हैं, तो सामान्य HTTP अनुरोध अप्रभावी हो जाते हैं। इसमें बॉट से सुरक्षा और भौगोलिक स्थान प्रतिबंध जोड़ें - और कार्य कई गुना जटिल हो जाता है। प्रॉक्सी समस्याओं का एक हिस्सा हल करते हैं, लेकिन सही कॉन्फ़िगरेशन की आवश्यकता होती है।

JavaScript रेंडरिंग को प्रॉक्सी की आवश्यकता क्यों है

आधुनिक साइटें अक्सर React, Vue या Angular जैसे फ्रेमवर्क का उपयोग करती हैं, जो क्लाइंट-साइड पर सामग्री लोड करती हैं। जब आप एक सामान्य GET अनुरोध भेजते हैं, तो आपको तैयार सामग्री के बजाय <div id="root"></div> टैग के साथ खाली HTML मिलता है।

समस्याएं जो प्रॉक्सी हल करते हैं:

  • भौगोलिक स्थान प्रतिबंध। साइटें देशों द्वारा पहुंच को सीमित करती हैं। आवश्यक क्षेत्र से IP वाला प्रॉक्सी इन प्रतिबंधों को बायपास करता है।
  • बॉट से सुरक्षा। Cloudflare, hCaptcha और समान सिस्टम स्वचालित अनुरोधों को ब्लॉक करते हैं। आवासीय प्रॉक्सी सामान्य उपयोगकर्ताओं की तरह दिखते हैं और जांच को बेहतर तरीके से पास करते हैं।
  • दर सीमा। सर्वर कई अनुरोधों के बाद एक IP को ब्लॉक कर सकता है। प्रॉक्सी ट्रैफिक वितरित करते हैं और ब्लॉकेड से बचते हैं।
  • गोपनीयता। पार्सिंग करते समय आपके वास्तविक IP को छुपाते हैं।

Headless ब्राउज़र और प्रॉक्सी: मूल बातें

JavaScript रेंडरिंग के लिए headless ब्राउज़र का उपयोग किया जाता है - ग्राफिकल इंटरफेस के बिना Chromium। लोकप्रिय विकल्प:

  • Puppeteer — Chrome/Chromium को नियंत्रित करने के लिए Node.js पुस्तकालय।
  • Playwright — क्रॉस-ब्राउज़र विकल्प, Chrome, Firefox, Safari का समर्थन करता है।
  • Selenium — क्लासिक विकल्प, विभिन्न ब्राउज़रों के साथ काम करता है।

ये सभी ब्राउज़र लॉन्च पैरामीटर या कनेक्शन विकल्प के माध्यम से प्रॉक्सी का समर्थन करते हैं।

व्यावहारिक सेटअप

Puppeteer के साथ प्रॉक्सी

Puppeteer के लिए प्रॉक्सी कनेक्शन का बुनियादी उदाहरण:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: [
      '--proxy-server=http://proxy.example.com:8080'
    ]
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');
  
  const content = await page.content();
  console.log(content);
  
  await browser.close();
})();

यदि प्रॉक्सी को प्रमाणीकरण की आवश्यकता है:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: [
      '--proxy-server=http://proxy.example.com:8080'
    ]
  });

  const page = await browser.newPage();
  
  // प्रॉक्सी के लिए credentials सेट करना
  await page.authenticate({
    username: 'user',
    password: 'pass'
  });
  
  await page.goto('https://example.com');
  const content = await page.content();
  
  await browser.close();
})();

Playwright के साथ प्रॉक्सी

Playwright में प्रॉक्सी को ब्राउज़र संदर्भ के माध्यम से कॉन्फ़िगर किया जाता है:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://example.com');
  const content = await page.content();
  
  await browser.close();
})();

कई अनुरोधों के लिए प्रॉक्सी रोटेशन

बड़े पैमाने पर पार्सिंग के लिए प्रॉक्सी रोटेशन की आवश्यकता होती है। यहाँ एक सरणी के साथ सरल उदाहरण है:

const puppeteer = require('puppeteer');

const proxies = [
  'http://proxy1.com:8080',
  'http://proxy2.com:8080',
  'http://proxy3.com:8080'
];

let proxyIndex = 0;

async function getPageWithProxy(url) {
  const currentProxy = proxies[proxyIndex % proxies.length];
  proxyIndex++;
  
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${currentProxy}`]
  });
  
  const page = await browser.newPage();
  await page.goto(url);
  const content = await page.content();
  
  await browser.close();
  return content;
}

// उपयोग
(async () => {
  const urls = ['https://example.com/1', 'https://example.com/2'];
  for (const url of urls) {
    const content = await getPageWithProxy(url);
    console.log('Parsed:', url);
  }
})();

सामान्य त्रुटियां और समाधान

त्रुटि कारण समाधान
ERR_TUNNEL_CONNECTION_FAILED प्रॉक्सी अनुपलब्ध है या गलत credentials प्रॉक्सी IP:port, लॉगिन/पासवर्ड की जांच करें। curl के माध्यम से परीक्षण करें
लोडिंग में Timeout धीमा प्रॉक्सी या साइट अनुरोध को ब्लॉक करती है Timeout बढ़ाएं, User-Agent जोड़ें, आवासीय प्रॉक्सी का उपयोग करें
403 Forbidden साइट ने बॉट को पहचाना यथार्थवादी headers जोड़ें, आवासीय प्रॉक्सी का उपयोग करें, अनुरोधों के बीच देरी जोड़ें
प्रत्येक अनुरोध पर CAPTCHA साइट समान User-Agent देखती है User-Agent को रोटेट करें, प्रत्येक ब्राउज़र के लिए विभिन्न प्रॉक्सी का उपयोग करें

यथार्थवादी headers जोड़ना

const page = await browser.newPage();

await page.setUserAgent(
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
);

await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-US,en;q=0.9',
  'Accept': 'text/html,application/xhtml+xml',
  'Referer': 'https://google.com'
});

await page.goto('https://example.com');

प्रदर्शन अनुकूलन

अनावश्यक संसाधनों को अक्षम करना

छवियों और शैलियों का लोडिंग पार्सिंग को धीमा करता है। यदि आपको केवल पाठ की आवश्यकता है:

const page = await browser.newPage();

// छवियों, शैलियों को लोडिंग से ब्लॉक करें
await page.on('request', (request) => {
  const resourceType = request.resourceType();
  if (['image', 'stylesheet', 'font', 'media'].includes(resourceType)) {
    request.abort();
  } else {
    request.continue();
  }
});

await page.goto('https://example.com');

ब्राउज़र पूल का उपयोग

कई पृष्ठों के समानांतर प्रसंस्करण के लिए प्रत्येक अनुरोध के लिए नया ब्राउज़र लॉन्च करने के बजाय ब्राउज़र पूल बनाएं:

const puppeteer = require('puppeteer');

let browser;
const maxPages = 5;
let activePage = 0;

async function initBrowser() {
  browser = await puppeteer.launch({
    args: ['--proxy-server=http://proxy.example.com:8080']
  });
}

async function parsePage(url) {
  const page = await browser.newPage();
  try {
    await page.goto(url);
    const content = await page.content();
    return content;
  } finally {
    await page.close();
  }
}

// उपयोग
(async () => {
  await initBrowser();
  const urls = ['url1', 'url2', 'url3'];
  
  for (const url of urls) {
    await parsePage(url);
  }
  
  await browser.close();
})();

उपकरण और पुस्तकालय

  • Puppeteer Extra — बॉट सुरक्षा को बायपास करने के लिए प्लगइन समर्थन के साथ Puppeteer का विस्तार।
  • Cheerio — ब्राउज़र द्वारा रेंडरिंग के बाद HTML पार्सिंग के लिए हल्का पुस्तकालय।
  • Axios + Proxy Agent — ब्राउज़र के बिना प्रॉक्सी के माध्यम से सरल अनुरोधों के लिए।
  • Scrapy — Python फ्रेमवर्क जिसमें प्रॉक्सी और वितरित पार्सिंग का अंतर्निहित समर्थन है।

महत्वपूर्ण: प्रॉक्सी के साथ काम करते समय सुनिश्चित करें कि आप लक्ष्य साइट की उपयोग की शर्तों का पालन करते हैं और इसके robots.txt का उल्लंघन नहीं करते हैं। पार्सिंग नैतिक होनी चाहिए और सर्वर को अधिभारित नहीं करना चाहिए।

निष्कर्ष

प्रॉक्सी के माध्यम से JavaScript रेंडरिंग पार्सिंग को स्वचालित करने के लिए एक शक्तिशाली उपकरण है, लेकिन विवरण पर ध्यान देने की आवश्यकता है। सही ब्राउज़र कॉन्फ़िगरेशन, प्रॉक्सी रोटेशन, यथार्थवादी headers और प्रदर्शन अनुकूलन विश्वसनीय काम की कुंजी हैं।

बड़े पैमाने पर पार्सिंग के लिए गोपनीयता की उच्च आवश्यकताओं के साथ, आवासीय प्रॉक्सी उपयुक्त हैं, जो सामान्य उपयोगकर्ताओं की तरह दिखते हैं और अधिकांश बॉट सुरक्षा को बायपास करते हैं।

```