ChatGPT वेब स्क्रैपिंग: एक व्यावहारिक मार्गदर्शिका
Senior Web Scraping Engineer
TL;DR:
- ChatGPT वेब पृष्ठों को नहीं खोजता - यह आपके द्वारा दी गई पाठ को पार्स करता है। मॉडल में कोई ब्राउज़र, कोई जावास्क्रिप्ट इंजन, और कोई प्रवेश चुनौती को पार करने का तरीका नहीं है, इसलिए हर कार्यशील "ChatGPT वेब स्क्रैपिंग" सेटअप दो स्तरों में होता है: कुछ पृष्ठ को लाता है, फिर मॉडल क्षेत्रों को निकालता है।
- निकासी स्तर वास्तव में अच्छा है। OpenAI Python SDK के संरचित आउटपुट के साथ, आप एक Pydantic स्कीमा परिभाषित करते हैं और
chat.completions.parseमान्य वस्तुएं लौटाता है - जब पृष्ठ लेआउट बदलता है तब कोई चयनकर्ता रखरखाव नहीं। - सीमा मापने योग्य है। एक साधारण HTTP GET पर एक जावास्क्रिप्ट-निर्मित डेमो पृष्ठ 0 उद्धरण तत्व लौटाता है; वही URL
js_renderसक्षम होने के साथ Scrapeless Universal Scraping API के माध्यम से लाए जाने पर सभी 10 लौटाता है। वह अंतर ठीक वही है जो मॉडल अकेले पार नहीं कर सकता। - स्कीमा डिज़ाइन प्रॉम्प्ट चतुराई को मात देता है। Nullable फ़ील्ड, स्पष्ट प्रकार और एक पृष्ठ प्रति कॉल ऐसे निकासी का उत्पादन करते हैं जिन पर आप विश्वास कर सकते हैं; अस्पष्ट प्रॉम्प्ट आत्मविश्वास से निर्माण करते हैं।
- जानें कि आपके हाथ में कौन सा उपकरण है। "ChatGPT वेब स्क्रैपिंग" (यह मार्गदर्शिका - मॉडल को पार्सर के रूप में) ChatGPT स्क्रैपर के विपरीत है, जो ChatGPT के अपने उत्तरों को डेटा के रूप में पकड़ता है।
- शुरू करने के लिए स्वतंत्र। इस मार्गदर्शिका में फेच स्तर स्वतंत्र योजना पर चलता है - अपने API कुंजी को app.scrapeless.com पर बनाएं।
क्या ChatGPT वेबसाइटों को स्क्रेप कर सकता है?
अपने आप नहीं। ChatGPT एक भाषा मॉडल है: यह पढ़ता है और पाठ उत्पन्न करता है, और यह स्क्रैपर के फेच स्तर द्वारा किए जाने वाले किसी भी काम को नहीं करता - अनुरोध भेजना, जावास्क्रिप्ट निष्पादित करना, सत्र रोकना, या एंटी-बॉट चुनौतियों का उत्तर देना। इसमें पृष्ठ पाठ चिपकाएं और यह प्रभावशाली रूप से क्षेत्रों को निकालता है; इसे एक URL पर इंगित करें और आप उस फेच उपकरण के आधार पर निर्भर हो रहे हैं जो उस दिन मॉडल को लपेटता है, जो नRendered या संरक्षित पृष्ठों पर चुपचाप असफल होता है।
इसलिए ChatGPT वेब स्क्रैपिंग की व्यावहारिक वास्तुकला हमेशा समान दो स्तरों में होती है। एक फेच स्तर पृष्ठ की एक सच्ची प्रति प्राप्त करता है। एक निकासी स्तर - एक स्कीमा के साथ OpenAI API - उस प्रति को संरचित रिकॉर्ड में बदल देता है। यह मार्गदर्शिका पहले निकासी स्तर का निर्माण करती है, क्योंकि यहीं ChatGPT अपनी जगह बनाता है, फिर फेच स्तर की विफलता मोड और इसके फ़िक्स को एक ज़िंदा, पुनरुत्पादनीय उदाहरण के साथ प्रदर्शित करती है।
कोड से पहले एक असामान्य स्पष्टीकरण, क्योंकि कीवर्ड वास्तव में अस्पष्ट है: इस मार्गदर्शिका में ChatGPT को स्क्रैपर के मस्तिष्क के रूप में उपयोग किया गया है। विपरीत कार्य - ChatGPT के अपने उत्तरों और उनके उद्धरणों को डेटा के रूप में पकड़ना - एक पूरी तरह से अलग उपकरण है, जो ChatGPT स्क्रैपर API मार्गदर्शिका और व्यापक LLM स्क्रैपर व्याख्याता द्वारा कवर किया गया है।
इंस्टॉल करें
दो पैकेज दोनों स्तरों को कवर करते हैं - निकासी के लिए OpenAI SDK और HTTP के लिए requests। यहाँ पर दी गई संस्करण उन संस्करणों के हैं जिन पर यह मार्गदर्शिका लिखी गई थी (openai 2.34.0):
bash
pip install "openai==2.34.0" requests
कॉन्फ़िगर करें
दोनों स्तर पर्यावरण से प्रमाणीकरण करते हैं, इसलिए कोई कुंजी कभी भी स्रोत कोड में नहीं रहती:
bash
export OPENAI_API_KEY="sk-your_openai_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
बुनियादी कार्यान्वयन: स्कीमा-प्रथम निकासी
वर्तमान OpenAI SDK एक कॉल में संरचित निकासी करता है: रिकॉर्ड को एक Pydantic मॉडल के रूप में परिभाषित करें, इसे response_format के रूप में पास करें, और chat.completions.parse इसका नमूना लौटाता है। स्कीमा विश्वसनीयता को लेकर है। मॉडल उन फ़ील्ड नामों और प्रकारों पर सीमित है जिन्हें आपने घोषित किया - वही संविदा शैली JSON Schema विनिर्देश औपचारिक बनाता है - इसलिए आउटपुट की गुणवत्ता इस बात पर निर्भर करना बंद कर देती है कि आप प्रॉम्प्ट में कितनी सावधानी से मांग करते हैं।
नोट: इस खंड को API क्रेडिट के साथ एक
OPENAI_API_KEYकी आवश्यकता है - इस मार्गदर्शिका की एकमात्र पूर्वापेक्षा, इसलिए निकासी कॉल बिना कैप्चर किए गए आउटपुट के दिखाए जाते हैं और उनके परिणाम के आकार का विवरण नीचे दिखाया गया है। इसके बाद का फेच स्तर केवल एक Scrapeless कुंजी के साथ वास्तविक रूप में चलता है।
python
# extract.py — ChatGPT को निकासी स्तर के रूप में उपयोग करना (OPENAI_API_KEY की आवश्यकता)
from openai import OpenAI
from pydantic import BaseModel
class Quote(BaseModel):
text: str
author: str
tags: list[str]
class QuotePage(BaseModel):
quotes: list[Quote]
client = OpenAI() # पढ़ता है OPENAI_API_KEY को पर्यावरण से
page_html = open("page.html", encoding="utf-8").read()
completion = client.chat.completions.parse(
model="gpt-4.1-mini-2025-04-14",
messages=[
{
"role": "system",
"content": "पृष्ठ से हर उद्धरण निकालें। "
"कुछ नहीं के लिए शून्य का उपयोग करें - एक उद्धरण को पूरी तरह से छोड़ दें बजाय इसके कि फ़ील्ड का अविष्कार करें।",
},
{"भूमिका": "उपयोगकर्ता", "सामग्री": "पृष्ठ_html"},
],
प्रतिक्रिया_फॉर्मेट=क्वोटपृष्ठ,
)
पृष्ठ = पूर्णता.चुनाव[0].संदेश.पार्स किया गया
प्रिंट(फ"निकाला {len(pृष्ठ.उद्धरण)} उद्धरण")
एक पार्स किए गए पृष्ठ पर यह एक QuotePage लौटाता है जिसका .उद्धरण सूची में हर रिकॉर्ड के लिए एक मान्य Quote होता है — टाइप किए गए पायथन ऑब्जेक्ट, न कि एक स्ट्रिंग जिसे आपको अभी भी json.loads करना और बचाना होगा। वर्तमान पैरामीटर और स्कीमा नियम ओपनएआई संरचित आउटपुट गाइड में हैं।
उन्नत पैटर्न
तीन आदतें एक विश्वसनीय एक्सट्रैक्टर को डेमो से अलग करती हैं:
- अनुपस्थिति को प्रदर्शित करना। यदि कोई फ़ील्ड वास्तविक पृष्ठ पर गायब हो सकता है, तो इसे
str | Noneटाइप करें और सिस्टम संदेश में ऐसा कहें। केवल अनिवार्य स्ट्रिंग वाले स्कीमा से मॉडल को अंतराल भरने के लिए मजबूर किया जाता है, और यह ऐसा करेगा। - मॉडल को कम पृष्ठ दें। एचटीएमएल क्रोम टोकन की लागत आती है और ध्यान भंग करती है। यदि आप सामग्री कंटेनर को एकीकृत कर सकते हैं — या एचटीएमएल के बजाय पृष्ठ को मार्कडाउन के रूप में प्राप्त कर सकते हैं — तो निष्कर्ष सस्ता और अधिक सटीक हो जाएगा।
- प्रत्येक कॉल में एक पृष्ठ रखें। एक प्रांप्ट में दस पृष्ठों को जोड़ने से अनुरोधों को बचाने में मदद मिलती है और इसकी सटीकता में कठिनाई बढ़ती है: रिकॉर्ड पृष्ठ सीमाओं के पार बह जाते हैं। लूप पायथन में होना चाहिए, न कि प्रांप्ट में।
एक दूसरा, पुराना तरीका भी है चैटजीपीटी का उपयोग करने के लिए: आप इसे लेखने के लिए कहते हैं एक चयनकर्ता-आधारित स्क्रिप्ट, फिर उस स्क्रिप्ट को हर पृष्ठ पर चलाते हैं। यह स्थिर लेआउट पर उच्च-वॉल्यूम कार्य के लिए सही कॉल बनी रहती है - जनरेट किया गया कोड पहले पृष्ठ के बाद मुफ्त में चलता है - लेकिन आप इसे किसी भी कोड처럼 समीक्षा करते हैं जिसे आपने नहीं लिखा, और यह अगले अनुभाग में हर फेच-लेयर की सीमाओं को विरासत में लेता है।
ईमानदार सीमा: चैटजीपीटी पृष्ठ नहीं ला सकता
ऊपर सब कुछ मान लिया गया कि page.html मौजूद है और विश्वसनीय है। यह धारणा वह जगह है जहां केवल ChatGPT स्क्रैपिंग टूटती है, और टूटन दोहराने योग्य है। एक साधारण HTTP GET वही बाइट्स लौटाता है जो सर्वर भेजता है - HTTP अर्थशास्त्र विशिष्टता के अनुसार, संसाधन का एक प्रतिनिधित्व, न कि वह पृष्ठ जो एक ब्राउज़र इससे बनाएगा। एक जावास्क्रिप्ट-निर्मित पृष्ठ पर ये बहुत विभिन्न दस्तावेज हैं:
python
# plain_fetch.py — जावास्क्रिप्ट-निर्मित पृष्ठ पर वास्तव में एक साधारण GET क्या देखता है
import requests
url = "https://quotes.toscrape.com/js/"
resp = requests.get(url, timeout=60)
html = resp.text
print(f"स्थिति {resp.status_code} | {len(html):,} अक्षर")
print("एचटीएमएल में उद्धरण तत्व:", html.count('<span class="text"'))
रन प्रिंट करता है स्थिति 200 — एक पूरी तरह सफल अनुरोध — और 0 उद्धरण तत्व, क्योंकि इस डेमो पृष्ठ पर उद्धरण केवल एक स्क्रिप्ट वेरिएबल के अंदर मौजूद हैं जब तक कि एक जावास्क्रिप्ट इंजन DOM का निर्माण नहीं करता। इस एचटीएमएल को उपरोक्त एक्सट्रैक्टर को सौंपें और सबसे संभावित मॉडल कुछ भी निकालता नहीं है, या इससे भी बुरा, अनुमान लगाता है।
फिक्स यह है कि आप निकालने से पहले रेंडर करें। यूनिवर्सल स्क्रैपिंग API एक ही URL को एक POST में लेता है, पृष्ठ को js_render सक्षम के साथ सर्वर-पक्ष पर निष्पादित करता है, और DOM लौटाता है जो एक पाठक देखेगा - अनलॉकिंग और प्रॉक्सी राउटिंग शामिल है, कुछ भी स्थानीय रूप से चलाने के लिए नहीं:
python
# rendered_fetch.py — निष्कर्षण से पहले सर्वर-पक्ष पर रेंडर किया गया वही URL
import os
import requests
resp = requests.post(
"https://api.scrapeless.com/api/v1/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/", "method": "GET", "js_render": True},
},
timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")
print(f"रेंडर किया गया पृष्ठ: {len(html):,} अक्षर")
print("एचटीएमएल में उद्धरण तत्व:", html.count('<span class="text"'))
with open("page.html", "w", encoding="utf-8") as f:
f.write(html)
वही URL, और रन प्रिंट करता है 10 उद्धरण तत्व 8,940 अक्षरों के रेंडर किए गए एचटीएमएल में — फ़ाइल जिसे निष्कर्षण परत को पहले से अपेक्षित था। दोनों प्रिंट एक साथ पूरे तर्क हैं: साधारण फ़ेचिंग में 0 उद्धरण तत्व, रेंडर किए गए में 10। दोनों स्क्रिप्टों को संयोजित करें और आपके पास काम करने का पैटर्न है: Scrapeless के माध्यम से रेंडर करें, ChatGPT के साथ निकालें।
अपने फ्री प्लान पर अपना API कुंजी प्राप्त करें: app.scrapeless.com
समस्या निवारण
- मॉडल JSON के बजाय गद्य लौटाता है। आप साधारण
createकॉल पर हैं -chat.completions.parseपर स्विच करें जिसमें एकresponse_formatमॉडल है, जो API स्तर पर उत्पादन को संकीर्ण करता है न कि विनम्रता से पूछने के। - क्षेत्र वापस भरे हुए आते हैं जो खाली होने चाहिए। स्कीमा में फ़ील्ड को वैकल्पिक बनाएं और सिस्टम संदेश में शून्य नियम का उल्लेख करें। यह विफलता अनुबंध में है, मॉडल के मूड में नहीं।
- कुछ पृष्ठों पर निष्कर्षण सही है, जबकि अन्य पर खाली है। आप वास्तव में क्या लाए हैं, उसकी तुलना करें, न कि ब्राउज़र आपको जो दिखा रहा है — ऐसे ज्ञात तत्व की गणना करें जो रखी गई HTML में है जैसे कि सामान्य खींचने की स्क्रिप्ट करती है। शून्य मिलान का अर्थ है एक रेंडरिंग या पहुंच समस्या, और आप इसे खींचने की परत में ठीक करते हैं (
js_render, या एक अलग देश से निकलना) न कि प्रॉम्प्ट में। - टोकन लागत मात्रा के साथ बढ़ती है। कॉल से पहले पृष्ठ को इसके सामग्री कंटेनर में संक्षिप्त करें, या कच्ची HTML के बजाय मार्कडाउन से निकालें। स्थिर, उच्च मात्रा के लेआउट के लिए, मॉडल को केवल एक बार एक चयनकर्ता स्क्रिप्ट लिखने दें और केवल तभी टोकन खर्च करें जब लेआउट बदलता है।
निष्कर्ष
ChatGPT ने यह बदल दिया है कि स्क्रैपिंग का कौन सा आधा मुश्किल है। निष्कर्षण — वह भाग जो पहले नाजुक चयनकर्ताओं का अर्थ रखता था — अब एक स्कीमा और एक SDK कॉल है। खींचना — वह भाग जिसे मॉडल नहीं कर सकता — अभी भी निर्धारित करता है कि वहाँ कुछ असली है जिसे निकालना है, और ऊपर का 0 बनाम 10 प्रदर्शन यही सीमा प्रायोगिक रूप से दिखाता है। दो परतों को अलग-अलग बनाएं, खींचने की पुष्टि करें इससे पहले कि आप निष्कर्षण के लिए भुगतान करें, और संयोजन एक ऐसा स्क्रैपर है जो पुनः डिजाइन को जीवित रखता है।
क्या आप अपने निष्कर्षक को वास्तविक पृष्ठों से भरने के लिए तैयार हैं?
इस गाइड में खींचने की परत प्रत्येक पृष्ठ पर एक POST है यूनिवर्सल स्क्रैपिंग एपीआई — योजनाएँ और अनुरोध की मात्रा मूल्य निर्धारण पृष्ठ पर हैं, और डेवलपर डॉक हर उस पैरामीटर को कवर करता है जिसे unlocker.webunlocker स्वीकार करता है। app.scrapeless.com पर मुफ्त योजना पर एक कुंजी बनाएं और दो खींचने की स्क्रिप्ट को स्वयं दोबारा चलाएं।
सामान्य प्रश्न
प्रश्न: क्या ChatGPT सीधे वेबसाइटों को स्क्रैप कर सकता है?
नहीं। मॉडल HTTP अनुरोध भेज नहीं सकता, JavaScript निष्पादित नहीं कर सकता या एंटी-बॉट परीक्षणों को पार नहीं कर सकता — यह उस पाठ से निकालता है जो कुछ और ने लाया है। उपभोक्ता चैट उत्पाद कभी-कभी मॉडल को एक ब्राउज़िंग उपकरण के साथ लपेटते हैं, लेकिन वह उपकरण छोटे पैमाने पर है और कई साइटों द्वारा अवरुद्ध है, यही वजह है कि उत्पादन सेटअप मॉडल को एक समर्पित खींचने की परत के साथ जोड़ते हैं।
प्रश्न: क्या ChatGPT के साथ स्क्रैपिंग वैध है?
निष्कर्षण परत संग्रह परत के नियमों को नहीं बदलती है। केवल सार्वजनिक पृष्ठों को स्क्रैप करें, साइट की शर्तों और रोबोट अपवाद प्रोटोकॉल द्वारा परिभाषित रोबोट निर्देशों का सम्मान करें, मात्रा को सीमित रखें, और किसी भी व्यक्तिगत डेटा को आपके ऊपर लागू होने वाले गोपनीयता कानूनों के अनुसार संभालें — किसी भी स्क्रैपर के लिए वही दायित्व, साथ ही आपके मॉडल प्रदाता की उपयोग नियम।
प्रश्न: पारंपरिक चयनकर्ता स्क्रैपर कब अभी भी बेहतर विकल्प है?
उच्च मात्रा में स्थिर लेआउट पर। एक LLM कॉल प्रत्येक पृष्ठ पर टोकन की लागत होती है; एक चयनकर्ता स्क्रिप्ट लिखे जाने के बाद कुछ भी खर्च नहीं करती है। व्यावहारिक विभाजन: इस्तेमाल करें उस मॉडल को जहां लेआउट भिन्न या अक्सर बदलते हैं, और उत्पन्न-फिर-समिक्षित चयनकर्ता कोड जहां एक लेआउट हजारों बार पुर्नावृत्त होता है।
प्रश्न: यह "ChatGPT स्क्रैपर" से कैसे अलग है?
दिशा। यह गाइड मॉडल को वेब की ओर इंगित करती है — ChatGPT पार्सर है। एक ChatGPT स्क्रैपर एक स्क्रैपर को ChatGPT की ओर इंगित करता है — यह सहायक के उत्तर, उद्धरण और उत्पाद परिणामों को संरचित डेटा के रूप में कैप्चर करता है। Scrapeless इसे एक अभिनेता के रूप में भेजता है; अधिसूचना में लिंक किया गया ChatGPT स्क्रैपर API गाइड इसे कवर करता है।
प्रश्न: मुझे निष्कर्षण के लिए कौन सा OpenAI मॉडल उपयोग करना चाहिए?
छोटे, वर्तमान मॉडल से शुरू करें और केवल उसी स्थिति में ऊपर बढ़ें जब निष्कर्षण गुणवत्ता इसकी मांग करे। संरचित आउटपुट मॉडल के आकार के बावजूद उत्तर के आकार को सीमित करते हैं, इसलिए छोटे स्तर साफ इनपुट पर अच्छी तरह से परिभाषित स्कीमा को संभालते हैं — अधिक पृष्ठों को खींचने पर बचत करें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



