रस्ट में पार्सिंग: पायथन से तेज़ और बिना गार्बेज कलेक्टर के

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

रस्ट पार्सिंग का नया राजा क्यों है?

\n\n

यदि आपने कभी पायथन में पार्सर लिखा है, तो आप इस पल को जानते हैं: स्क्रिप्ट काम कर रही है, डेटा डाउनलोड हो रहा है, लेकिन अचानक — मेमोरी एरर, या गार्बेज कलेक्टर सबसे अनुपयुक्त समय पर 'आराम' करने का फैसला करता है। परिचित लगता है? अब कल्पना करें कि आपका पार्सर C की गति से उड़ता है, अतिरिक्त मेमोरी नहीं खाता है और सुरक्षित भी है। रस्ट में पार्सिंग की दुनिया में आपका स्वागत है।

\n\n

रस्ट सिर्फ एक फैशनेबल भाषा नहीं है। डेटा स्क्रैपिंग कार्यों के लिए, यह वह देता है जो पायथन कभी नहीं दे सकता: मेमोरी पर पूर्ण नियंत्रण, गार्बेज कलेक्टर पर शून्य ओवरहेड और अविश्वसनीय गति। साथ ही, HTTP और HTML के साथ काम करने के लिए पारिस्थितिकी तंत्र पहले से ही काफी परिपक्व है। इस लेख में, मैं आपको दिखाऊंगा कि रस्ट में एक वास्तविक पार्सर कैसे बनाया जाए जिसका उपयोग आप मूल्य निगरानी, सामग्री संग्रह या SEO विश्लेषण के लिए कर सकते हैं।

\n\n

हमें क्या चाहिए: पार्सिंग के लिए रस्ट टूलकिट

\n\n

रस्ट में वेब स्क्रैपिंग के लिए तीन मुख्य चीजें हैं:

\n\n
    \n
  • reqwest — HTTP क्लाइंट। वेबसाइटों पर जा सकता है, एसिंक्रोनसिटी और प्रॉक्सी को सपोर्ट करता है।
  • \n
  • scraper (या select.rs) — HTML पार्सिंग के लिए लाइब्रेरी। CSS सेलेक्टर का उपयोग करने की अनुमति देता है।
  • \n
  • tokio — एसिंक्रोनस रनटाइम। इसके बिना आपका पार्सर हर अनुरोध पर धीमा हो जाएगा।
  • \n
\n\n

चलिए एक नया प्रोजेक्ट बनाते हैं और डिपेंडेंसी इंस्टॉल करते हैं:

\n\n
cargo new rust_parser\ncd rust_parser\ncargo add reqwest --features json\ncargo add scraper tokio
\n\n

हो गया। अब हमारे पास 10 मिनट में रस्ट पार्सर लिखने के लिए सब कुछ है।

\n\n

पहला पार्सर: Habr से हेडलाइन प्राप्त करना

\n\n

चलिए सरल से शुरू करते हैं: Habr से लेखों के हेडलाइन पार्स करें। यह शैली का एक क्लासिक है, जैसे रस्ट स्क्रैपिंग के लिए 'Hello, World!'।

\n\n
use scraper::{Html, Selector};\nuse reqwest;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    // 1. GET अनुरोध भेजें\n    let resp = reqwest::get("https://habr.com/ru/articles/")\n        .await?\n        .text()\n        .await?;\n\n    // 2. HTML पार्स करें\n    let document = Html::parse_document(&resp);\n\n    // 3. हेडलाइन के लिए सेलेक्टर बनाएँ\n    let selector = Selector::parse("h2.article-title a").unwrap();\n\n    // 4. इटरेट करें और आउटपुट दें\n    for element in document.select(&selector) {\n        let title = element.text().collect::<Vec<_>>().join("");\n        println!("{}", title.trim());\n    }\n\n    Ok(())\n}
\n\n

यहाँ क्या हो रहा है? हम एसिंक्रोनस अनुरोध के लिए reqwest, HTML पार्स करने के लिए scraper और हेडलाइन में सभी लिंक खोजने के लिए CSS सेलेक्टर h2.article-title a का उपयोग कर रहे हैं। cargo run चलाएँ — और हम लेखों की सूची देखते हैं। तेज़, है ना?

\n\n

एसिंक्रोनस पार्सिंग: एक सेकंड में 100 पेज डाउनलोड करना

\n\n

रस्ट में पार्सिंग की मुख्य विशेषता एसिंक्रोनसिटी है। पायथन में आप asyncio और aiohttp का उपयोग करेंगे, लेकिन रस्ट tokio के साथ और भी अधिक नियंत्रण देता है। चलिए एक साथ कई पेजों को समानांतर में पार्स करते हैं।

\n\n
use scraper::{Html, Selector};\nuse reqwest;\nuse tokio::task;\n\nasync fn fetch_page(url: &str) -> Result<String, reqwest::Error> {\n    let resp = reqwest::get(url).await?.text().await?;\n    Ok(resp)\n}\n\nfn parse_titles(html: &str) -> Vec<String> {\n    let document = Html::parse_document(html);\n    let selector = Selector::parse("h2.article-title a").unwrap();\n    document\n        .select(&selector)\n        .map(|el| el.text().collect::<Vec<_>>().join("").trim().to_string())\n        .collect()\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let urls: Vec<String> = (1..=5)\n        .map(|i| format!("https://habr.com/ru/articles/page{}/", i))\n        .coll                

ब्लॉग

पुस्तक अनुशंसाएँ