रस्ट के साथ वेब स्क्रैपिंग
स्क्रेपलेस यूनिवर्सल स्क्रैपिंग API एक पारंपरिक प्रमाणित HTTP अनुरोध के माध्यम से रस्ट क्लाइंटों को फेच या रेंडर किया गया HTML प्रदान करता है।
TL;DR
- रस्ट त्रुटि पथों को प्रोग्राम आकार का हिस्सा बनाता है। HTTP विफलता, लापता फ़ील्ड, अवैध चयनकर्ता, और आउटपुट रूपांतरण को मौन खाली मानों के बजाय स्पष्ट परिणामों के रूप में प्रदर्शित किया जा सकता है।
- reqwest ट्रांसपोर्ट को संभालता है और स्क्रैपर HTML को संभालता है। क्रेट्स के पास अलग-अलग कार्य हैं, जो उस समय अधिग्रहण को प्रतिस्थापनीय बनाते हैं जब किसी पृष्ठ को रेंडर करने की आवश्यकता होती है।
- Tokio सीमाबद्ध समवर्ती अनुरोधों का समर्थन करता है। साझा क्लाइंट और नियंत्रित कार्य सेट थ्रूपुट में सुधार करते हैं बिना खोज को अनियंत्रित फैलाव में बदलें।
- चयनकर्ताओं को एक बार संकलित किया जाना चाहिए। रिकॉर्ड लूप से पहले CSS चयनकर्ताओं को पार्स करें और जब चयनकर्ता अमान्य हो तो एक स्टार्टअप त्रुटि लौटाएं।
- शून्य मेलों की आवश्यकता होती है निदान। एक क्लाइंट-रेंडर की गई शेल, गलत पृष्ठ पहचान, या बदल markup सभी मान्य HTML उत्पन्न कर सकते हैं जिसमें कोई रिकॉर्ड नहीं होता है।
जहां रस्ट मूल्य जोड़ता है
रस्ट के साथ वेब स्क्रैपिंग अनियंत्रित संग्राहकों के लिए उपयुक्त है जहां प्रीडिक्टेबल मेमोरी उपयोग, स्पष्ट विफलताएँ, और नियंत्रित समवर्तीता तेजी से इंटरएक्टिव प्रयोग से अधिक महत्वपूर्ण हैं। रस्ट अपने आप में चयनकर्ताओं को और अधिक सटीक नहीं बनाता है। यह नेटवर्क, पार्सिंग, और स्टोरेज के चारों ओर की सीमाओं को नज़रअंदाज़ करना और कठिन बनाता है।
सामान्य स्टैक में HTTP के लिए reqwest, HTML पार्सिंग और CSS चयन के लिए स्क्रैपर, और असिंक्रोनस रनटाइम के लिए Tokio शामिल है। reqwest प्रलेखन कई अनुरोध करने पर एक क्लाइंट पुन: उपयोग करने की सिफारिश करता है ताकि प्रोग्राम कनेक्शन पूलिंग का लाभ उठा सके। यह कार्यों के बीच साझा एक कॉन्फ़िगर किया गया क्लाइंट के साथ एक क्रॉलर सेवा पर स्वाभाविक रूप से मैप करता है।
पार्सर को ट्रांसपोर्ट से स्वतंत्र रखें। एक फ़ंक्शन जो स्वीकार करती है &str और टाइप किए गए रिकॉर्ड को वापस करती है उसे सहेजे गए HTML के खिलाफ परीक्षण किया जा सकता है। नेटवर्क फ़ंक्शन तब सर्वर HTML, एक रेंडर किया गया दस्तावेज़, या बिना निकासी लॉजिक को बदलते हुए एक फ़िक्स्चर वापस कर सकता है।
रस्ट स्क्रैपिंग स्टैक को मैप करें
| चिंता | रस्ट चुनाव | डिज़ाइन नोट |
|---|---|---|
| HTTP | reqwest क्लाइंट | क्लाइंट का पुनः उपयोग करें और डेटा पढ़ने से पहले स्थिति की जांच करें |
| HTML | स्क्रैपर क्रेट | एक दस्तावेज़ पेड़ को पार्स करें और CSS चयनकर्ताओं के साथ क्वेरी करें |
| असिंक्रोनस रनटाइम | Tokio | सीमाबद्ध नेटवर्क कार्यों को चलाएं |
| रिकॉर्ड | संरचनाएँ प्लस सेर्डे | आवश्यक और वैकल्पिक फ़ील्ड को दृश्यमान बनाएं |
| मान्यता | परिणाम और कस्टम त्रुटियाँ | गलत पृष्ठों को अस्वीकार करें और असंभव मेल की गिनती करें |
पार्सर क्रेट एक HTML पार्सिंग मॉडल पर आधारित है बजाय इसके कि मार्कअप को स्वच्छ टेक्स्ट के रूप में माना जाए। HTML पार्सिंग स्पेशिफिकेशन व्याख्या करता है कि एक दस्तावेज़ पेड़ का लिटेरल टैग अनुक्रम से भिन्न होना क्यों संभव है: पार्सर खराब नेस्टिंग को ठीक करते हैं और परिभाषित नियमों के तहत तत्वों का अनुमान लगाते हैं।
एक टाइपेड रस्ट एक्सट्रैक्टर बनाएँ
यह कोड एक स्थानीय-रनटाइम पूर्वापेक्षा है क्योंकि रस्ट वर्तमान कार्यक्षेत्र में स्थापित नहीं है। संरचना वर्तमान reqwest और स्क्रैपर APIs का पालन करती है: फ़ेच करें, अप्रत्याशित स्थिति को त्रुटि में परिवर्तित करें, टेक्स्ट पढ़ें, दस्तावेज़ को पार्स करें, फिर फ़ील्ड का चयन करें। इसे प्रोजेक्ट में reqwest, स्क्रैपर, Tokio, सेर्डे, और सेर्डे_json के साथ संकलित करें।
use scraper::{Html, Selector};
use serde::Serialize;
#[derive(Serialize)]
struct Record {
title: String,
href: Option<String>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.timeout(std::time::Duration::from_secs(20))
.build()?;
let html = client
.get("https://example.com/")
.send()
.await?
.error_for_status()?
.text()
.await?;
let document = Html::parse_document(&html);
let title_selector = Selector::parse("h1")?;
let link_selector = Selector::parse("a")?;
let title = document
.select(&title_selector)
.next()
.map(|node| node.text().collect::<String>())
.ok_or("missing page heading")?;
let href = document
.select(&link_selector)
.next()
.and_then(|node| node.value().attr("href"))
.map(str::to_owned);
println!("{}", serde_json::to_string_pretty(&Record { title, href })?);
Ok(())
}
चयनकर्ताओं को एक बार पार्स किया जाता है, निकासी से पहले। एक लापता शीर्षक एक त्रुटि बन जाता है क्योंकि यह इस उदाहरण में पृष्ठ-परिणाम फ़ील्ड है। लिंक वैकल्पिक है और इसलिए उपयोग करता है। Option<String>यह भेद टाइप सिस्टम को डेटा अनुबंध का एक हिस्सा ले जाने की अनुमति देता है।
पृष्ठ विफलता को स्पष्ट रूप से प्रदर्शित करें
एक रस्ट स्क्रैपर को परिवहन विफलता, असफल HTTP स्थिति, अप्रत्याशित सामग्री प्रकार, गलत पृष्ठ पहचान और चयनकर्ता असंगति को पहचानना चाहिए। उन राज्यों को एक खाली वेक्टर में संकुचित करना पाइपलाइन को सुधारने के लिए आवश्यक जानकारी को हटा देता है। एक कस्टम त्रुटि एनम उन श्रेणियों को मशीन-पढ़ने योग्य रख सकता है जबकि मूल त्रुटि को संदर्भ के रूप में बनाए रखता है।
यह HTTP अर्थशास्त्र विनिर्देश प्रतिक्रिया स्थिति वर्गों को परिभाषित करता है, फिर भी एक सफल स्थिति यह गारंटी नहीं देती कि अपेक्षित व्यावसायिक दस्तावेज़ आया। पुनरावृत्त पंक्तियों को पार्स करने से पहले अंतिम URL और एक संरचनात्मक मार्कर की पुष्टि करें। स्वीकार किए गए और अस्वीकृत गणनाओं को अलग से रिकॉर्ड करें।
- स्टार्टअप के दौरान चयनकर्ता स्ट्रिंग्स को संकलित करें। अवैध व्याकरण को श्रमिक को नौकरियों को स्वीकार करने से रोकना चाहिए।
- पहचान क्षेत्रों को आवश्यक के रूप में मानें। एक रिकॉर्ड बिना इसके स्थिर स्रोत कुंजी को संग्रहण तक नहीं पहुँचना चाहिए।
- वैकल्पिक मानों को विकल्प के रूप में बनाए रखें। एक अनुपस्थित मूल्य, लेखक, या समय-चिह्न को एक खाली स्ट्रिंग से अलग रहना चाहिए।
- दस्तावेज़ के आकार को जानबूझकर सीमित करें। बड़े उत्तरों को अपेक्षित पृष्ठ वर्ग से जुड़े अधिग्रहण सीमा की आवश्यकता होती है।
टोकियो समवर्तीता नियंत्रित करें।
टोकियो नेटवर्क प्रतीक्षा को ओवरलैप करना संभव बनाता है, लेकिन एक स्क्रैपिंग कार्य को अभी भी एक निश्चित बजट की आवश्यकता होती है। एक सेमाफोर, बफर्ड स्ट्रीम या श्रमिक कतार प्रति मेज़बान सक्रिय अनुरोधों को सीमित कर सकती है। क्लाइंट को सस्ते में क्लोन किया जाना चाहिए जबकि इसकी आंतरिक पूल को साझा करते हुए; कार्य सेट को डिज़ाइन द्वारा सीमित रखना चाहिए।
प्रत्येक कार्य एक संरचित परिणाम लौटाता है जिसमें स्रोत URL और या तो रिकॉर्ड या श्रेणीबद्ध विफलता होती है। उस परिणाम को एक समन्वयक के माध्यम से एकत्र करना भंडारण लेखनों और मैट्रिक्स को क्रम में रखता है। यह एक जुड़े हुए कार्य को लेखांकन पथ के बाहर विफल होने से भी रोकता है।
खोज को सीमित रखें। एक क्रॉलर जो सभी लिंक का पालन करता है बिना एक दायरा नियम के, इच्छित साइट को छोड़ सकता है, वैकल्पिक URL रूपों पर फिर से जाकर या बिना रुकने की शर्त के बढ़ सकता है। अनुमत URLs को कनोनिकलाइज़ करें, पथ पैटर्न को सीमित करें, और देखी गई पहचानों को संग्रहीत करें।
जावास्क्रिप्ट सीमा का पता लगाएँ।
reqwest सर्वर प्रतिक्रियाएँ डाउनलोड करता है; यह पृष्ठ स्क्रिप्टों को निष्पादित नहीं करता है। स्क्रैपर क्रेट जो वह प्राप्त करता है उसे पार्स करता है। यदि एक ब्राउज़र रिकॉर्ड प्रदर्शित करता है जो पृष्ठ स्रोत में नहीं दिखाई देते हैं, तो रस्ट कोड दोनों कार्यों में सफल हो सकता है और फिर भी शून्य मिलान लौटाता है। उस परिणाम को एक क्षमता असंगति है, न कि अनिवार्य रूप से एक चयनकर्ता बग।
rendered अधिग्रहण असंगति को हल करता है दोहराने के लिए एक ही पार्सर को पोस्ट-स्क्रिप्ट दस्तावेज़ लौटाकर। विभाजन को दृश्यमान रखें: एक फ़ंक्शन ईमानदार HTML प्राप्त करता है, और दूसरा HTML को टाइप किए गए रिकॉर्ड में बदलता है। यह डिज़ाइन ब्राउज़र की चिंताओं को सामान्यकरण और भंडारण कोड के माध्यम से फैलने से रोकता है।
स्रोत नियमों के भीतर संचालित करें।
एक रस्ट क्रॉलर को शेड्यूल करने से पहले, अनुमत मेज़बान, पथ, डेटा वर्ग और अनुरोध बजट को परिभाषित करें। शर्तों और लागू कानून की समीक्षा करें। रोबोट्स बहिष्करण प्रोटोकॉल मानकीकृत क्रॉलर निर्देश प्रदान करता है, लेकिन यह अनुमति, गोपनीयता विश्लेषण या संविदात्मक समीक्षा के लिए एक विकल्प नहीं है।
पर्यवेक्षण को सटीकता पर केंद्रित होना चाहिए: प्रतिक्रिया वर्ग, पृष्ठ पहचान, पार्स अवधि, कंटेनर संख्या, स्वीकार किए गए रिकॉर्ड, और श्रेणीबद्ध विफलताएँ। सामान्य लॉग में संपूर्ण प्रतिक्रिया निकायों को संग्रहीत करने से बचें। फ़िक्स्चर नियंत्रण परीक्षण डेटा में शामिल होते हैं, और संवेदनशील मान क्रॉलर के निदान सतह के बाहर होते हैं।
टाइप किए गए रिकॉर्ड के बगल में उत्पत्ति को बनाए रखें।
टाइप आउटपुट उत्पत्ति की आवश्यकता को नहीं हटाता। प्रत्येक रिकॉर्ड या बैच के साथ कैनॉनिकल स्रोत URL, अधिग्रहण समय, पार्सर संशोधन, और एक कॉम्पैक्ट पृष्ठ पहचान परिणाम को संग्रहीत करें। ये फ़ील्ड डाउनस्ट्रीम सिस्टम को एक असली मूल्य परिवर्तन को एक चयनकर्ता परिवर्तन या एक अलग क्षेत्रीय पृष्ठ से भेद करने की अनुमति देती हैं।
जब सामान्यीकरण अर्थ खो सकता है, तो कच्चा पाठ उपलब्ध रखें। मुद्रा स्ट्रिंग्स, स्थानीयकृत संख्याएँ, उपलब्धता लेबल, और मानव तिथियाँ अक्सर स्रोत-विशिष्ट नियमों की आवश्यकता होती हैं। एक अच्छा रस्ट मॉडल सामान्यीकृत फ़ील्ड और परिवर्तनों का ऑडिट करने के लिए पर्याप्त मूल संदर्भ दोनों को ले जाता है। वैधता असंभव संयोजनों को अस्वीकार कर सकती है जो क्रमबद्धता से पहले, जैसे एक सांख्यिकीय राशि बिना मुद्रा के जब एप्लिकेशन को एक की आवश्यकता होती है।
स्कीमा विकास को जानबूझकर होना चाहिए। पहले वैकल्पिक फ़ील्ड जोड़ें, उपभोक्ताओं को अपडेट करें, और तब ही एक फ़ील्ड को अनिवार्य बनाएं जब स्रोत और पाइपलाइन यह साबित कर दे कि यह लगातार उपस्थित है। यह दृष्टिकोण रस्ट के प्रकार प्रणाली का उपयोग डेटा अनुबंध के रूप में करता है बिना यह दिखावे के कि तीसरे पक्ष का मार्कअप स्थिर है।
निष्कर्ष
रस्ट के साथ वेब स्क्रेपिंग एक अच्छा विकल्प है जब संग्राहक को लंबे समय तक चलाना होता है जिसमें स्पष्ट त्रुटि प्रबंधन और नियंत्रित संसाधन बजट होता है। एक reqwest क्लिएंट का पुनः उपयोग करें, चयनकर्ताओं को एक बार पार्स करें, अनुपस्थिति को विकल्पों के साथ दर्शाएं, और टोकियो कार्यों को सीमित करें। यदि क्लाइंट-साइड जावास्क्रिप्ट डेटा का स्वामी है, तो टाइप पार्सर को फिर से लिखने के बजाय HTML को अधिग्रहित करने के तरीके को बदलें।
क्या रस्ट को प्रदर्शित वेब डेटा से कनेक्ट करने के लिए तैयार हैं?
reqwest और स्क्रैपर को टाइप किए गए आवेदन सीमा के रूप में बनाए रखें जबकि Scrapeless उन पृष्ठों के लिए अधिग्रहण को संभालता है जिन्हें रेंडरिंग की आवश्यकता होती है।
आज साइन अप करें और प्राप्त करें $5 का मुफ्त क्रेडिट — कोई क्रेडिट कार्ड आवश्यक नहीं है।.
अपने $5 क्रेडिट का दावा करें →अक्सर पूछे जाने वाले प्रश्न
कौन से रस्ट क्रेट वेब स्क्रैपिंग के लिए उपयोग किए जाते हैं?
reqwest एक सामान्य HTTP क्लाइंट है, स्क्रैपर HTML पार्सिंग और CSS चयनकर्ताओं को प्रदान करता है, और टोकियो असिंक्रोनस कार्य चलाता है। Serde अक्सर तब जोड़ा जाता है जब आउटपुट या अधिग्रहण प्रतिक्रिया JSON होती है।
क्या reqwest जावास्क्रिप्ट को निष्पादित कर सकता है?
नहीं। reqwest HTTP अनुरोध भेजता है और सर्वर प्रतिक्रियाएँ लौटाता है; यह ब्राउज़र इवेंट लूप नहीं चलाता। जब स्क्रिप्ट आवश्यक सामग्री बनाते हैं, तो रेंडर अधिग्रहण का उपयोग करें।
क्या छोटे स्क्रैपर के लिए असिंक्रोनस रस्ट की आवश्यकता है?
नहीं। एक अवरोधित क्लाइंट एकल अनुक्रमिक कार्य के लिए उपयुक्त हो सकता है। असिंक्रोनस रस्ट तब सहायक हो जाता है जब डिज़ाइन के पास कई स्वतंत्र नेटवर्क प्रतीक्षा और स्पष्ट समवर्ती बजट हो।
रस्ट को स्क्रेप किए गए क्षेत्रों के गायब होने को कैसे संभालना चाहिए?
रस्ट को आवश्यक क्षेत्रों को उन मूल्यों के रूप में मॉडल करना चाहिए जो उपस्थित होना चाहिए और वैकल्पिक क्षेत्रों को। Optionअपनी पहचान क्षेत्र की कमी वाले रिकॉर्ड को अस्वीकार करें बजाय इसके कि एक अस्पष्ट रिक्त स्थान को प्रतिस्थापित करें।
क्या रस्ट के साथ वेब स्क्रैपिंग कानूनी है?
भाषा कानूनी विश्लेषण को नहीं बदलती। अधिकृत सार्वजनिक डेटा पर काम सीमित रखें, साइट की शर्तों और रोबोट निर्देशों की समीक्षा करें, पहुंच नियंत्रणों का सम्मान करें, और जहां संग्रह लोगों या विनियमित डेटा को प्रभावित करता है, वहां कानूनी सलाह प्राप्त करें।