सेलेक्टोलैक्स वेब स्क्रैपिंग: पाइथन में तेजी से एचटीएमएल पार्सिंग
Senior Web Scraping Engineer
TL;DR:
- selectolax तेज़ी से CSS चयनकर्ताओं के साथ HTML को पार्स करता है, क्योंकि यह शुद्ध-पाइथन पार्सिंग के बजाय C-आधारित Lexbor इंजन को लपेटता है।
- selectolax जो कुछ नहीं करता वह है फ़ेच करना। इसमें कोई HTTP क्लाइंट नहीं है और यह कोई जावास्क्रिप्ट नहीं रेंडर करता; इसे बाइट्स दें और यह उन्हें पार्स करता है, बस इतना ही।
- फर्क एक स्क्रिप्ट में साफ दिखाई देता है। एक जावास्क्रिप्ट-से निर्मित डेमो पृष्ठ पर साधारण GET ऑपरेशन selectolax को 0 उद्धरण नोड देता है; वही URL Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से
js_renderके साथ फ़ेच करने पर इसे सभी 10 मिलते हैं। - इस गाइड में पार्स वास्तविक है। एक लाइव रन ने सभी 10 उद्धरणों के साथ लेखकों और टैग ऐरे को सुरक्षित रखते हुए रेंडर किए गए HTML से निकाला,
cssऔरcss_firstका उपयोग करते हुए। - दो परतें साफ तौर पर विभाजित हैं। Scrapeless फ़ेच और रेंडर करता है; selectolax बाइट्स को रिकॉर्ड में परिवर्तित करता है। कोई भी एक-दूसरे के काम में नहीं पहुंचता।
- फ़ेच साइड पर शुरू करने के लिए स्वतंत्र। अपने Scrapeless एपीआई कुंजी का निर्माण करें app.scrapeless.com पर।
selectolax क्या है, और क्या नहीं है
selectolax एक तेज़ी के लिए निर्मित Python HTML पार्सर है। यह Lexbor इंजन को बाइंड करता है, जो HTML मानक को लागू करने वाली एक C लाइब्रेरी है, इसलिए एक दस्तावेज़ को पार्स करना और उस पर CSS चयनकर्ताओं को चलाना संकलित कोड में होता है न कि इंटरप्रेटर में। उच्च मात्रा के निष्कर्षण के लिए — हजारों पृष्ठ, तंग लूप — यह अंतर ही कारण है कि लोग भारी पार्सरों के बजाय इसे चुनते हैं।
यह एक पार्सर है और केवल एक पार्सर है। selectolax में कोई HTTP क्लाइंट नहीं है, यह कोई सत्र धारण नहीं करता है, और कोई जावास्क्रिप्ट नहीं चलाता है। इसे एक स्ट्रिंग या बाइट्स दें और यह एक ट्री बनाता है जिसे आप क्वेरी कर सकते हैं; इसे किसी URL में जाने के लिए कहें और इसके लिए कोई विधि नहीं है, डिजाइन के अनुसार। इसलिए हर "selectolax वेब स्क्रैपिंग" सेटअप दो परतें होती हैं: कुछ जो विश्वसनीय HTML फ़ेच करता है, और selectolax जो इसे डेटा में परिवर्तित करता है। यह गाइड पहले परत के लिए Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई का उपयोग करता है, क्योंकि एक साधारण HTTP क्लाइंट किसी भी पृष्ठ पर गलत बाइट्स लौटाता है जो अपना कंटेंट जावास्क्रिप्ट के साथ बनाता है। Python पर एक व्यापक यात्रा के लिए, Python वेब स्क्रैपिंग ट्यूटोरियल इस पर इकोसिस्टम को कवर करता है।
इंस्टाल करें
selectolax और requests पूरे टूलचेन हैं। यह गाइड selectolax 0.4.11 के विरुद्ध लिखा गया था:
bash
pip install "selectolax==0.4.11" requests
अपनी कुंजी को वातावरण में रखें, कभी भी स्रोत में नहीं:
bash
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
पार्सिंग के लिए मूल्यवान HTML प्राप्त करें
पार्स गुणवत्ता फ़ेच निष्ठा द्वारा सीमित है, इसलिए यहां से शुरू करें। एक जावास्क्रिप्ट-से निर्मित पृष्ठ पर, एक साधारण HTTP क्लाइंट द्वारा प्राप्त दस्तावेज़ वह दस्तावेज़ नहीं है जो एक पाठक देखता है: सामग्री केवल तब आती है जब स्क्रिप्ट DOM बनाती हैं, जो HTML स्क्रिप्टिंग विनिर्देशन द्वारा परिभाषित जीवनचक्र है। एक स्क्रिप्ट selectolax के माध्यम से अंतर की गणना करती है:
python
# fidelity.py — selectolax क्या देखता है: साधारण GET बनाम सर्वर-साइड रेंडरिंग
import os
import requests
from selectolax.lexbor import LexborHTMLParser
URL = "https://quotes.toscrape.com/js/"
plain = requests.get(URL, timeout=60).text
print("plain GET characters:", len(plain), "| quote nodes:", len(LexborHTMLParser(plain).css("div.quote")))
resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"Content-Type": "application/json", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
json={"actor": "unlocker.webunlocker", "input": {"url": URL, "js_render": True}},
timeout=120,
)
resp.raise_for_status()
rendered = resp.json().get("data", "")
print("rendered characters:", len(rendered), "| quote nodes:", len(LexborHTMLParser(rendered).css("div.quote")))
यह रन प्लेन फ़ेच के लिए 0 उद्धरण नोड और रेंडर किए गए के लिए 10 प्रिंट करता है:
text
plain GET characters: 5806 | quote nodes: 0
rendered characters: 8940 | quote nodes: 10
रेंडरिंग, अनलॉकिंग, और प्रॉक्सी रौटिंग सभी सर्वर-साइड उस एक POST में होती हैं — यूनिवर्सल स्क्रैपिंग एपीआई फ़ेच परत है, और रेंडर की गई बाइट्स वही हैं जो selectolax को पार्स करना चाहिए।
selectolax के साथ पार्स करें
वास्तविक HTML हाथ में होने के साथ, selectolax निष्कर्षण करता है। css हर नोड को लौटाता है जो चयनकर्ता से मेल खाता है; css_first पहला लौटाता है, ताकि आप प्रत्येक रिकॉर्ड से एक फ़ील्ड खींच सकें। चयनकर्ता W3C चयनकर्ताओं के विनिर्देशन का पालन करते हैं, वही सिंटैक्स जो आप पहले से CSS में उपयोग करते हैं:
python
# extract.py — रेंडर की गई पृष्ठ को फ़ेच करें, फिर selectolax के साथ रिकॉर्ड निकालें
import os
import requests
from selectolax.lexbor import LexborHTMLParser
resp = requests.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
हेडर्स = {"सामग्री-प्रकार": "अनुप्रयोग / जेसन", "x-api-token": os.environ["SCRAPELESS_API_KEY"]},
जेसन = {"अभिनेता": "unlocker.webunlocker", "इनपुट": {"url": "https://quotes.toscrape.com/js/", "js_render": सत्य}},
समयसीमा = 120,
)
resp.raise_for_status()
tree = LexborHTMLParser(resp.json().get("डेटा", ""))
रिकार्ड्स = []
के लिए उद्धरण में tree.css("div.quote"):
रिकार्ड्स.append({
"पाठ": उद्धरण.css_first("span.text").text(),
"लेखक": उद्धरण.css_first("small.author").text(),
"टैग": [tag.text() के लिए टैग में उद्धरण.css("a.tag")],
})
print("रिकार्ड्स:", len(रिकार्ड्स))
print("पहला लेखक:", रिकार्ड्स[0]["लेखक"])
print("पहला टैग:", रिकार्ड्स[0]["टैग"])
लाइव रन ने सभी 10 रिकॉर्ड लौटाए, पहले वाले पर लेखक और टैग एरे बरकरार रहे:
```लेख
रिकार्ड्स: 10
पहला लेखक: अल्बर्ट आइंस्टीन
पहला टैग: ['परिवर्तन', 'गहरे-चिन्तन', 'सोचना', 'विश्व']
यह संपूर्ण स्क्रैप है: एक POST खींचने और रेंडर करने के लिए, एक पेड़ पूछताछ करने के लिए। text() एक नोड की टेक्स्ट सामग्री लौटाता है, और प्रत्येक रिकॉर्ड के लिए डिक्ट की एक सूची बनाना एक पैटर्न है जो किसी भी पृष्ठ पर दोहराए जाने वाले ब्लॉक के लिए स्केल करता है।
अपना API कुंजी मुफ्त योजना पर प्राप्त करें: app.scrapeless.com
उन्नत पैटर्न
- गति के लिए
LexborHTMLParserका उपयोग करें, विनम्र बैकएंड के लिएHTMLParser। selectolax समान API पीछे दोनों इंजन शिप करता है; Lexbor नया, तेज है और मात्रा के लिए सही डिफ़ॉल्ट है। css_firstकोdefaultके साथ प्राथमिकता दें।node.css_first("span.text", default=None)एक फ़ील्ड के गायब होने पर उठने के बजायNoneलौटाता है, जो एक पृष्ठ पर असमान रिकॉर्ड पर लूप को क्रैश होने से बचाता है।.attributesके साथ गुण पढ़ें। लिंक और छवियों के लिए,node.attributes.get("href")नोड से गुण को खींचता है - चयनकर्ता तत्व को खोजता है,.attributesइसके डेटा को पढ़ता है।- जब आपको पेड़ की आवश्यकता न हो तो मार्कडाउन लाएँ। यदि आप केवल पठनीय पाठ चाहते हैं, तो Scrapeless API सीधे प्रस्तुत सामग्री लौटा सकता है; संरचित फ़ील्ड पर चयनकर्ता-स्तरीय नियंत्रण की आवश्यकता होने पर selectolax का उपयोग करें।
समस्या निवारण
- ऐसे पृष्ठ से शून्य नोड। जो आप एक ब्राउज़र में देख सकते हैं। सामग्री JavaScript-रेंडर्ड है और आपकी फ़ेच ने पूर्व-रेंडर एचटीएमएल लौटाया। पहले स्क्रिप्ट की तरह ज्ञात चयनकर्ता को गिनें; एक निकट-खाली पेड़ एक फेच समस्या है, जो
js_renderके साथ ठीक की जाती है, न कि एक चयनकर्ता समस्या। AttributeError: 'NoneType' ऑब्जेक्ट के पास कोई गुण नहीं है।css_firstने कुछ नहीं पाया और आपनेNoneपर.text()को कॉल किया।default=Noneपास करें और पढ़ने से पहले चेक करें, या पुष्टि करें कि चयनकर्ता प्रस्तुत मार्कअप से मेल खाता है।- पाठ में अतिरिक्त विराम चिह्न हैं।
text()कच्चा नोड पाठ लौटाता है; जब एक नोड नेस्टेड बच्चों का पाठ है जिसे आप शामिल करना चाहते हैं तो.strip()कॉल करें याdeep=True/separatorविकल्प पास करें। - कोडिंग गलत लगती है। गलत-डिकोडेड स्ट्रिंग के बजाय प्रतिक्रियाओं के बाइट्स पास करें; selectolax उस दस्तावेज़ की घोषित कोडिंग को पढ़ता है जब आप इसे बाइट्स सौंपते हैं।
निष्कर्ष
selectolax अपने स्थान को एक विश्लेषण परत के रूप में अर्जित करता है जो नेटवर्क को कभी छूता नहीं है: इसे विश्वसनीय HTML सौंपें और यह तेज़ी से रिकॉर्ड लौटाता है, पहले से ज्ञात CSS चयनकर्ताओं के साथ। यह परत जो तय करती है कि क्या इनमें से कोई भी संभव है वह फेच है - पहले स्क्रिप्ट की 0-के मुकाबले-10 गणना इसे तय करती है - और एक सर्वर-रेंडर्ड POST अंतर को बंद करता है। दोनों को एक साथ जोड़ें और डेमो पृष्ठ के दस उद्धरण साफ सुथरे डिक्ट के रूप में आते हैं, टैग और सभी।
एक मुफ्त Scrapeless खाता बनाएँ API कुंजी प्राप्त करने के लिए, और डेवलपर दस्तावेज़ unlocker.webunlocker पैरामीटर को कवर करते हैं। जब आप नियमित नौकरी की योजना बनाते हैं तो Scrapeless मूल्य निर्धारण देखें।
सामान्य प्रश्न
प्रश्न: क्या selectolax अकेले वेबसाइटों को स्क्रैप कर सकता है?
नहीं। selectolax उस HTML का विश्लेषण करता है जो आपके पास पहले से है; इसके पास कोई HTTP क्लाइंट नहीं है और यह कोई JavaScript रेंडर नहीं करता है। इसे एक फ़ेच परत के साथ जोड़ें - यहाँ Scrapeless यूनिवर्सल स्क्रैपिंग API, जो पृष्ठ को सर्वर-साइड रेंडर करता है - और selectolax लौटाए गए बाइट्स से निष्कर्षण को संभालता है।
प्रश्न: BeautifulSoup के बजाय selectolax का उपयोग क्यों करें?
गति। selectolax C-आधारित Lexbor इंजन को घेरता है, इसलिए पार्सिंग और चयनकर्ता क्वेरी संकलित कोड में चलती है, जो उच्च पृष्ठ मात्रा पर मायने रखती है। समझौता इसका एक छोटा विशेषता सतह है; कई पृष्ठों पर चयनकर्ता-आधारित निष्कर्षण के लिए, वह आमतौर पर सही व्यापार है।
प्रश्न: css और css_first में क्या अंतर है?
css चयनकर्ता से मेल खाने वाले हर नोड की सूची लौटाता है; css_first केवल पहले मिलान (या आप द्वारा प्रदान किए गए डिफ़ॉल्ट) को लौटाता है। खोज परिणाम जैसे दोहराए जाने वाले ब्लॉक पर लूप करने के लिए css का उपयोग करें, और प्रत्येक ब्लॉक से एकल फ़ील्ड निकालने के लिए css_first का उपयोग करें।
प्रश्न: क्या selectolax जावास्क्रिप्ट-निर्मित पृष्ठों को संभालता है?
अकेले नहीं — यह कभी भी स्क्रिप्ट नहीं चलाता। यदि सामग्री प्रारंभिक HTML के बाद लोड होती है, तो सामान्य फ़ेच selectolax को एक खाली पेड़ देता है। पहले js_render के साथ Scrapeless API के माध्यम से पृष्ठ को फ़ेच करें, फिर तैयार किए गए HTML को पार्स करें, जैसा कि यह गाइड करता है।
प्रश्न: क्या selectolax के साथ स्क्रेपिंग कानूनी है?
पार्सर संग्रह नियमों को नहीं बदलता। केवल सार्वजनिक पृष्ठों को फ़ेच करें, साइट की शर्तों और रोबोट्स बहिष्कार प्रोटोकॉल द्वारा मानकीकृत रोबोट निर्देशों का सम्मान करें, मात्रा सीमित रखें, और किसी भी व्यक्तिगत डेटा को उन कानूनों के तहत संभालें जो आपके लिए लागू होते हैं।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



