Scraping Browserगाइडअनुकूलन लागत

वेब स्क्रैपिंग ब्राउज़र प्रॉक्सी ट्रैफ़िक ऑप्टिमाइज़ेशन समाधान

परिचय

डेटा स्क्रैपिंग के लिए Puppeteer का उपयोग करते समय, ट्रैफ़िक की खपत एक महत्वपूर्ण विचार है। विशेष रूप से प्रॉक्सी सेवाओं का उपयोग करते समय, ट्रैफ़िक लागत में काफी वृद्धि हो सकती है। ट्रैफ़िक उपयोग को अनुकूलित करने के लिए, हम निम्नलिखित रणनीतियों को अपना सकते हैं:

  1. संसाधन अवरोधन: अनावश्यक संसाधन अनुरोधों को रोककर ट्रैफ़िक की खपत को कम करें।
  2. अनुरोध URL अवरोधन: URL विशेषताओं के आधार पर विशिष्ट अनुरोधों को रोककर ट्रैफ़िक को और कम करें।
  3. मोबाइल उपकरणों का अनुकरण: हल्के पृष्ठ संस्करण प्राप्त करने के लिए मोबाइल डिवाइस कॉन्फ़िगरेशन का उपयोग करें।
  4. व्यापक अनुकूलन: सर्वोत्तम परिणाम प्राप्त करने के लिए उपरोक्त विधियों को मिलाएँ।

ऑप्टिमाइज़ेशन योजना 1: संसाधन अवरोधन

संसाधन अवरोधन परिचय

Puppeteer में, page.setRequestInterception(true) ब्राउज़र द्वारा शुरू किए गए प्रत्येक नेटवर्क अनुरोध को कैप्चर कर सकता है और जारी रखने (request.continue()), समाप्त करने (request.abort()), या प्रतिक्रिया को अनुकूलित करने (request.respond()) का निर्णय ले सकता है।

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

अवरोध्य संसाधन प्रकार और सुझाव

संसाधन प्रकारविवरणउदाहरणअवरोधन के बाद प्रभावअनुशंसा
imageछवि संसाधनJPG/PNG/GIF/WebP छवियाँछवियाँ प्रदर्शित नहीं होंगी⭐ सुरक्षित
fontफ़ॉन्ट फ़ाइलेंTTF/WOFF/WOFF2 फ़ॉन्ट्सइसके बजाय सिस्टम डिफ़ॉल्ट फ़ॉन्ट्स का उपयोग किया जाएगा⭐ सुरक्षित
mediaमीडिया फ़ाइलेंवीडियो/ऑडियो फ़ाइलेंमीडिया सामग्री नहीं चल पाएगी⭐ सुरक्षित
manifestवेब ऐप मैनिफेस्टPWA कॉन्फ़िगरेशन फ़ाइलPWA कार्यक्षमता प्रभावित हो सकती है⭐ सुरक्षित
prefetchप्रीफ़ेच संसाधन<link rel="prefetch">पृष्ठ पर न्यूनतम प्रभाव⭐ सुरक्षित
stylesheetCSS स्टाइलशीटबाहरी CSS फ़ाइलेंपृष्ठ शैलियाँ खो जाती हैं, लेआउट को प्रभावित कर सकती हैं⚠️ सावधानी
websocketवेबसोकेटवास्तविक समय संचार कनेक्शनवास्तविक समय कार्यक्षमता अक्षम⚠️ सावधानी
eventsourceसर्वर-सेंट ईवेंट्ससर्वर पुश डेटापुश कार्यक्षमता अक्षम⚠️ सावधानी
preflightCORS प्रीफ़्लाइट अनुरोधOPTIONS अनुरोधक्रॉस-ओरिजिन अनुरोध विफल⚠️ सावधानी
scriptजावास्क्रिप्ट स्क्रिप्टबाहरी JS फ़ाइलेंगतिशील कार्यक्षमता अक्षम, SPA रेंडर नहीं हो सकता है❌ बचें
xhrXHR अनुरोधAJAX डेटा अनुरोधगतिशील डेटा प्राप्त करने में असमर्थ❌ बचें
fetchफ़ेच अनुरोधआधुनिक AJAX अनुरोधगतिशील डेटा प्राप्त करने में असमर्थ❌ बचें
documentमुख्य दस्तावेज़HTML पृष्ठ स्वयंपृष्ठ लोड नहीं हो सकता❌ बचें

अनुशंसा स्तर स्पष्टीकरण:

  • सुरक्षित: अवरोधन का डेटा स्क्रैपिंग या पहले स्क्रीन रेंडरिंग पर लगभग कोई प्रभाव नहीं पड़ता है; डिफ़ॉल्ट रूप से ब्लॉक करने की अनुशंसा की जाती है।
  • ⚠️ सावधानी: शैलियों, वास्तविक समय कार्यों या क्रॉस-ओरिजिन अनुरोधों को तोड़ सकता है; व्यावसायिक निर्णय की आवश्यकता है।
  • बचें: SPA/गतिशील साइटों के सामान्य रूप से रेंडर करने या डेटा प्राप्त करने में विफल होने की उच्च संभावना है, जब तक कि आप निश्चित न हों कि आपको इन संसाधनों की आवश्यकता नहीं है।

संसाधन अवरोधन उदाहरण कोड

import puppeteer from 'puppeteer-core';
 
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
async function scrapeWithResourceBlocking(url) {
    const browser = await puppeteer.connect({
        browserWSEndpoint: scrapelessUrl,
        defaultViewport: null
    });
    const page = await browser.newPage();
 
    // अनुरोध अवरोधन सक्षम करें
    await page.setRequestInterception(true);
 
    // ब्लॉक करने के लिए संसाधन प्रकार परिभाषित करें
    const BLOCKED_TYPES = new Set([
        'image',
        'font',
        'media',
        'stylesheet',
    ]);
 
    // अनुरोधों को रोकें
    page.on('request', (request) => {
        if (BLOCKED_TYPES.has(request.resourceType())) {
            request.abort();
            console.log(`Blocked: ${request.resourceType()} - ${request.url().substring(0, 50)}...`);
        } else {
            request.continue();
        }
    });
 
    await page.goto(url, {waitUntil: 'domcontentloaded'});
 
    // डेटा निकालें
    const data = await page.evaluate(() => {
        return {
            title: document.title,
            content: document.body.innerText.substring(0, 1000)
        };
    });
 
    await browser.close();
    return data;
}
 
// उपयोग
scrapeWithResourceBlocking('https://www.scrapeless.com')
    .then(data => console.log('Scraping result:', data))
    .catch(error => console.error('Scraping failed:', error));

ऑप्टिमाइज़ेशन योजना 2: अनुरोध URL अवरोधन

संसाधन प्रकार द्वारा अवरोधन के अलावा, URL विशेषताओं के आधार पर अधिक सूक्ष्म अवरोधन नियंत्रण किया जा सकता है। यह विज्ञापनों, विश्लेषण स्क्रिप्ट और अन्य अनावश्यक तृतीय-पक्ष अनुरोधों को अवरुद्ध करने के लिए विशेष रूप से प्रभावी है।

URL अवरोधन रणनीतियाँ

  1. डोमेन द्वारा अवरोधन: किसी विशिष्ट डोमेन से सभी अनुरोधों को ब्लॉक करें
  2. पथ द्वारा अवरोधन: किसी विशिष्ट पथ से अनुरोधों को ब्लॉक करें
  3. फ़ाइल प्रकार द्वारा अवरोधन: विशिष्ट एक्सटेंशन वाली फ़ाइलों को ब्लॉक करें
  4. कीवर्ड द्वारा अवरोधन: उन अनुरोधों को ब्लॉक करें जिनके URL में विशिष्ट कीवर्ड हैं

सामान्य अवरोध्य URL पैटर्न

URL पैटर्नविवरणउदाहरणअनुशंसा
विज्ञापन सेवाएँविज्ञापन नेटवर्क डोमेनad.doubleclick.net, googleadservices.com⭐ सुरक्षित
विश्लेषण सेवाएँसांख्यिकी और विश्लेषण स्क्रिप्टgoogle-analytics.com, hotjar.com⭐ सुरक्षित
सोशल मीडिया प्लगइन्ससोशल शेयरिंग बटन, आदि।platform.twitter.com, connect.facebook.net⭐ सुरक्षित
ट्रैकिंग पिक्सेलपिक्सेल जो उपयोगकर्ता व्यवहार को ट्रैक करते हैंURL जिसमें pixel, beacon, tracker शामिल हैं⭐ सुरक्षित
बड़ी मीडिया फ़ाइलेंबड़ी वीडियो, ऑडियो फ़ाइलें.mp4, .webm, .mp3 जैसे एक्सटेंशन⭐ सुरक्षित
फ़ॉन्ट सेवाएँऑनलाइन फ़ॉन्ट सेवाएँfonts.googleapis.com, use.typekit.net⭐ सुरक्षित
CDN संसाधनस्थिर संसाधन CDNcdn.jsdelivr.net, unpkg.com⚠️ सावधानी

URL अवरोधन उदाहरण कोड

import puppeteer from 'puppeteer-core';
 
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
async function scrapeWithUrlBlocking(url) {
    const browser = await puppeteer.connect({
        browserWSEndpoint: scrapelessUrl,
        defaultViewport: null
    });
    const page = await browser.newPage();
 
    // अनुरोध अवरोधन सक्षम करें
    await page.setRequestInterception(true);
 
    // ब्लॉक करने के लिए डोमेन और URL पैटर्न परिभाषित करें
    const BLOCKED_DOMAINS = [
        'google-analytics.com',
        'googletagmanager.com',
        'doubleclick.net',
        'facebook.net',
        'twitter.com',
        'linkedin.com',
        'adservice.google.com',
    ];
 
    const BLOCKED_PATHS = [
        '/ads/',
        '/analytics/',
        '/pixel/',
        '/tracking/',
        '/stats/',
    ];
 
    // अनुरोधों को रोकें
    page.on('request', (request) => {
        const url = request.url();
 
        // डोमेन जांचें
        if (BLOCKED_DOMAINS.some(domain => url.includes(domain))) {
            request.abort();
            console.log(`Blocked domain: ${url.substring(0, 50)}...`);
            return;
        }
 
        // पथ जांचें
        if (BLOCKED_PATHS.some(path => url.includes(path))) {
            request.abort();
            console.log(`Blocked path: ${url.substring(0, 50)}...`);
            return;
        }
 
        // अन्य अनुरोधों की अनुमति दें
        request.continue();
    });
 
    await page.goto(url, {waitUntil: 'domcontentloaded'});
 
    // डेटा निकालें
    const data = await page.evaluate(() => {
        return {
            title: document.title,
            content: document.body.innerText.substring(0, 1000)
        };
    });
 
    await browser.close();
    return data;
}
 
// उपयोग
scrapeWithUrlBlocking('https://www.scrapeless.com')
    .then(data => console.log('Scraping result:', data))
    .catch(error => console.error('Scraping failed:', error));

ऑप्टिमाइज़ेशन योजना 3: मोबाइल उपकरणों का अनुकरण

मोबाइल उपकरणों का अनुकरण एक अन्य प्रभावी ट्रैफ़िक अनुकूलन रणनीति है क्योंकि मोबाइल वेबसाइटें आमतौर पर हल्की पृष्ठ सामग्री प्रदान करती हैं।

मोबाइल डिवाइस सिमुलेशन के लाभ

  1. हल्के पृष्ठ संस्करण: कई वेबसाइट मोबाइल उपकरणों के लिए अधिक संक्षिप्त सामग्री प्रदान करती हैं
  2. छोटे छवि संसाधन: मोबाइल संस्करण आमतौर पर छोटी छवियाँ लोड करते हैं
  3. सरलीकृत CSS और जावास्क्रिप्ट: मोबाइल संस्करण आमतौर पर सरलीकृत शैलियों और स्क्रिप्ट का उपयोग करते हैं
  4. विज्ञापनों और गैर-कोर सामग्री में कमी: मोबाइल संस्करण अक्सर कुछ गैर-कोर कार्यक्षमता को हटा देते हैं
  5. अनुकूली प्रतिक्रिया: छोटी स्क्रीन के लिए अनुकूलित सामग्री लेआउट प्राप्त करें

मोबाइल डिवाइस सिमुलेशन कॉन्फ़िगरेशन

यहाँ कई सामान्य रूप से उपयोग किए जाने वाले मोबाइल उपकरणों के लिए कॉन्फ़िगरेशन पैरामीटर दिए गए हैं:

const iPhoneX = {
    viewport: {
        width: 375,
        height: 812,
        deviceScaleFactor: 3,
        isMobile: true,
        hasTouch: true,
        isLandscape: false
    }
};

या सीधे puppeteer के अंतर्निहित तरीकों का उपयोग करके मोबाइल उपकरणों का अनुकरण करें

import { KnownDevices } from 'puppeteer-core';
const iPhone = KnownDevices['iPhone 15 Pro'];
 
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.emulate(iPhone);

मोबाइल डिवाइस सिमुलेशन उदाहरण कोड

import puppeteer, {KnownDevices} from 'puppeteer-core';
 
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
async function scrapeWithMobileEmulation(url) {
    const browser = await puppeteer.connect({
        browserWSEndpoint: scrapelessUrl,
        defaultViewport: null
    });
 
    const page = await browser.newPage();
 
    // मोबाइल डिवाइस सिमुलेशन सेट करें
    const iPhone = KnownDevices['iPhone 15 Pro'];
    await page.emulate(iPhone);
 
    await page.goto(url, {waitUntil: 'domcontentloaded'});
    // डेटा निकालें
    const data = await page.evaluate(() => {
        return {
            title: document.title,
            content: document.body.innerText.substring(0, 1000)
        };
    });
 
    await browser.close();
    return data;
}
 
// उपयोग
scrapeWithMobileEmulation('https://www.scrapeless.com')
    .then(data => console.log('Scraping result:', data))
    .catch(error => console.error('Scraping failed:', error));

व्यापक अनुकूलन उदाहरण

यहाँ सभी अनुकूलन योजनाओं को मिलाकर एक व्यापक उदाहरण दिया गया है:

import puppeteer, {KnownDevices} from 'puppeteer-core';
 
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
async function optimizedScraping(url) {
    console.log(`Starting optimized scraping: ${url}`);
 
    // ट्रैफ़िक उपयोग रिकॉर्ड करें
    let totalBytesUsed = 0;
 
    const browser = await puppeteer.connect({
        browserWSEndpoint: scrapelessUrl,
        defaultViewport: null
    });
 
    const page = await browser.newPage();
 
    // मोबाइल डिवाइस सिमुलेशन सेट करें
    const iPhone = KnownDevices['iPhone 15 Pro'];
    await page.emulate(iPhone);
 
    // अनुरोध अवरोधन सेट करें
    await page.setRequestInterception(true);
 
    // ब्लॉक करने के लिए संसाधन प्रकार परिभाषित करें
    const BLOCKED_TYPES = [
        'image',
        'media',
        'font'
    ];
 
    // ब्लॉक करने के लिए डोमेन परिभाषित करें
    const BLOCKED_DOMAINS = [
        'google-analytics.com',
        'googletagmanager.com',
        'facebook.net',
        'doubleclick.net',
        'adservice.google.com'
    ];
 
    // ब्लॉक करने के लिए URL पथ परिभाषित करें
    const BLOCKED_PATHS = [
        '/ads/',
        '/analytics/',
        '/tracking/'
    ];
 
    // अनुरोधों को रोकें
    page.on('request', (request) => {
        const url = request.url();
        const resourceType = request.resourceType();
 
        // संसाधन प्रकार जांचें
        if (BLOCKED_TYPES.includes(resourceType)) {
            console.log(`Blocked resource type: ${resourceType} - ${url.substring(0, 50)}...`);
            request.abort();
            return;
        }
 
        // डोमेन जांचें
        if (BLOCKED_DOMAINS.some(domain => url.includes(domain))) {
            console.log(`Blocked domain: ${url.substring(0, 50)}...`);
            request.abort();
            return;
        }
 
        // पथ जांचें
        if (BLOCKED_PATHS.some(path => url.includes(path))) {
            console.log(`Blocked path: ${url.substring(0, 50)}...`);
            request.abort();
            return;
        }
 
        // अन्य अनुरोधों की अनुमति दें
        request.continue();
    });
 
    // नेटवर्क ट्रैफ़िक की निगरानी करें
    page.on('response', async (response) => {
        const headers = response.headers();
        const contentLength = headers['content-length'] ? parseInt(headers['content-length'], 10) : 0;
        totalBytesUsed += contentLength;
    });
 
    await page.goto(url, {waitUntil: 'domcontentloaded'});
 
    // लेज़ी-लोडिंग सामग्री को ट्रिगर करने के लिए स्क्रॉलिंग का अनुकरण करें
    await page.evaluate(() => {
        window.scrollBy(0, window.innerHeight);
    });
 
    await new Promise(resolve => setTimeout(resolve, 1000))
 
    // डेटा निकालें
    const data = await page.evaluate(() => {
        return {
            title: document.title,
            content: document.body.innerText.substring(0, 1000),
            links: Array.from(document.querySelectorAll('a')).slice(0, 10).map(a => ({
                text: a.innerText,
                href: a.href
            }))
        };
    });
 
    // ट्रैफ़िक उपयोग सांख्यिकी आउटपुट करें
    console.log(`\nTraffic Usage Statistics:`);
    console.log(`Used: ${(totalBytesUsed / 1024 / 1024).toFixed(2)} MB`);
 
    await browser.close();
    return data;
}
 
// उपयोग
optimizedScraping('https://www.scrapeless.com')
    .then(data => console.log('Scraping complete:', data))
    .catch(error => console.error('Scraping failed:', error));

अनुकूलन तुलना

ट्रैफ़िक की तुलना करने के लिए हम व्यापक उदाहरण से अनुकूलित कोड को हटाने का प्रयास करते हैं, अनुकूलन से पहले और बाद में। यहाँ बिना अनुकूलित उदाहरण कोड दिया गया है:

import puppeteer from 'puppeteer-core';
 
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
async function optimizedScraping(url) {
  console.log(`Starting optimized scraping: ${url}`);
 
  // ट्रैफ़िक उपयोग रिकॉर्ड करें
  let totalBytesUsed = 0;
 
  const browser = await puppeteer.connect({
    browserWSEndpoint: scrapelessUrl,
    defaultViewport: null
  });
 
  const page = await browser.newPage();
 
  // अनुरोध अवरोधन सेट करें
  await page.setRequestInterception(true);
 
  // अनुरोधों को रोकें
  page.on('request', (request) => {
    request.continue();
  });
 
  // नेटवर्क ट्रैफ़िक की निगरानी करें
  page.on('response', async (response) => {
    const headers = response.headers();
    const contentLength = headers['content-length'] ? parseInt(headers['content-length'], 10) : 0;
    totalBytesUsed += contentLength;
  });
 
  await page.goto(url, {waitUntil: 'domcontentloaded'});
 
  // लेज़ी-लोडिंग सामग्री को ट्रिगर करने के लिए स्क्रॉलिंग का अनुकरण करें
  await page.evaluate(() => {
    window.scrollBy(0, window.innerHeight);
  });
 
  await new Promise(resolve => setTimeout(resolve, 1000))
 
  // डेटा निकालें
  const data = await page.evaluate(() => {
    return {
      title: document.title,
      content: document.body.innerText.substring(0, 1000),
      links: Array.from(document.querySelectorAll('a')).slice(0, 10).map(a => ({
        text: a.innerText,
        href: a.href
      }))
    };
  });
 
  // ट्रैफ़िक उपयोग सांख्यिकी आउटपुट करें
  console.log(`\nTraffic Usage Statistics:`);
  console.log(`Used: ${(totalBytesUsed / 1024 / 1024).toFixed(2)} MB`);
 
  await browser.close();
  return data;
}
 
// उपयोग
optimizedScraping('https://www.scrapeless.com')
  .then(data => console.log('Scraping complete:', data))
  .catch(error => console.error('Scraping failed:', error));

अनुकूलित कोड को चलाने के बाद, हम मुद्रित जानकारी से ट्रैफ़िक अंतर को बहुत सहज रूप से देख सकते हैं:

परिदृश्यट्रैफ़िक उपयोग (MB)बचत अनुपात
बिना अनुकूलित6.03
अनुकूलित0.81≈ 86.6 %

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