🎯 कस्टमाइज़ करने योग्य, डिटेक्शन-प्रतिरोधी क्लाउड ब्राउज़र जो स्व-विकसित Chromium द्वारा संचालित है, वेब क्रॉलर और एआई एजेंट्स के लिए डिज़ाइन किया गया। 👉अभी आज़माएं
वापस ब्लॉग पर

ओलामा वेब स्क्रैपिंग: बिना API कुंजी के एक स्थानीय LLM स्क्रैपर चलाएँ

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

23-Jul-2026

TL;DR:

  • ओल्लामा आपके अपने मशीन पर एक्सट्रैक्शन मॉडल चलाता है, इसलिए स्क्रैपर के LLM चरण का कोई एपीआई कुंजी और कोई प्रति-टोकन बिल नहीं होता है।
  • ओल्लामा यह नहीं करता है कि फेच करें। एक स्थानीय मॉडल के पास कोई ब्राउज़र और किसी पृष्ठ में नेटवर्क पहुंच नहीं होती है; यह उस टेक्स्ट को संरचित करता है जो आप इसे देते हैं।
  • यह अंतर एक स्क्रिप्ट में दिखाई देता है। एक साधारण GET एक जावास्क्रिप्ट-जनित डेमो पृष्ठ पर आपको 0 उद्धरण ब्लॉक्स देता है; वही यूआरएल js_render के साथ स्क्रैपलेस यूनिवर्सल स्क्रैपिंग एपीआई के माध्यम से आपको सभी 10 देता है - और वह रेंडर किया गया HTML वही है जो मॉडल पढ़ता है।
  • इस गाइड में एक्सट्रैक्शन वास्तविक है। एक लाइव रन ने एक स्थानीय qwen2.5:0.5b मॉडल को तीन रेंडर किए गए उद्धरण ब्लॉक्स दिए और प्रत्येक के टेक्स्ट और लेखक के साथ साफ JSON वापस मिला - कहीं भी कोई क्लाउड कॉल नहीं।
  • छोटे मॉडल कम शोर चाहते हैं। मॉडल को देखने से पहले HTML को कंटेंट क्षेत्र में ट्रिम करें; एक 0.5B मॉडल पर एक केंद्रित स्निपेट तेज और सटीक है, जबकि पूरा पृष्ठ समाहित नहीं हो पाता।
  • फेच पक्ष पर शुरू करने के लिए स्वतंत्र। app.scrapeless.com पर अपना स्क्रैपलेस एपीआई कुंजी बनाएं।

स्क्रैपर के मॉडल को स्थानीय रूप से चलाने के कारण

एक LLM स्क्रैपर पृष्ठ की सामग्री को संरचित रिकॉर्ड में बदलता है, और वह मॉडल किसी और के क्लाउड में नहीं रहना चाहिए। ओल्लामा आपके अपने हार्डवेयर पर एक छोटे HTTP एपीआई के पीछे ओपन मॉडल चलाता है, इसलिए एक्सट्रैक्शन चरण के लिए कोई एपीआई कुंजी, कोई दर सीमा और कोई प्रति-टोकन लागत नहीं होती - जब आप कई पृष्ठों को प्रोसेस कर रहे होते हैं या ऐसे डेटा को संभालते हैं जिसे आप तीसरे पक्ष को नहीं भेजना चाहते।

एक स्थानीय मॉडल क्या नहीं कर सकता है वह फेच करना है। इसके पास कोई ब्राउज़र नहीं है, यह कोई सत्र नहीं पकड़ता है, और एक जावास्क्रिप्ट-जनित पृष्ठ पर एक साधारण HTTP अनुरोध मार्कअप लौटाता है जिसमें इसका कोई सामग्री नहीं होती। इसलिए ओल्लामा वेब स्क्रैपर दो परतें हैं: एक फेच परत जो वफादार रेंडर किया गया HTML लौटाती है, और स्थानीय मॉडल एक्सट्रैक्शन परत के रूप में जो इसे रिकॉर्ड में बदलती है। यह गाइड पहले परत के लिए स्क्रैपलेस यूनिवर्सल स्क्रैपिंग एपीआई का उपयोग करती है। यदि आप इसके बजाय एक स्थानीय मॉडल को लाइव वेब सर्च देना चाहते हैं - मॉडल जो एक खोज उपकरण को कॉल करता है और परिणामों पर तर्क करता है - तो वह एक अलग काम है, जिसे स्थानीय LLM वेब सर्च गाइड द्वारा कवर किया गया है; यह पोस्ट किसी विशेष पृष्ठ से संरचित डेटा निकालने के बारे में है।

पूर्वापेक्षाएँ

  • ओल्लामा स्थापित और चल रहा है, एक छोटे टूल-फ्रेंडली मॉडल के साथ खींचा गया: ollama pull qwen2.5:0.5b
  • Python 3.9 या बाद का संस्करण requests के साथ।
  • डैशबोर्ड से एक स्क्रैपलेस एपीआई कुंजी, जिसे SCRAPELESS_API_KEY के रूप में निकाला गया।

स्थापना

एक छोटे मॉडल को खींचें और एक Python निर्भरता को स्थापित करें। ओल्लामा सर्वर चलने के बाद localhost:11434 पर सुनता है।

bash Copy
ollama pull qwen2.5:0.5b
pip install requests

अपनी कुंजी को वातावरण में रखें, कभी भी स्रोत में नहीं:

bash Copy
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"

एक पृष्ठ प्राप्त करें जिसे मॉडल वास्तव में पढ़ सकता है

निकासी की गुणवत्ता फेच की निष्ठा द्वारा सीमित होती है, इसलिए वहीं से शुरू करें। एक जावास्क्रिप्ट-जनित पृष्ठ पर, दस्तावेज़ जिसे एक साधारण HTTP क्लाइंट प्राप्त करता है, वह दस्तावेज़ नहीं है जिसे एक रीडर देखता है - सामग्री केवल तब आती है जब स्क्रिप्ट DOM बनाती है, जो जीवन चक्र HTML स्क्रिप्टिंग विनिर्देश द्वारा परिभाषित होती है। एक स्क्रिप्ट अंतर को गिनती है:

python Copy
# fetch_rendered.py — साधारण GET बनाम सर्वर-साइड रेंडरिंग, वही URL
import os

import requests

URL = "https://quotes.toscrape.com/js/"
MARKER = '<div class="quote">'

plain = requests.get(URL, timeout=60).text
print("plain GET chars:", len(plain), "| quote blocks:", plain.count(MARKER))

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 blocks:", rendered.count(MARKER))

रन साधारण फेच के लिए 0 उद्धरण ब्लॉक्स और रेंडर किए गए एक के लिए 10 प्रिंट करता है:

text Copy
plain GET chars: 5806 | quote blocks: 0
rendered chars: 8940 | quote blocks: 10

रेंडरिंग, अनलॉकिंग, और प्रॉक्सी राउटिंग सभी उस एक POST में सर्वर-साइड होती हैं - यूनिवर्सल स्क्रैपिंग एपीआई फेच परत है, और रेंडर किया गया HTML वही है जो स्थानीय मॉडल निकालता है।

स्थानीय मॉडल के साथ एक्सट्रैक्ट करें

अब सामग्री को ओलामा को सौंप दें। दो चीजें एक छोटे मॉडल को सटीक बनाए रखती हैं: HTML को सामग्री क्षेत्र तक काट लें ताकि मॉडल पृष्ठ क्रोम को न पढ़े, और JSON के लिए format: "json" पूछें ताकि आउटपुट पार्स हो सके। ओलामा का /api/generate एंडपॉइंट मॉडल का नाम और प्रम्प्ट लेता है और पूर्णता लौटाता है, जिसे ओलामा एपीआई संदर्भ में डॉक्यूमेंट किया गया है:

python Copy
# extract_local.py — एक स्थानीय ओलामा मॉडल के साथ फ़ेच, ट्रिम और एक्सट्रैक्ट करें
import json
import os
import re

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://quotes.toscrape.com/js/", "js_render": True}},
    timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")

# पहले तीन उद्धरण ब्लॉकों तक काटें — एक छोटा स्थानीय मॉडल कम शोर के साथ बेहतर करता है।
blocks = re.findall(r'<div class="quote">.*?</small>', html, re.S)[:3]
snippet = "\n".join(blocks)

completion = requests.post(
    "http://localhost:11434/api/generate",
    json={
        "model": "qwen2.5:0.5b",
        "prompt": 'इस HTML से प्रत्येक उद्धरण को JSON में निकालें जिसमें ठीक आकार हो '
                  '{"quotes":[{"text":"...","author":"..."}]}. केवल JSON के साथ उत्तर दें।\n\nHTML:\n' + snippet,
        "stream": False,
        "format": "json",
        "options": {"temperature": 0, "num_predict": 400},
    },
    timeout=600,
)
data = json.loads(completion.json()["response"])

records = data["quotes"]
print("records:", len(records))
print("first author:", records[0]["author"])
print("first text:", records[0]["text"])

स्थानीय रन ने तीन रिकॉर्ड लौटाए, पहले पर पाठ और लेखक सही थे:

text Copy
records: 3
first author: अल्बर्ट आइंस्टीन
first text: जिस दुनिया को हमने बनाया है, वह हमारे सोचने की प्रक्रिया है। इसे बदले बिना हमारी सोच को बदलना नहीं हो सकता।

यही पूरा स्क्रैपर है, और मॉडल का आधा हिस्सा कभी नेटवर्क को नहीं छुआ: फ़ेच और रेंडर करने के लिए Scrapeless को एक POST, और निकालने के लिए localhost को एक कॉल। आपके हार्डवेयर द्वारा संभाली गई ब्लॉकों की संख्या को मापें — CPU पर 0.5B मॉडल क्लाउड एंडपॉइंट की तुलना में धीमा होता है, इसलिए छोटे पैमाने पर बैच बनायें और इनपुट को तंग रखें।

मुफ्त योजना पर अपना API कुंजी प्राप्त करें: app.scrapeless.com

उन्नत पैटर्न

  • मॉडल को हार्डवेयर से मिलाएं। qwen2.5:0.5b CPU पर प्रदर्शित करने के लिए पर्याप्त तेज है; यदि आपके पास मेमोरी और धैर्य है तो 3B या 7B मॉडल गंदे पृष्ठों से अधिक विश्वसनीयता से निकालते हैं। अनुरोध का आकार नहीं बदलता — केवल model स्ट्रिंग बदलती है।
  • प्रॉम्प्ट करने से पहले काटें। सामग्री कंटेनर को अलग करना एक छोटे मॉडल के लिए सबसे बड़ा गुणवत्ता लीवर है। पूरे दस्तावेज़ के बजाय पुनरावृत्त ब्लॉक भेजें, और टोकन लागत और त्रुटि दर दोनों गिर जाती हैं।
  • format: "json" और temperature: 0 बनाए रखें। JSON मोड आउटपुट को पार्स योग्य JSON में सीमित करता है, और शून्य तापमान निष्कर्षण को चलाने में स्थिर रखता है; स्क्रैपर के लिए इनमें से कोई भी वैकल्पिक नहीं है।
  • प्रॉम्प्ट में नहीं, बल्कि पायथन में लूप। प्रत्येक अनुरोध पर एक सामग्री क्षेत्र रिकॉर्ड को एक दूसरे में बहने से रोकता है और एक खराब निष्कर्षण को विशिष्ट पृष्ठ पर जिम्मेदार बनाता है।

समस्या निवारण

  • localhost:11434 पर Connection refused ओलामा सर्वर चल नहीं रहा है। इसे शुरू करें (ollama serve) और पुष्टि करें कि मॉडल ollama list के साथ खींचा गया है।
  • निकालने के लिए शून्य ब्लॉक। आपकी फ़ेच ने पूर्व-रेंडर HTML लौटाया। पहले स्क्रिप्ट के तरीके से एक ज्ञात तत्व की गिनती करें; एक लगभग-खाली फ़ेच एक रेंडरिंग समस्या है, जो js_render से ठीक होती है, न कि मॉडल समस्या।
  • मॉडल प्रोज़ लौटाता है, JSON नहीं। आपने format: "json" ड्रॉप किया। इसके साथ, ओलामा आउटपुट को सीमित करता है; इसके बिना, आप goodwill को पार्स कर रहे हैं।
  • निष्कर्षण धीमा है या रिकॉर्ड गिराते हैं। मॉडल इनपुट आकार के लिए बहुत छोटा है। कॉल प्रति कम ब्लॉकों की संख्या को ट्रिम करें, या एक बड़े मॉडल पर जाएं — छोटे स्थानीय मॉडल गति के लिए सटीकता का व्यापार करते हैं, और एक छोटा, साफ प्रॉम्प्ट कैसे दोनों को वापस लाता है।

निष्कर्ष

ओलामा अपनी जगह कमाता है जैसे कि आप करते हैं: अपने स्वयं के हार्डवेयर पर खुले मॉडल, कोई कुंजी और कोई प्रति-टोकन बिल नहीं, पृष्ठ सामग्री को JSON में बदलना। वह परत जो यह तय करती है कि क्या यह संभव है वह फ़ेच है — पहले स्क्रिप्ट की 0 बनाम 10 गिनती इसे तय करती है — और एक सर्वर-रेंडर्ड POST खाई को बंद करता है। दोनों को एक साथ वायर करें और एक रेंडर किया गया पृष्ठ संरचित रिकॉर्ड बन जाता है, जबकि मॉडल आधा पूरी तरह से localhost पर रहता है।
एक मुफ्त Scrapeless खाता बनाएँ API की प्राप्त करने के लिए, और डेवलपर दस्तावेज़ unlocker.webunlocker के पैरामीटर को कवर करते हैं। जब आप एक आवर्ती नौकरी की योजना बनाते हैं तो Scrapeless मूल्य निर्धारण की जांच करें।

सामान्य प्रश्न

प्रश्न: क्या ओलामा वेबसाइटों को स्वतंत्र रूप से स्क्रैप कर सकता है?

नहीं। ओलामा एक भाषा मॉडल को स्थानीय रूप से चलाता है; इसमें मनमाने पृष्ठों के लिए कोई HTTP क्लाइंट नहीं है और यह कोई JavaScript नहीं रेंडर करता है। यह उस टेक्स्ट को संरचना देता है जो आप इसे देते हैं। इसे एक फ़ेच परत के साथ जोड़ा जाए - यहाँ Scrapeless यूनिवर्सल स्क्रैपिंग API, जो पृष्ठ को सर्वर-साइड रेंडर करता है - और स्थानीय मॉडल निष्कर्षण को संभालता है।

प्रश्न: यह एक स्थानीय LLM को वेब खोज देने से कैसे भिन्न है?

दिशा। एक वेब-खोज सेटअप मॉडल को एक खोज उपकरण कॉल करने और परिणामों पर प्रश्न का उत्तर देने के लिए तर्क करने देता है; यह सेटअप एक विशिष्ट पृष्ठ लाता है जिसे आप चुनते हैं और मॉडल से यह तय कराता है कि उसे इससे संरचित फ़ील्ड निकालने हैं। एक खोज-युक्त उत्तर प्रदान करने का है, जबकि दूसरा स्क्रैपिंग पाइपलाइन है - ऊपर लिंक किया गया स्थानीय LLM वेब खोज गाइड पहले की कवर करता है।

प्रश्न: मुझे निष्कर्षण के लिए कौन सा स्थानीय मॉडल उपयोग करना चाहिए?

सबसे छोटा जो आपके स्कीमा को होल्ड कर सके। एक सख्त JSON प्रॉम्प्ट और temperature: 0 के साथ निष्कर्षण तर्क-गहन नहीं है, इसलिए 0.5B मॉडल एक ट्रिम्ड स्निपेट पर काम करता है, जैसा कि ऊपर के रन में दिखाया गया है। केवल तब 3B या बड़े मॉडल पर जाएँ जब पृष्ठ इस हद तक गंदे हों कि छोटा फ़ील्ड छोड़ दे।

प्रश्न: क्या मुझे GPU की आवश्यकता है?

नहीं। इस गाइड में प्रयोग में लिप्त 0.5B मॉडल CPU पर था। एक GPU बड़े मॉडलों को व्यावहारिक बनाता है और सब कुछ तेज करता है, लेकिन CPU पर एक छोटा मॉडल पाइपलाइन को बनाने और परीक्षण करने के लिए पर्याप्त है।

प्रश्न: क्या स्थानीय मॉडल के साथ स्क्रैपिंग करना कानूनी है?

स्थानीय रूप से मॉडल चलाना संग्रह नियमों को नहीं बदलता है। केवल सार्वजनिक पृष्ठों को लाएं, साइट की शर्तों और रोबोट्स बहिष्करण प्रोटोकॉल द्वारा मानक किए गए रोबोट निर्देशों का सम्मान करें, मात्रा सीमित रखें, और किसी भी व्यक्तिगत डेटा को उन कानूनों के तहत संभालें जो आप पर लागू होते हैं।

स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।

सबसे लोकप्रिय लेख

सूची