वेब स्क्रैपिंग ब्राउज़र प्रॉक्सी ट्रैफ़िक ऑप्टिमाइज़ेशन समाधान
परिचय
डेटा स्क्रैपिंग के लिए Puppeteer का उपयोग करते समय, ट्रैफ़िक की खपत एक महत्वपूर्ण विचार है। विशेष रूप से प्रॉक्सी सेवाओं का उपयोग करते समय, ट्रैफ़िक लागत में काफी वृद्धि हो सकती है। ट्रैफ़िक उपयोग को अनुकूलित करने के लिए, हम निम्नलिखित रणनीतियों को अपना सकते हैं:
- संसाधन अवरोधन: अनावश्यक संसाधन अनुरोधों को रोककर ट्रैफ़िक की खपत को कम करें।
- अनुरोध URL अवरोधन: URL विशेषताओं के आधार पर विशिष्ट अनुरोधों को रोककर ट्रैफ़िक को और कम करें।
- मोबाइल उपकरणों का अनुकरण: हल्के पृष्ठ संस्करण प्राप्त करने के लिए मोबाइल डिवाइस कॉन्फ़िगरेशन का उपयोग करें।
- व्यापक अनुकूलन: सर्वोत्तम परिणाम प्राप्त करने के लिए उपरोक्त विधियों को मिलाएँ।
ऑप्टिमाइज़ेशन योजना 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"> | पृष्ठ पर न्यूनतम प्रभाव | ⭐ सुरक्षित |
stylesheet | CSS स्टाइलशीट | बाहरी CSS फ़ाइलें | पृष्ठ शैलियाँ खो जाती हैं, लेआउट को प्रभावित कर सकती हैं | ⚠️ सावधानी |
websocket | वेबसोकेट | वास्तविक समय संचार कनेक्शन | वास्तविक समय कार्यक्षमता अक्षम | ⚠️ सावधानी |
eventsource | सर्वर-सेंट ईवेंट्स | सर्वर पुश डेटा | पुश कार्यक्षमता अक्षम | ⚠️ सावधानी |
preflight | CORS प्रीफ़्लाइट अनुरोध | OPTIONS अनुरोध | क्रॉस-ओरिजिन अनुरोध विफल | ⚠️ सावधानी |
script | जावास्क्रिप्ट स्क्रिप्ट | बाहरी JS फ़ाइलें | गतिशील कार्यक्षमता अक्षम, SPA रेंडर नहीं हो सकता है | ❌ बचें |
xhr | XHR अनुरोध | 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 अवरोधन रणनीतियाँ
- डोमेन द्वारा अवरोधन: किसी विशिष्ट डोमेन से सभी अनुरोधों को ब्लॉक करें
- पथ द्वारा अवरोधन: किसी विशिष्ट पथ से अनुरोधों को ब्लॉक करें
- फ़ाइल प्रकार द्वारा अवरोधन: विशिष्ट एक्सटेंशन वाली फ़ाइलों को ब्लॉक करें
- कीवर्ड द्वारा अवरोधन: उन अनुरोधों को ब्लॉक करें जिनके 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 संसाधन | स्थिर संसाधन CDN | cdn.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: मोबाइल उपकरणों का अनुकरण
मोबाइल उपकरणों का अनुकरण एक अन्य प्रभावी ट्रैफ़िक अनुकूलन रणनीति है क्योंकि मोबाइल वेबसाइटें आमतौर पर हल्की पृष्ठ सामग्री प्रदान करती हैं।
मोबाइल डिवाइस सिमुलेशन के लाभ
- हल्के पृष्ठ संस्करण: कई वेबसाइट मोबाइल उपकरणों के लिए अधिक संक्षिप्त सामग्री प्रदान करती हैं
- छोटे छवि संसाधन: मोबाइल संस्करण आमतौर पर छोटी छवियाँ लोड करते हैं
- सरलीकृत CSS और जावास्क्रिप्ट: मोबाइल संस्करण आमतौर पर सरलीकृत शैलियों और स्क्रिप्ट का उपयोग करते हैं
- विज्ञापनों और गैर-कोर सामग्री में कमी: मोबाइल संस्करण अक्सर कुछ गैर-कोर कार्यक्षमता को हटा देते हैं
- अनुकूली प्रतिक्रिया: छोटी स्क्रीन के लिए अनुकूलित सामग्री लेआउट प्राप्त करें
मोबाइल डिवाइस सिमुलेशन कॉन्फ़िगरेशन
यहाँ कई सामान्य रूप से उपयोग किए जाने वाले मोबाइल उपकरणों के लिए कॉन्फ़िगरेशन पैरामीटर दिए गए हैं:
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 % |
उपरोक्त अनुकूलन योजनाओं को मिलाकर, प्रॉक्सी ट्रैफ़िक की खपत को काफी कम किया जा सकता है, स्क्रैपिंग दक्षता में सुधार किया जा सकता है, और यह सुनिश्चित किया जा सकता है कि आवश्यक मुख्य सामग्री प्राप्त हो।