नीक्वेस्ट्स वेब स्क्रैपिंग: पायथन के लिए आधुनिक एचटीटीपी/2 अनुरोध
Senior Web Scraping Engineer
TL;DR:
- niquests एक drop-in विकल्प है requests के लिए जिसमें वही API है और HTTP/2, HTTP/3, और कनेक्शन मल्टीप्लेक्सिंग शामिल है — इंपोर्ट बदलें और आपका कोड काम करता रहे।
- जो niquests नहीं करता वह है JavaScript को प्रस्तुत करना। यह एक HTTP क्लाइंट है; एक स्क्रिप्ट-निर्मित पेज पर यह सर्वर द्वारा भेजा गया मार्कअप लौटाता है, जिसमें कोई सामग्री नहीं होती।
- गैप एक स्क्रिप्ट में दिखता है। niquests HTTP/2 के माध्यम से एक JavaScript-निर्मित डेमो पेज लाने की कोशिश करता है और इसमें 0 कोट ब्लॉक्स पाता है।
- niquests Scrapeless को कॉल करने वाला क्लाइंट भी है। एक लाइव रन ने उसी सत्र का उपयोग करके Scrapeless यूनिवर्सल स्क्रेपिंग API को URL POST किया, प्रस्तुत HTML वापस मिला, और इससे सभी 10 लेखकों को निकाला।
- दोनों कार्यों के लिए एक HTTP क्लाइंट। जहां ये काम करते हैं वहां सीधे फ़ेच, और जहां प्रस्तुति की आवश्यकता है वहां Scrapeless API — वही
Session, वही API। - फ़ेच साइड पर शुरू करने के लिए स्वतंत्र। app.scrapeless.com पर अपना Scrapeless API कुंजी बनाएं।
niquests क्या है, और क्या नहीं है
niquests requests की एक शाखा है जो उस API को बनाए रखती है जिसे आप पहले से जानते हैं — Session, get, post, json() — और उन परिवहन विशेषताओं को जोड़ती है जो requests कभी नहीं मिलीं: HTTP/2 और HTTP/3, कनेक्शन मल्टीप्लेक्सिंग, और DNS-over-HTTPS। एक स्क्रैपर के लिए, व्यावहारिक लाभ यह है कि import niquests as requests एक मौजूदा कोडबेस को बिना पुनर्लेखन के आधुनिक HTTP में अपग्रेड करता है, और मल्टीप्लेक्स्ड परिवहन कई अनुरोधों को कम कनेक्शनों पर स्थानांतरित करता है।
यह एक ब्राउज़र नहीं है। niquests HTTP बोलता है, इसलिए यह ठीक वही लौटाता है जो सर्वर भेजता है; यह JavaScript को नहीं चलाता है जो एक आधुनिक पृष्ठ की सामग्री का निर्माण करता है। एक तेज़, अधिक आधुनिक परिवहन यह नहीं बदलता है — HTTP/2 के माध्यम से लाए गए एक खाली पृष्ठ में अभी भी कोई सामग्री नहीं होती है। इसलिए एक niquests स्क्रैपर एक ग्राहक के लिए दो कार्य हैं: उन पृष्ठों को लाना जो उनकी सामग्री सीधे प्रदान करते हैं, और उन पृष्ठों के लिए जो स्क्रिप्ट के साथ इसे बनाते हैं, एक प्रस्तुति API को कॉल करना। यह गाइड दूसरे कार्य के लिए Scrapeless यूनिवर्सल स्क्रेपिंग API का उपयोग करती है, जिसमें niquests स्वयं वह कॉल करती है। व्यापक उपकरण सेट के लिए, Python वेब स्क्रेपिंग ट्यूटोरियल साथी है।
इंस्टॉल
niquests पूरा उपकरण श्रृंखला है — इस गाइड के लिए कोई अलग पार्सर की आवश्यकता नहीं है। इस गाइड के लिए लिखी गई संस्करण niquests 3.20.1 है:
bash
pip install "niquests==3.20.1"
अपनी कुंजी को वातावरण में रखें, कभी भी स्रोत में नहीं:
bash
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
सीधा फ़ेच, और जहां यह रुकता है
niquests को एक JavaScript-निर्मित पृष्ठ पर इंगित करें और एक समय में दो बातें सही होती हैं: परिवहन आधुनिक है, और सामग्री गायब है। कनेक्शन HTTP/2 को बातचीत करता है — एक प्रोटोकॉल जिसे HTTP/2 मानक द्वारा परिभाषित किया गया है जो requests नहीं बोलता है — फिर भी लौटाया गया मार्कअप में शून्य कोट ब्लॉक्स हैं, क्योंकि सामग्री क्लाइंट-साइड पर बनाई जाती है HTML स्क्रिप्टिंग विशिष्टता के अनुसार:
python
# direct.py — आधुनिक परिवहन, गायब सामग्री
import niquests
session = niquests.Session()
resp = session.get("https://quotes.toscrape.com/js/", timeout=30)
print("http version:", resp.conn_info.http_version)
print("js-page quote blocks:", resp.text.count('class="quote"'))
परिवहन HTTP/2 है; सामग्री वहां नहीं है:
text
http version: HttpVersion.h2
js-page quote blocks: 0
वह शून्य niquests की विफलता नहीं है — यह एक HTTP क्लाइंट के लिए सही परिणाम है उस पृष्ठ पर जिसकी सामग्री स्क्रिप्ट चलने के बाद आती है। समाधान एक फ़ेच परत है जो प्रस्तुत करती है।
प्रस्तुत फ़ेच, niquests Scrapeless को कॉल कर रहा है
उसी सत्र को बनाए रखें और लक्ष्य बदलें: पृष्ठ के बजाय, Scrapeless यूनिवर्सल स्क्रेपिंग API को इसके URL को POST करें, जो सर्वर-साइड पर प्रस्तुत करता है और पूरा HTML लौटाता है। niquests इस अनुरोध को किसी अन्य की तरह संभालता है, इसलिए एक क्लाइंट दोनों मार्गों को कवर करता है — अनुरोध और प्रतिक्रिया परत यहां HTTP सेमान्टिक्स मानक का पालन करती है:
python
# rendered.py — niquests कॉल करता है प्रस्तुति API, फिर निकालता है
import os
import re
import niquests
session = niquests.Session()
resp = session.post(
"https://api.scrapeless.com/api/v2/unlocker/request",
headers={"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()
html = resp.json()["data"]
authors = re.findall(r'<small class="author">(.*?)</small>', html)
print("rendered quote blocks:", html.count('class="quote"'))
print("authors extracted:", len(authors))
print("first author:", authors[0])
अब सामग्री मौजूद है और निकाली जा सकती है:
text
rendered quote blocks: 10
authors extracted: 10
पहला लेखक: अल्बर्ट आइंस्टीन
यह पूरा स्क्रेपर है, और यह कभी भी निस्क्वेस्ट नहीं छोड़ेगा: एक `सत्र` जहां सीधे अनुरोध किया गया है जहाँ यह काम करता है और एक स्क्रेपलेस अनुरोध जहां रेंडरिंग की आवश्यकता है। [यूनिवर्सल स्क्रापिंग एपीआई](https://www.scrapeless.com/hi/product/universal-scraping-api?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) रेंडरिंग करता है; निस्क्वेस्ट HTTP को संभालता है।
> अपने API कुंजी को मुफ्त योजना पर प्राप्त करें: [app.scrapeless.com](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping)
## उन्नत पैटर्न
- **एक पंक्ति में माइग्रेट करें।** `import niquests as requests` एक मौजूदा `requests` कोडबेस को HTTP/2 और मल्टिप्लेक्सिंग को कोई और परिवर्तन किए बिना अपनाने की अनुमति देता है; एपीआई वही है।
- **सत्र का पुनरुपयोग करें।** एकल `niquests.Session()` कनेक्शन को पूल और मल्टिप्लेक्स करता है, जहाँ परिवहन लाभ कई अनुरोधों में दिखाई देता है — इसे एक बार बनाएं और चारों ओर भेजें।
- **जब आप regex से बाहर निकलें तो एक असली पार्सर जोड़ें।** यहाँ regex उदाहरण को एक निर्भरता तक सीमित रखता है; फ्लैट सूची से परे किसी भी चीज़ के लिए, `resp.json()["data"]` को एक चयनकर्ता पुस्तकालय में फ़ीड करें और संरचित फ़ील्ड का चयन करें।
- **इसे बातचीत करने दें।** निस्क्वेस्ट HTTP/2 या HTTP/3 का चयन करता है जब सर्वर इसे पेश करता है और जब यह नहीं होता है तब साफ-सुथरी वापसी करता है; आप संस्करण को कॉन्फ़िगर नहीं करते हैं, आप इसे तब पढ़ते हैं जब आप पुष्टि करना चाहते हैं।
## समस्या निवारण
- **`conn_info.http_version` HTTP/1.1 है।** सर्वर ने उस अनुरोध के लिए HTTP/2 की पेशकश नहीं की, या एक मध्यवर्ती ने इसे डाउनग्रेड किया। यह सामान्य है और कोई त्रुटि नहीं है; निस्क्वेस्ट उपलब्ध सबसे अच्छे संस्करण का उपयोग करता है।
- **एक पृष्ठ से शून्य ब्लॉक जो आप एक ब्राउज़र में देख सकते हैं।** सामग्री JavaScript द्वारा रेंडर की गई है और प्रत्यक्ष फ़ेच ने प्री-रेंडर HTML लौटाया - `js-page quote blocks: 0` मामला। उस URL को `js_render` के साथ स्क्रेपलेस कॉल के माध्यम से रूट करें।
- **स्क्रेपलेस प्रतिक्रिया पर `json()` उठता है।** अनुरोध रेंडरिंग से पहले असफल हो गया। पहले `raise_for_status()` कॉल करें, और पुष्टि करें कि कुंजी सेट है और अभिनेता और इनपुट जैसा दिखता है।
- **सुस्त पृष्ठों पर टाइमआउट।** रेंडरिंग एक स्थिर फ़ेच की तुलना में अधिक समय लेती है। स्क्रेपलेस POST को उदार `timeout` दें, जैसा कि उदाहरण करता है, न कि सीधे अनुरोध के लिए उपयोग किए जाने वाले छोटे डिफ़ॉल्ट को।
## निष्कर्ष
निस्क्वेस्ट एक स्क्रेपर की आवश्यकता के लिए एक HTTP क्लाइंट के रूप में अपना स्थान अर्जित करता है: आधुनिक परिवहन के साथ `requests` एपीआई, सीधे फ़ेच और रेंडरिंग एपीआई की कॉल दोनों को संभालते हुए। वह परत जो एक स्क्रिप्ट-निर्मित पृष्ठ को सामग्री में बदलती है वह फ़ेच है - प्रत्यक्ष अनुरोध का शून्य-ब्लॉक्स परिणाम इसे तय करता है - और एक स्क्रेपलेस POST, जो निस्क्वेस्ट द्वारा स्वयं बनाया गया है, यह अंतर को बंद करता है। इन दोनों पथों को एकल सत्र में वायर्ड करें और डेमो पृष्ठ के दस लेखक HTTP के माध्यम से वापस आते हैं जिसे आपको फिर से लिखने की आवश्यकता नहीं थी।
[एक मुफ्त स्क्रेपलेस खाता बनाएं](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) ताकि आप एक API कुंजी प्राप्त कर सकें, और [डेवलपर डॉक्स](https://docs.scrapeless.com?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) `unlocker.webunlocker` पैरामीटर को कवर करता है। जब आप एक पुनरावृत्ति कार्य की योजना बनाते हैं तो [स्क्रेपलेस की कीमत](https://www.scrapeless.com/hi/pricing?utm_source=website&utm_medium=blog&utm_campaign=universalscrapingapi&utm_term=niquests-web-scraping) देखें।
## FAQ
**प्रश्न: क्या निस्क्वेस्ट अपने आप से JavaScript द्वारा रेंडर की गई पृष्ठों को स्क्रैप कर सकता है?**
नहीं। निस्क्वेस्ट एक HTTP क्लाइंट है, न कि एक ब्राउज़र; यह सर्वर द्वारा भेजा गया मार्कअप लौटाता है और कोई स्क्रिप्ट नहीं चलाता है। एक पृष्ठ जो अपने सामग्री को क्लाइंट-साइड बनाता है, उस पर सीधे फ़ेच के साथ सामग्री के बिना वापस आता है - गाइड का शून्य-ब्लॉक्स परिणाम। उन पृष्ठों को स्क्रेपलेस यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से रूट करें, जो उन्हें रेंडर करता है, और निस्क्वेस्ट वो कॉल भी करता है।
**प्रश्न: निस्क्वेस्ट `requests` से अलग कैसे है?**
एक ही API, नया परिवहन। निस्क्वेस्ट एक `requests` फोर्क है जो HTTP/2, HTTP/3, कनेक्शन मल्टिप्लेक्सिंग, और DNS-over-HTTPS जोड़ता है, जबकि `Session`, `get`, `post`, और `json()` को समान रखता है। `import niquests as requests` आमतौर पर पूरी माइग्रेशन होती है।
**प्रश्न: क्या मुझे एक अलग पार्सर की आवश्यकता है?**
फील्ड की एक फ्लैट सूची के लिए, एक regex या मानक पुस्तकालय पर्याप्त है, जैसा कि दिखाया गया है। नेस्टेड या संरचित निष्कर्षण के लिए, निस्क्वेस्ट को एक चयनकर्ता पुस्तकालय के साथ जोड़ें - निस्क्वेस्ट फ़ेच करता है, पार्सर चयन करता है। यह गाइड जानबूझकर एक निर्भरता तक सीमित है।
**प्रश्न: क्या HTTP/2 स्क्रेपिंग ब्लॉकों के साथ मदद करता है?**
यह एक परिवहन अपग्रेड है, न कि एक एंटी-ब्लॉकिंग उपाय। HTTP/2 मल्टिप्लेक्सिंग कई अनुरोधों में थ्रूपुट को सुधारता है, लेकिन यह JavaScript को रेंडर नहीं करता है या पहुंच की चुनौतियों को स्पष्ट नहीं करता है - यह फ़ेच परत का काम है, यही कारण है कि रेंडरिंग पथ स्क्रेपलेस के माध्यम से जाता है।
**प्रश्न: क्या निस्क्वेस्ट के साथ स्क्रेपिंग कानूनी है?**
HTTP क्लाइंट संग्रह नियमों को नहीं बदलता है। केवल सार्वजनिक पृष्ठ प्राप्त करें, साइट की शर्तों का सम्मान करें और <a href="https://datatracker.ietf.org/doc/html/rfc9309" rel="nofollow"><strong>रोबोट्स बहिष्करण प्रोटोकॉल</strong></a> द्वारा मानकीकृत रोबोट निर्देशों का पालन करें, मात्रा को सीमित रखें, और किसी भी व्यक्तिगत डेटा को उन कानूनों के तहत संभालें जो आप पर लागू होते हैं।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



