पार्सेल वेब स्क्रैपिंग: पायथन में CSS और XPath सेलेक्टर
Senior Web Scraping Engineer
TL;DR:
- parsel HTML से डेटा CSS और XPath दोनों के साथ चुनता है, एक ही दस्तावेज़ पर — यह चयनकर्ता इंजन है जो Scrapy उपयोग करता है, जो एक स्वतंत्र पुस्तकालय के रूप में उपलब्ध है।
- parsel जो नहीं करता है वह है डेटा लाना। इसमें कोई HTTP क्लाइंट नहीं है और यह कोई JavaScript नहीं चलाता; आप इसे मार्कअप देते हैं और यह एक क्वेरी योग्य वृक्ष बनाता है।
- यह कमी एक स्क्रिप्ट में दिखाई देती है। एक साधारण GET जो JavaScript द्वारा रेंडर्ड किए गए डेमो पृष्ठ पर 0 कोट्स नोड्स देता है; वही URL जो Scrapeless Universal Scraping API के माध्यम से
js_renderके साथ लाया गया है उसे सभी 10 देता है। - CSS और XPath, एक साथ। एक लाइव रन ने रेंडर्ड HTML से
sel.css("small.author::text")औरsel.xpath("//small[@class='author']/text()")दो तरीकों से वही 10 लेखक खींचे। - दो परतें अलग रहती हैं। Scrapeless लाता है और रेंडर करता है; parsel चयन करता है। Neither reaches into the other's job.
- लाने के पक्ष पर शुरू करने के लिए स्वतंत्र। अपना Scrapeless API की app.scrapeless.com पर बनाएं।
parsel क्या है, और क्या नहीं है
parsel HTML और XML से डेटा निकालने के लिए CSS चयनकर्ताओं और XPath अभिव्यक्तियों का उपयोग करने के लिए एक Python पुस्तकालय है। यह चयनकर्ता परत है जिस पर Scrapy निर्मित है, इस तरह संकुचित किया गया है कि आप इसका उपयोग कहीं भी कर सकते हैं, और इसके नीचे lxml लिपटा हुआ है, ताकि दोनों चयनकर्ता भाषाएँ उसी तेज़ पर्स वृक्ष के खिलाफ चलें। CSS-केवल पर्सर के मुकाबले इसका उपयोग करने का कारण XPath है: जब एक फ़ील्ड इसकी स्थिति, इसका पाठ, या किसी सहोदर के साथ इसके संबंध द्वारा परिभाषित होती है, तो XPath इसे व्यक्त करता है और CSS नहीं कर सकता।
यह एक चयनकर्ता पुस्तकालय है और कुछ नहीं। parsel में कोई HTTP क्लाइंट नहीं है, कोई सत्र नहीं है, और यह कोई JavaScript नहीं चलाता। इसे एक स्ट्रिंग दें और यह एक Selector बनाता है जिसे आप क्वेरी कर सकते हैं; इसे एक URL लाने के लिए कहें और इसके लिए कोई विधि नहीं है। इसलिए हर "parsel वेब स्क्रैपिंग" सेटअप दो परतें होती हैं: कुछ जो वफादार HTML लौटाता है, और parsel जो इससे चयन करता है। यह गाइड पहले परत के लिए Scrapeless Universal Scraping API का उपयोग करता है, क्योंकि एक साधारण HTTP क्लाइंट किसी भी पृष्ठ पर पूर्व-रेंडर मार्कअप लौटाता है जो JavaScript के साथ अपनी सामग्री बनाता है। व्यापक Python वेब स्क्रैपिंग ट्यूटोरियल आसपास के पारिस्थितिकी तंत्र को कवर करता है।
स्थापित करें
parsel और requests पूरे टूलचेन हैं। इस गाइड के लिए लिखा गया संस्करण parsel 1.11.0 है:
bash
pip install "parsel==1.11.0" requests
अपने कुंजी को वातावरण में रखें, कभी भी स्रोत में नहीं:
bash
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
पार्सिंग के लिए मूल्यवान HTML प्राप्त करें
चयन गुणवत्ता लाने की निष्ठा द्वारा सीमित होती है, इसलिए वहीं से शुरू करें। एक JavaScript-रेंडर्ड पृष्ठ पर, एक साधारण HTTP क्लाइंट को जो मार्कअप मिलता है वह पाठक को जो मार्कअप दिखता है उससे अलग होता है: सामग्री केवल तभी आती है जब स्क्रिप्ट DOM का निर्माण करती हैं, एक जीवन चक्र जो HTML स्क्रिप्टिंग विशिष्टता द्वारा परिभाषित होता है। एक स्क्रिप्ट इस भिन्नता को parsel के माध्यम से गिनती है:
python
# fidelity.py — parsel क्या देखता है: साधारण GET बनाम सर्वर-साइड रेंडरिंग
import os
import requests
from parsel import Selector
URL = "https://quotes.toscrape.com/js/"
plain = requests.get(URL, timeout=60).text
print("plain GET chars:", len(plain), "| quote nodes:", len(Selector(text=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 chars:", len(rendered), "| quote nodes:", len(Selector(text=rendered).css("div.quote")))
यह रन साधारण फेच के लिए 0 कोट नोड्स और रेंडर्ड के लिए 10 को प्रिंट करता है:
text
plain GET chars: 5806 | quote nodes: 0
rendered chars: 8940 | quote nodes: 10
रेंडरिंग, अनलॉकिंग, और प्रॉक्सी राउटिंग सभी एक ही POST में सर्वर-साइड होती हैं — यूनिवर्सल स्क्रैपिंग API लाने की परत है, और रेंडर्ड मार्कअप वह है जिसे parsel से चयन करना चाहिए।
CSS और XPath के साथ निकालें
वास्तविक HTML के साथ, parsel निष्कर्षण करता है। css और xpath दोनों एक SelectorList लौटाते हैं; get पहला मैच लौटाता है और getall प्रत्येक मैच लौटाता है। ::text उप-तत्त्व और text() नोड दोनों पाठ निकालते हैं, इसलिए आप एक ही फ़ील्ड को दोनों तरीकों से पढ़ सकते हैं — CSS W3C चयनकर्ताओं की विशिष्टता का पालन करता है और XPath W3C XPath विशिष्टता का पालन करता है:
python
# extract.py — रेंडर्ड पृष्ठ लाएं, फिर CSS और XPath के साथ चुनें
import os
import requests
from parsel import Selector
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": "https://quotes.toscrape.com/js/", "js_render": True}},
timeout=120,
)
resp.raise_for_status()
sel = Selector(text=resp.json().get("data", ""))
css_nodes = sel.css("div.quote")
xpath_authors = sel.xpath("//div[@class='quote']//small[@class='author']/text()").getall()
print("css quote nodes:", len(css_nodes))
print("xpath authors:", len(xpath_authors))
records = []
for quote in css_nodes:
records.append({
"text": quote.css("span.text::text").get(),
"author": quote.xpath(".//small[@class='author']/text()").get(),
"tags": quote.css("a.tag::text").getall(),
})
print("first author:", records[0]["author"])
print("first tags:", records[0]["tags"])
निष्कर्ष: एक POST अनुरोध करना, एक Selector का उपयोग करके डेटा का चयन करना। CSS सरल क्षेत्रों के लिए, और XPath स्थिति वाले क्षेत्रों के लिए - quote.xpath("...") प्रत्येक नोड के सापेक्ष चलता है - यह पैटर्न है जो एक स्क्रैपर को पढ़ने योग्य बनाए रखता है क्योंकि पृष्ठ जटिल होते जाते हैं।
मुफ्त योजना पर अपना API कुंजी प्राप्त करें: app.scrapeless.com
उन्नत पैटर्न
- CSS समाप्त होने पर XPath का सहारा लें। टेक्स्ट द्वारा चयन करना (
//a[contains(text(), "Next")]), स्थिति द्वारा ((//tr)[2]), या एक धुरी द्वारा (following-sibling::td) XPath का क्षेत्र है; CSS का कोई समकक्ष नहीं है। - नोड के सापेक्ष चयनकर्ताओं को श्रृंखला में लगाएं।
quote.css(...)औरquote.xpath(".//...")दोनों उस नोड तक सीमित हैं - XPath में अग्रणी.इसे सापेक्ष रखता है, जो "इस उद्धरण के भीतर लेखक" और "पृष्ठ पर सभी लेखक" के बीच का अंतर है। get(default="")का उपयोग करें ताकिNoneसे बच सकें।sel.css("span.missing::text").get(default="")एक खाली स्ट्रिंग लौटाता है इसके बजायNone, जो असमान रिकॉर्ड पर एक लूप को तोड़ने से बचाता है।::attr()या@के साथ गुण खींचें।sel.css("a::attr(href)")औरsel.xpath("//a/@href")दोनों किसी गुण को पढ़ते हैं; जिस भाषा में शेष चयनकर्ता पहले से है, उसे उपयोग करें।
समस्या निवारण
- उन पृष्ठों से शून्य नोड्स जिनका आप ब्राउज़र में देख सकते हैं। सामग्री JavaScript द्वारा प्रस्तुत की गई है और आपका फ़ेच प्री-रेंडर HTML लौटाता है। पहले स्क्रिप्ट की तरह एक ज्ञात चयनकर्ता की गिनती करें; एक लगभग-खाली पेड़ एक फ़ेच समस्या है, जिसे
js_renderके साथ ठीक किया जाता है, न कि चयनकर्ता समस्या। get()Noneलौटाता है। चयनकर्ता ने कुछ भी मेल नहीं खाया। रेंडर किए गए मार्कअप की जांच करें, वर्ग या पथ की पुष्टि करें, और एकdefaultपास करें ताकि डाउनस्ट्रीम कोड मिस पर क्रैश न हो।- XPath तत्व लौटाता है जब आप टेक्स्ट चाहते थे। पथ में
/text()जोड़ें या::textCSS चयनकर्ता पर.get()करें; एक निर्विकल्प तत्व पथ नोड को लौटाता है, न कि इसकी स्ट्रिंग। - सापेक्ष XPath पूरे पृष्ठ को पकड़ता है। एक पथ जो
//से शुरू होता है वह एक नोड पर कॉल किए जाने पर भी संपूर्ण है। इसे.के साथ प्रारंभ करें -.//small- इसे वर्तमान तत्व पर सीमित करने के लिए।
निष्कर्ष
parsel अपनी जगह को चयन परत के रूप में अर्जित करता है जो दोनों बोलियों का सामना करता है: सामान्य मामलों के लिए CSS, और उन मामलों के लिए जिन्हें CSS पहुंच नहीं सकता, एक lxml-समर्थित पेड़ के ऊपर। यह परत तय करती है कि क्या उनमें से कोई भी संभव है - पहले स्क्रिप्ट का 0-के-बनाम-10 गिनना इसे तय करता है - और एक सर्वर-प्रस्तुत POST उस अंतर को बंद कर देता है। दोनों को एक साथ वायर करें और डेमो पृष्ठ के दस उद्धरण साफ रिकॉर्ड के रूप में आते हैं, जिनका चयन किया गया है, जो कि सबसे अच्छा पढ़ता है।
एक मुफ्त Scrapeless खाता बनाएं API कुंजी प्राप्त करने के लिए, और डेवलपर दस्तावेज़ unlocker.webunlocker पैरामीटर को कवर करते हैं। जब आप एक पुनरावृत्ति कार्य की योजना बनाते हैं, तो Scrapeless मूल्य निर्धारण की जांच करें।
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: क्या parsel अपने आप वेबसाइटों को स्क्रेप कर सकता है?
नहीं। parsel उस HTML से डेटा का चयन करता है जो आपके पास पहले से है; इसमें कोई HTTP क्लाइंट नहीं है और यह किसी JavaScript को नहीं चलाता है। इसे फ़ेच परत के साथ जोड़ें - यहां Scrapeless यूनिवर्सल स्क्रैपिंग API, जो पृष्ठ को सर्वर-साइड प्रस्तुत करता है - और parsel प्राप्त मार्कअप से निष्कर्षण संभालता है।
प्रश्न: parsel और Scrapy चयनकर्ताओं के बीच क्या अंतर है?
कोई नहीं, व्यवहार में - पार्सेल वह चयन इंजन है जिसका उपयोग स्क्रैपी करता है, जिसे एक स्वतंत्र पुस्तकालय के रूप में जारी किया गया है। यदि आपने स्क्रैपी स्पाइडर में response.css या response.xpath का उपयोग किया है, तो यह पार्सेल है। इसे सीधे उपयोग करने से आपको संपूर्ण ढांचे को अपनाए बिना चयन API को बनाए रखने की अनुमति मिलती है।
प्रश्न: क्या मुझे पार्सेल के साथ CSS या XPath का उपयोग करना चाहिए?
दोनों, आवश्यकता के अनुसार। CSS वर्ग- और टैग-आधारित चयन के लिए छोटा होता है; XPath टेक्स्ट, स्थिति, या अक्ष द्वारा चयन को संभालता है, जिसे CSS व्यक्त नहीं कर सकता। पार्सेल दोनों को एक ही वृक्ष के खिलाफ चलाता है, इसलिए प्रत्येक क्षेत्र के लिए उन्हें मिलाएँ।
प्रश्न: क्या पार्सेल जावास्क्रिप्ट-जनित पृष्ठों को संभालता है?
अपने आप नहीं - यह कभी भी स्क्रिप्टों को निष्पादित नहीं करता। यदि सामग्री प्रारंभिक HTML के बाद लोड होती है, तो एक साधारण फ़ेच पार्सेल को एक खाली वृक्ष देता है। पहले js_render के साथ स्क्रैपलेस API के माध्यम से पृष्ठ को फेच करें, फिर प्रस्तुत HTML से चयन करें, जैसा कि यह गाइड करता है।
प्रश्न: क्या पार्सेल के साथ स्क्रैपिंग कानूनी है?
चयन पुस्तकालय संग्रह नियमों को नहीं बदलता है। केवल सार्वजनिक पृष्ठों को फेच करें, साइट की शर्तों और रोबोट्स बहिष्करण प्रोटोकॉल द्वारा मानकीकृत रोबोट निर्देशों का सम्मान करें, मात्राएँ सीमित रखें, और आपके लिए लागू कानूनों के तहत किसी भी व्यक्तिगत डेटा को संभालें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



