जावास्क्रिप्ट के साथ वेब स्क्रैपिंग: एक व्यावहारिक Node.js गाइड

जावास्क्रिप्ट के साथ वेब स्क्रैपिंग

स्क्रेपलेस यूनिवर्सल स्क्रैपिंग एपीआई जावास्क्रिप्ट प्रोग्रामों को एक प्रमाणित HTTP अनुरोध के माध्यम से प्राप्य या प्रस्तुत पृष्ठ सामग्री प्रदान करता है।

TL;DR

  • जावास्क्रिप्ट स्क्रैपिंग की शुरुआत एक पृष्ठ वर्गीकरण के साथ होती है। जवाब शरीर में आवश्यक फ़ील्ड्स मौजूद हैं जब HTTP क्लाइंट और HTML पार्सर का उपयोग करें; जब स्क्रिप्ट बाद में उन्हें बनाते हैं तो ब्राउज़र रेंडरिंग का उपयोग करें।
  • चेरीओ मार्कअप को पार्स करता है लेकिन पृष्ठ स्क्रिप्ट नहीं चलाता। वह सीमा चेरीओ को सर्वर-रेंडर किए गए पृष्ठों के लिए अच्छा फ़िट और केवल क्लाइंट सामग्री के लिए खराब फ़िट बनाती है।
  • चयनकर्ताओं को अर्थ का वर्णन करना चाहिए, दृश्यता का नहीं। स्थिर विशेषताएँ, अर्थपूर्ण तत्व और स्कोप्ड संबंध पुन: डिज़ाइन को बेहतर ढंग से सहन करते हैं बनिस्बत लंबे उत्पन्न किए गए वर्ग श्रृंखलाओं के।
  • पेजिनेशन को एक स्पष्ट रोकने के नियम की आवश्यकता होती है। एक सत्यापित अगले लिंक का पालन करें या कोर्सर का दस्तावेज़ीकरण करें और जब स्रोत कहता है कि संग्रह समाप्त हो गया है, तब रोकें।
  • उत्पादन आउटपुट के लिए एक स्कीमा की आवश्यकता होती है। पाठ को सामान्य बनाएं, URL को हल करें, नल योग्य फ़ील्ड्स को संरक्षित करें, और संग्रहण से पहले प्रत्येक रिकॉर्ड को मान्य करें।

जावास्क्रिप्ट वेब स्क्रैपिंग कैसे काम करता है

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

पहला निर्णय यह है कि क्या प्रतिक्रिया में पहले से ही डेटा है। ब्राउज़र डेवलपर टूल खोलें, नेटवर्क प्रतिक्रिया या पृष्ठ स्रोत का निरीक्षण करें, और स्क्रीन पर दिखाई देने वाले मान के लिए खोजें। यदि वह मान लौटाए गए HTML में दिखाई देता है, तो एक हल्का पार्सर पर्याप्त है। यदि प्रतिक्रिया केवल एक खोल है और मान जावास्क्रिप्ट रन होने के बाद दिखाई देता है, तो अधिग्रहण परत को पृष्ठ प्रस्तुत करना चाहिए या एक अनुमत संरचित एंडपॉइंट को कॉल करना चाहिए।

आधुनिक Node.js एक ब्राउज़र-संगत वैश्विक फेच इंटरफेसप्रदर्शित करता है। फेच एक प्रतिक्रिया वस्तु लौटाता है; कॉल करना text() HTML पढ़ता है। प्रतिक्रिया स्थिति अभी भी मायने रखती है। एक लॉगिन पृष्ठ, सहमति स्क्रीन, या एक्सेस-निषेधित दस्तावेज़ वैध HTML हो सकते हैं, इसलिए सफल पार्सिंग यह साबित नहीं करती है कि सही पृष्ठ आया।

चेरीओ और एक ब्राउज़र के बीच चुनाव करें

चेरीओ सही जावास्क्रिप्ट पार्सर है जब लक्षित सामग्री स्थिर HTML में मौजूद होती है। आधिकारिक चेरीओ परिचय सीमा के बारे में स्पष्ट है: चेरीओ मार्कअप को पार्स करता है और एक jQuery-वाई यात्रा API प्रदर्शित करता है, लेकिन यह एक ब्राउज़र नहीं है और जावास्क्रिप्ट चलाता नहीं है, उप संसाधन लोड नहीं करता है, या एक पृष्ठ को चित्रित नहीं करता है।

पृष्ठ की स्थितिसिफारिशित मार्गकारण
फ़ील्ड्स प्रतिक्रिया HTML में प्रकट होते हैंfetch प्लस चेरीओकम ओवरहेड और सीधे CSS चयन
स्क्रिप्ट आवश्यक नोड्स बनाते हैंप्रस्तुत अधिग्रहणप्रारंभिक प्रतिक्रिया में डेटा नहीं होता है
एक सार्वजनिक JSON प्रतिक्रिया पृष्ठ का समर्थन करती हैदस्तावेजीकृत API या अनुमत एंडपॉइंटसंरचित डेटा DOM व्याख्या से बचता है
एक क्लिक या स्क्रोल परिणाम सेट बदलता हैब्राउज़र स्वचालनकार्यप्रवाह पृष्ठ की स्थिति और घटनाओं पर निर्भर करता है

एक ब्राउज़र पथ अधिक मेमोरी और स्टार्टअप समय की लागत लाता है, इसलिए इसे एक जानबूझकर चुनाव होना चाहिए। केवल तब रेंडर करें जब डेटा या इंटरैक्शन की आवश्यकता हो। यह अलगाव परीक्षण को भी आसान बनाता है: पार्सर को सहेजे गए HTML के साथ व्यायाम किया जा सकता है, जबकि अधिग्रहण परत को नेटवर्क और पृष्ठ की स्थिति के खिलाफ परीक्षण किया जाता है।

एक छोटा स्थिर-HTML स्क्रैपर बनाएं

मूल Node.js परियोजना को चेरीओ और एक वर्तमान Node रनटाइम की आवश्यकता होती है। पैकेज स्थापित करें, एक पृष्ठ का अनुरोध करें, स्थिति की जांच करें, शरीर लोड करें, और प्रत्येक दोहराए गए कार्ड के लिए चयनकर्ता कार्य को सीमित रखें। निम्नलिखित उदाहरण उदाहरण डोमेन से शीर्षक और canonical लिंक पढ़ता है। यह जानबूझकर एक सार्वजनिक पृष्ठ तक सीमित है।

import * as cheerio from 'cheerio';

const response = await fetch('https://example.com/');
if (!response.ok) {
  throw new Error(`Unexpected HTTP status: ${response.status}`);
}

const html = await response.text();
const $ = cheerio.load(html);

const record = {
  title: $('h1').first().text().trim(),
  link: new URL($('a').first().attr('href'), response.url).href,
};

console.log(JSON.stringify(record, null, 2));

चयनकर्ता छोटा है क्योंकि पृष्ठ सरल है। कैटलॉग पर, पहले दोहराए गए कंटेनर को चुनें, फिर उस कंटेनर के अंदर बच्चे नोड का क्वेरी करें। स्कोपिंग एक सामान्य डेटा-गुणवत्ता बग को रोकता है जहां प्रत्येक पंक्ति पृष्ठ पर पहले शीर्षक या मूल्य प्राप्त करती है। गायब फ़ील्ड्स को बनना चाहिए null, न कि एक खाली स्ट्रिंग जो वास्तविक खाली मान से भिन्न नहीं है।

परिवर्तन को सहन करने वाले चयनकर्ता डिज़ाइन करें

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

Selectors Level 4 विशिष्टता ब्राउज़र और पार्सर उपकरणों में उपयोग किए जाने वाले CSS चयनकर्ता मॉडल को परिभाषित करता है। प्रथा में, सबसे सुरक्षित उपसमुच्चय आमतौर पर सरल होता है: एक फ़ील्ड के लिए एक विशेषता चयनकर्ता, एक कार्ड तक सीमित एक वंशज चयनकर्ता, और तब एक सीधा-बालक चयनकर्ता जब पदानुक्रम का अर्थ होता है। जब तक स्थिति स्वयं स्रोत अनुबंध का हिस्सा नहीं है, पदानुक्रम चयनकर्ताओं से बचें।

  • हर रिकॉर्ड को एक दोहराए गए कंटेनर पर स्थित करें। उस नोड के सापेक्ष शीर्षक, मूल्य और लिंक निकालें बजाय पूरे दस्तावेज़ के अंदर लूप में खोजने के।
  • सापेक्ष URLs को तुरंत हल करें। अंतिम प्रतिक्रिया URL के खिलाफ पूर्ण URLs बनाएँ ताकि रीडायरेक्ट और नेस्टेड पथ बाद में फ़ेच को खराब न करें।
  • केवल वही मानकों को सामान्य करें जो योजना को आवश्यक है। आसपास के whitespace को ट्रिम करें और ज्ञात संख्यात्मक प्रारूपों को पार्स करें, जबकि मूल पाठ को बनाए रखते हुए, जब व्याख्या निश्चित नहीं होती है।
  • पृष्ठ की पहचान की पुष्टि करें। पंक्तियों को स्वीकार करने से पहले एक शीर्षक, कैनोनिकल URL, या ज्ञात संरचनात्मक मार्कर की जांच करें।

पृष्ठीकरण और पृष्ठ स्थिति प्रबंधित करें।

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

यह मानने की कोशिश न करें कि एक खाली परिणाम का मतलब है कि संग्रह समाप्त हो गया। खाली पंक्तियां भी गलत क्षेत्र, सहमति मध्यवर्ती, बदलते चयनकर्ता, या ग्राहक-प्रदर्शित शेल का संकेत दे सकती हैं। प्रत्येक फ़ेच के साथ हल्के विकार संचित करें: अंतिम URL, स्थिति, सामग्री प्रकार, एक पृष्ठ-पहचान की जांच, और मिलाए गए कंटेनरों की संख्या। ये मान एक शून्य-पंक्ति परिणाम को समझाते हैं बिना पूर्ण पृष्ठ निकायों को लॉग में रखे।

निकाले गए मानों को विश्वसनीय रिकॉर्ड में बदलें।

एक JavaScript स्क्रेपर सक्षम हो जाता है जब निष्कर्षण और सामान्यीकरण अलग कार्य होते हैं। निष्कर्षण पढ़ता है कि पृष्ठ क्या कहता है। सामान्यीकरण उस पाठ को एप्लिकेशन योजना में मानचित्रित करता है। सीमा को दृश्यमान रखकर यह सुनिश्चित किया जाता है कि चयनकर्ता कोड चुपचाप व्यावसायिक निर्णय नहीं लेता, जैसे “अनुपलब्ध” को संख्यात्मक शून्य के रूप में या किसी क्षेत्रीय दशमलव प्रारूप को गलत नियमों के साथ परिवर्तित करना।

सेलेक्टर्स लिखने से पहले आवश्यक और वैकल्पिक फ़ील्ड परिभाषित करें। जब उसकी पहचान फ़ील्ड अनुपस्थित हो, तो एक रिकॉर्ड को अस्वीकार करें। वैकल्पिक फ़ील्ड को बनाए रखें जैसा कि। nullएक स्थिर स्रोत कुंजी या कैनोनिकल URL के साथ डुप्लिकेट करें, न कि एक परिवर्तनशील शीर्षक के साथ। संग्रहण परत में अधिग्रहण टाइमस्टैम्प जोड़ें, न कि पृष्ठ घड़ी को स्क्रैप करके।

स्केलिंग से पहले पाइपलाइन का परीक्षण करें।

पार्सर परीक्षणों के लिए.saved फ़िक्स्चर्स के साथ शुरू करें। एक सामान्य पृष्ठ के लिए एक प्रतिनिधि HTML फ़ाइल रखें, एक जिसके पास एक अनुपस्थित वैकल्पिक फ़ील्ड है, और एक जो पहचान की जांच को विफल करना चाहिए। ये फ़िक्स्चर चयनकर्ता परिवर्तनों की समीक्षा योग्य बनाते हैं और पार्सर परीक्षणों को नेटवर्क उपलब्धता से स्वतंत्र रखते हैं।

एक छोटे सार्वजनिक लक्ष्य के खिलाफ अधिग्रहण का परीक्षण करें। अंतिम URL, स्थिति वर्ग, और अपेक्षित मार्कर की पुष्टि करें। HTTP अर्थशास्त्र विशिष्टता व्याख्या करती है कि स्थिति कोड प्रतिक्रिया का वर्णन करते हैं लेकिन यह साबित नहीं कर सकते कि निकाय वह व्यावसायिक पृष्ठ है जिसकी आपको अपेक्षा थी। एक वैध 200 प्रतिक्रिया अभी भी एक सहमति या खाता पृष्ठ हो सकती है।

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

निष्कर्ष

JavaScript के साथ वेब स्क्रैपिंग तब सबसे अच्छा काम करता है जब परिवहन निर्णय चयनकर्ता कार्य से पहले किया जाता है। fetch और Cheerio का उपयोग प्रतिक्रिया HTML के लिए करें, केवल तब रेंडर करें जब पृष्ठ स्क्रिप्ट या इंटरएक्शन आवश्यक राज्य बनाते हैं, और निकासी को सामान्यीकरण से अलग रखें। परिणाम एक छोटे सिस्टम के साथ स्पष्ट विफलता संकेतों और परीक्षणों के साथ होता है जो स्रोत लेआउट बदलने पर भी उपयोगी रहते हैं।

क्या आप JavaScript डेटा कार्यप्रवाह बनाने के लिए तैयार हैं?

Scrapeless से एक Node.js अधिग्रहण परत को कनेक्ट करें, अपने मौजूदा चयनकर्ताओं को बनाए रखें, और एक बाउंडेड सार्वजनिक-डेटा कार्यप्रवाह को एक छोर से दूसरे छोर तक मान्य करें।

आज साइन अप करें और पाएं $5 का मुफ्त क्रेडिटक्रेडिट कार्ड की आवश्यकता नहीं है.

अपने $5 क्रेडिट का दावा करें →

अक्सर पूछे जाने वाले प्रश्न

क्या JavaScript बिना ब्राउज़र के एक वेबसाइट को स्क्रैप कर सकता है?

हाँ। JavaScript एक HTTP क्लाइंट और एक HTML पार्सर जैसे Cheerio के साथ एक सर्वर-रेंडर किया गया पृष्ठ स्क्रैप कर सकता है। एक ब्राउज़र केवल तब आवश्यक होता है जब आवश्यक सामग्री पृष्ठ स्क्रिप्ट द्वारा उत्पन्न होती है या इंटरएक्शन पर निर्भर होती है।

Cheerio स्क्रीन पर दृश्य सामग्री के लिए कोई तत्व क्यों लौटाता है?

Cheerio कोई तत्व लौटाता है जब वे नोड HTML में अनुपस्थित होते हैं जो उसने प्राप्त किया। पृष्ठ के स्रोत की तुलना लाइव DOM के साथ करें; यदि स्क्रिप्ट नोड बनाते हैं, तो रेंडर अधिग्रहण या अनुमत संरचित स्रोत का उपयोग करें।

क्या एक JavaScript स्क्रेपर को CSS चयनकर्ताओं या XPath का उपयोग करना चाहिए?

CSS चयनकर्ता आम तौर पर Node.js पार्सर्स और ब्राउज़र APIs में व्यावहारिक डिफ़ॉल्ट होते हैं। XPath कुछ संबंध-गहन प्रश्नों को व्यक्त कर सकता है, लेकिन चयनकर्ता की स्थिरता और स्पष्ट स्कोपिंग प्रश्न भाषा की तुलना में अधिक महत्वपूर्ण हैं।

एक JavaScript स्क्रेपर को बदलते मार्कअप को कैसे संभालना चाहिए?

एक JavaScript स्क्रेपर को एक स्पष्ट संरचना जांच में विफल होना चाहिए, एक छोटा विकार कैप्चर करना चाहिए, और एक चयनकर्ता अपडेट की आवश्यकता होनी चाहिए। शून्य मेलों को सफल खाली पृष्ठ के रूप में मान लेना टूटने को छुपाता है और मान्य डाउनस्ट्रीम डेटा को नष्ट कर सकता है।

क्या JavaScript के साथ वेब स्क्रैपिंग कानूनी है?

JavaScript के साथ वेब स्क्रैपिंग एक सार्वभौमिक नियम द्वारा नियंत्रित नहीं है। अधिकृत सार्वजनिक डेटा को एकत्रित करने तक सीमित रखें, लागू कानून और साइट के नियमों की समीक्षा करें, एक्सेस नियंत्रणों का सम्मान करें, और संवेदनशील या उच्च-प्रभाव वाले उपयोग के मामलों के लिए कानूनी सलाह लें।

संदर्भ