जेपीएमईएसपाथ वेब स्क्रैपिंग: JSON एपीआई को घोषणात्मक रूप से क्वेरी करें
Advanced Data Extraction Specialist
TL;DR:
- jmespath जेसन को डिक्लेरेटिव तरीके से क्वेरी करता है। एक एक्सप्रेशन एक नेस्टेड एपीआई रिस्पॉन्स को फ्लैट रिकॉर्ड में बदल देता है — बिना लूप्स, बिना मैन्युअल डिक्शनरी चलाने के।
- जेसन एपीआई सबसे साफ़ स्क्रैपिंग टारगेट हैं। कई साइटें अपने पन्नों को एक बैकएंड जेसन एपीआई से बनाती हैं; उस जेसन को प्राप्त करें और डेटा पहले से ही संरचित होता है।
- जेसन एपीआई को प्राप्त करना jmespath का काम नहीं है। इसमें कोई HTTP क्लाइंट नहीं है और यह HTML पार्स नहीं करता; आप इसे एक डिकोडेड जेसन ऑब्जेक्ट देते हैं और यह उसकी क्वेरी करता है।
- जब एपीआई सुरक्षित हो तो Scrapeless के माध्यम से प्राप्त करें। एक लाइव रन ने Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से एक उत्पाद एपीआई को खींचा, फिर jmespath का उपयोग करके परिणामों का चयन, फ़िल्टर, और क्रमबद्धता की।
- एक लाइन में फ़िल्टर और प्रोजेक्शन।
products[?price < \50`].titleने $50 से कम के छह उत्पाद लौटाए;sort_by(products, &price)[0]` ने सबसे सस्ता लौटा दिया। - प्राप्त करने के पक्ष पर शुरू करने के लिए स्वतंत्र। app.scrapeless.com पर अपना Scrapeless एपीआई कुंजी बनाएं।
jmespath क्या है, और क्या नहीं है
jmespath जेसन के लिए एक क्वेरी भाषा है। आप एक एक्सप्रेशन लिखते हैं जो उस आकार का वर्णन करता है जो आप चाहते हैं, और पुस्तकालय दस्तावेज़ को चलाता है और इसे लौटाता है — प्रोजेक्शन एक सूची के प्रत्येक तत्व से एक फ़ील्ड खींचता है, फ़िल्टर केवल उन तत्वों को रखते हैं जो एक स्थिति से मेल खाते हैं, और मल्टिसिलेक्ट हैश प्रत्येक तत्व को छोटे रिकॉर्ड में फिर से बनाता है। यह वही एक्सप्रेशन भाषा है जिसका उपयोग AWS CLI अपने --query फ्लैग के लिए करता है, JMESPath स्पेसिफिकेशन द्वारा मानकीकरण किया गया है, और एक छोटे Python पुस्तकालय के रूप में उपलब्ध है।
यह एक क्वेरी भाषा है, स्क्रैपर नहीं। jmespath में कोई HTTP क्लाइंट नहीं है, यह यूआरएल को प्राप्त नहीं करता, और HTML को पार्स नहीं करता — यह एक जेसन मान पर काम करता है जिसे आप पहले से ही डिकोड कर चुके हैं, जेसन डेटा इंटरचेंज मानक द्वारा परिभाषित किया गया। इसलिए "jmespath वेब स्क्रैपिंग" सेटअप दो परतें हैं: कुछ जो जेसन लौटाता है, और jmespath जो इसे फिर से आकार देता है। यह महत्वपूर्ण है क्योंकि आधुनिक साइटों पर डेटा का एक बड़ा हिस्सा एक बैकएंड जेसन एपीआई द्वारा प्रदान किया जाता है जिसे पृष्ठ पृष्ठभूमि में कॉल करता है; उस एपीआई बिंदु को सीधे हिट करना HTML पार्सिंग को पूरी तरह से छोड़ देता है। जब एपीआई बिंदु भू-प्रतिबंधित या दर-सीमित हो, तो यह गाइड इसे Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से प्राप्त करता है। स्क्रैपिंग के HTML पक्ष के लिए, Python वेब स्क्रैपिंग ट्यूटोरियल इसके बजाय सेलेक्टर्स को कवर करता है।
इंस्टॉल करें
jmespath और requests समग्र टूलचेन हैं। यह गाइड जिस संस्करण पर लिखा गया है वह jmespath 1.0.1 है:
bash
pip install "jmespath==1.0.1" requests
अपने कुंजी को वातावरण में रखें, कभी भी स्रोत में नहीं:
bash
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
Scrapeless के माध्यम से एक JSON एपीआई को प्राप्त करें
प्राप्ति परत कच्चा JSON लौटाती है। क्योंकि एपीआई बिंदु JSON प्रदान करता है न कि रेंडर किए गए पृष्ठ, js_render बंद रहता है; Scrapeless एपीआई अनुरोध, प्रॉक्सी राउटिंग, और किसी भी एक्सेस नियंत्रण को एपीआई बिंदु के सामने संभालता है, और HTTP सेमान्टिक्स मानक द्वारा परिभाषित सामग्री लौटाता है। इसे एक बार डिकोड करें और jmespath अपने प्रभुत्व में ले लेता है:
python
# fetch.py — Scrapeless के माध्यम से एक JSON एपीआई को खींचें, फिर इसकी क्वेरी करें
import json
import os
import jmespath
import requests
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://dummyjson.com/products?limit=10", "js_render": False}},
timeout=120,
)
resp.raise_for_status()
payload = json.loads(resp.json()["data"])
print("पृष्ठ में उत्पाद:", jmespath.search("length(products)", payload))
print("पहला शीर्षक:", jmespath.search("products[0].title", payload))
print("कुल उपलब्ध:", jmespath.search("total", payload))
रन बिना एकल लूप के रिस्पॉन्स के आकार को पढ़ता है:
text
पृष्ठ में उत्पाद: 10
पहला शीर्षक: Essence Mascara Lash Princess
कुल उपलब्ध: 194
Scrapeless कॉल प्राप्ति परत है — यूनिवर्सल स्क्रैपिंग एपीआई JSON सामग्री लौटाता है, और payload अब एक सामान्य Python ऑब्जेक्ट है जिसे jmespath क्वेरी कर सकता है।
jmespath के साथ पुनः आकार और फ़िल्टर करें
jmespath का उद्देश्य एक लंबी रिस्पॉन्स को ठीक वही रिकॉर्ड में बदलना है जो आप चाहते हैं। एक प्रोजेक्शन एक मल्टिसिलेक्ट हैश के साथ प्रत्येक उत्पाद का पुनर्निर्माण करता है; एक फ़िल्टर एक्सप्रेशन केवल मिलान रखने के लिए; sort_by उन्हें क्रमबद्ध करता है — सभी एक्सप्रेशनों के रूप में, प्रक्रियात्मक कोड नहीं:
python
# query.py — तीन एक्सप्रेशनों में पुनर्संरचना, फ़िल्टर और क्रमबद्ध करें
import json
import os
import jmespath
import requests
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://dummyjson.com/products?limit=10", "js_render": False}},
timeout=120,
)
resp.raise_for_status()
payload = json.loads(resp.json()["data"])
records = jmespath.search("products[].{title: title, price: price, rating: rating}", payload)
under_50 = jmespath.search("products[?price < 50].title", payload)
cheapest = jmespath.search("sort_by(products, &price)[0].{title: title, price: price}", payload)
print("records:", len(records))
print("first record:", json.dumps(records[0], ensure_ascii=False))
print("under $50:", len(under_50))
print("cheapest:", json.dumps(cheapest, ensure_ascii=False))
प्रत्येक लाइन एक क्वेरी है जो एक लूप का काम करती है:
```text
रिकार्ड: 10
पहला रिकॉर्ड: {"title": "Essence Mascara Lash Princess", "price": 9.99, "rating": 2.56}
$50 के तहत: 6
सस्ता: {"title": "Red Nail Polish", "price": 8.99}
यह संपूर्ण एक्सट्रैक्टर है: JSON को प्राप्त करने के लिए एक POST, इसे आकार देने के लिए तीन अभिव्यक्तियाँ। मल्टीसेलेक्ट हैश {title: title, price: price} काम करने वाला है - यह उन फ़ील्ड को छोड़ देता है जिनकी आपको आवश्यकता नहीं है और जो चीजें आप रखते हैं उन्हें पुनः नामित करता है, ताकि आप जो स्टोर करते हैं वह वास्तव में वही हो जो आपने मांगा था।
मुफ़्त योजना पर अपना एपीआई कुंजी प्राप्त करें: app.scrapeless.com
उन्नत पैटर्न
- प्रक्षिप्त करने से पहले फ़िल्टर करें।
products[?rating > \4.5`].{title: title}` सबसे पहले मेल खाने वालों को रखता है, फिर उन्हें पुनः आकार देता है; पाइप का यह क्रम अभिव्यक्ति को पढ़ने में आसान और परिणाम को छोटा बना देता है। []के साथ घोंसले में सूची को समतल करें। जब रिकॉर्ड अपनी स्वयं की सूचियाँ समेटते हैं, तोproducts[].reviews[].ratingप्रत्येक उत्पाद के लिए प्रत्येक समीक्षा रेटिंग को एक सूची में समतल करता है - समतल ऑपरेटर वही काम करता है जो एक डबल लूप करेगा।|के साथ अभिव्यक्तियों को पाइप करें।products | length(@)औरsort_by(@, &price) | [0]एक परिणाम को अगली अभिव्यक्ति में चैन करते हैं;@वर्तमान नोड है, जिससे आप एक क्वेरी के आउटपुट को दूसरे में फीड करते हैं।- खोई हुई कुंजियों के खिलाफ सुरक्षा। jmespath एक ऐसे पथ के लिए
Noneलौटाता है जो अनुपस्थित है न कि उठाता है, इसलिए एक फ़ील्ड जो केवल कुछ रिकॉर्ड उठाते हैं वह क्वेरी को क्रैश नहीं करेगा - जब आप इसे स्टोर करते हैं तोNoneकी जाँच करें।
समस्या निवारण
json.loadsउत्तर पर उठता है। एंडपॉइंट ने HTML लौटाया, ना कि JSON - अक्सर एक त्रुटि या ब्लॉक पृष्ठ। पुष्टि करें कि URL JSON API है और ना कि HTML पृष्ठ जो इसे कॉल करता है, और यह सुनिश्चित करें कि फेच सफल हुआ है इससे पहले कि डिकोडिंग हो।- एक प्रक्षिप्ति खाली सूची लौटाती है। पथ दस्तावेज़ के आकार से मेल नहीं खाता। शीर्ष स्तर की कुंजियों को प्रिंट करें और एक बार में एक स्तर नीचे चलें; JSON APIs अपनी सूचियों को एक कुंजी जैसे
productsयाresultsके तहत नेस्ट करते हैं, न कि जड़ में। - एक फ़िल्टर कुछ भी मेल नहीं खाता। फ़िल्टर में संख्याओं और स्ट्रिंग के लिए बैकटीक लिटेरल आवश्यक होते हैं -
price < \50`ना किprice < 50`। बिना बैकटीक्स के मान को फ़ील्ड नाम के रूप में पढ़ा जाता है। - परिणाम में आप जो नहीं चाहते थे उसके फ़ील्ड बने रहते हैं। आपने एक नग्न प्रक्षिप्ति
products[]का उपयोग किया बजाय एक मल्टीसेलेक्ट हैश के। केवल फ़ील्ड का चयन करने के लिए{title: title, price: price}जोड़ें।
निष्कर्ष
jmespath अपने स्थान को सही ठहराता है क्योंकि यह एक JSON प्रतिक्रिया को रिकॉर्ड में बदलता है बिना प्रक्रियात्मक कोड के: प्रक्षिप्तियाँ, फ़िल्टर, और सॉर्ट्स एकल अभिव्यक्तियों के रूप में। JSON पाने वाला स्तर फेच है - एक बैकएंड एपीआई सबसे साफ स्रोत है, और एक Scrapeless POST उसके निकास की सुरक्षा से परे उसके शरीर को लौटाता है। इन दोनों को एक साथ जोड़ें और एक विस्तारपूर्ण उत्पाद फ़ीड वह चार फ़ील्ड बन जाती है जिसे आप वास्तव में स्टोर करते हैं।
एक मुफ़्त Scrapeless खाता बनाएं एक API कुंजी प्राप्त करने के लिए, और डेवलपर डॉक्स unlocker.webunlocker पैरामीटर को कवर करते हैं। जब आप एक आवर्ती नौकरी की योजना बनाएं तो Scrapeless मूल्य निर्धारण की जाँच करें।
सामान्य प्रश्न
प्र: क्या jmespath स्वयं वेबसाइटों को स्क्रैप कर सकता है?
नहीं। jmespath एक JSON मान को क्वेरी करता है जो आपके पास पहले से है; इसमें कोई HTTP क्लाइंट नहीं है और यह URLs को फैच या HTML को पार्स नहीं करता है। इसे एक फेच स्तर के साथ जोड़ें - यहाँ Scrapeless यूनिवर्सल स्क्रैपिंग एपीआई, जो JSON बॉडी लौटाता है - और jmespath इसे रिकॉर्ड में फिर से आकार देता है।
प्र: HTML पृष्ठ के बजाय JSON API को स्क्रैप क्यों करें?
क्योंकि डेटा पहले से ही संरचित रूप में आता है। कई पृष्ठ एक बैकएंड JSON एंडपॉइंट से रेंडर होते हैं जिसे वे पीछे की ओर कॉल करते हैं; उस एंडपॉइंट को हिट करने से HTML पार्सिंग और चुनने के रखरखाव को पूरी तरह से छोड़ देता है, और jmespath प्रतिक्रिया को ठीक उसी रिकॉर्ड में बदल देता है जो आप चाहते हैं।
प्र: jmespath jsonpath से अलग कैसे है?
दोनों क्वेरी JSON हैं, लेकिन jmespath का एक औपचारिक स्पेसिफिकेशन और प्रक्षिप्तियों, फ़िल्टरों, कार्यों और मल्टीसेलेक्ट हैशेस के साथ एक संक्षिप्त अभिव्यक्ति भाषा है जो आउटपुट को पुनः आकार देती है। इसका मल्टीसेलेक्ट सिंटैक्स — क्वेरी में फ़ील्ड को नाम बदलना और छोड़ना — यह फीचर है जो इसे निष्कर्षण के लिए एक अच्छा विकल्प बनाता है।
प्रश्न: यदि साइट में कोई JSON API नहीं है तो क्या होगा?
तो इसके बजाय HTML को पार्स करें: Scrapeless के माध्यम से रेंडर की गई पृष्ठ प्राप्त करें और एक चयनकर्ता पुस्तकालय का उपयोग करें। jmespath केवल तब लागू होता है जब स्रोत JSON हो; ये दो दृष्टिकोण दो आकारों को कवर करते हैं जिनमें डेटा आता है।
प्रश्न: क्या JSON API को स्क्रैप करना कानूनी है?
क्वेरी भाषा संग्रहण नियमों को नहीं बदलती। केवल सार्वजनिक एंडपॉइंट्स प्राप्त करें, साइट की शर्तों का सम्मान करें और रोबोट्स निष exclusion प्रोटोकॉल द्वारा मानकीकृत रोबोट निर्देशों का पालन करें, वॉल्यूम को सीमित रखें, और आपके ऊपर लागू कानूनों के तहत किसी भी व्यक्तिगत डेटा को संभालें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



