LlamaIndex + Scrapeless: अपने इंडेक्स को लाइव वेब पृष्ठों से भरें।
Senior Web Scraping Engineer
A retrieval index केवल उतनी ही वर्तमान होती है जितना कि आप उसमें दस्तावेज डालते हैं। LlamaIndex भिन्न भागों को अच्छी तरह संभालता है, लेकिन वह हिस्सा जो चुपचाप टूटता है, वह सभी के पहले का कदम है, जहाँ जीवित वेब पृष्ठों को साफ पाठ में परिवर्तित करना होता है।
LlamaIndex को Scrapeless MCP Server से कनेक्ट करना उस कदम को पूरा करता है। MCP उपकरण_rendered पृष्ठों को मार्कडाउन के रूप में लौटाते हैं, LlamaIndex उन्हें Document वस्तुओं के रूप में लपेटता है, और आपकी प्रविष्टि पाइपलाइन आगे किसी बदलाव के बिना जारी रहती है। यह गाइड कनेक्शन, उपकरण खोज, एक वास्तविक पृष्ठ फ़ेच, और दस्तावेज से नोड विभाजन अंत से अंत तक चलाता है।
यह सेटअप आपके इंडेक्स को क्या देता है
आपका प्रविष्टि कोड एक कनेक्शन से 21 कॉल करने योग्य उपकरण प्राप्त करता है, और वे मूल LlamaIndex उपकरणों के रूप में आते हैं न कि कुछ ऐसा जिसे आप स्वयं लपेटते हैं।
समूह प्रविष्टि के लिए महत्वपूर्ण हैं:
- पृष्ठ पुनर्प्राप्ति —
scrape_markdownएक पृष्ठ को पहले से ही मार्कडाउन में रूपांतरित करके लौटाता है, जो एक विभाजक और एक एम्बेडिंग मॉडल दोनों के लिए सबसे अच्छा प्रारूप है।scrape_htmlऔरscrape_screenshotअन्य दो रूपांतर लौटाते हैं। - खोज —
google_searchऔरgoogle_trendsएक प्रविष्टि कार्य को निश्चित सूची सौंपने के बजाय यूआरएल खोजने की अनुमति देते हैं। - जीवित ब्राउज़र नियंत्रण — उन पृष्ठों के लिए सोलह
browser_*उपकरण जो सामग्री अस्तित्व में आने से पहले इंटरैक्शन की आवश्यकता होती है।
रेंडरिंग, प्रॉक्सी रूटिंग और एक्सेस हैंडलिंग सभी सर्वर-साइड पर होते हैं, इसलिए प्रविष्टि प्रक्रिया एक साधारण पायथन कार्य रहती है जिसमें इंस्टॉल करने के लिए कोई ब्राउज़र नहीं होता है।
Scrapeless MCP Server क्यों
मॉडल संदर्भ प्रोटोकॉल विनिर्देशन परिभाषित करता है कि एक क्लाइंट उपकरणों और उनके तर्क स्कीमाओं को सर्वर से कैसे खोजता है, जो इसे एक फ़ेच सहायक लिखने से अलग बनाता है: उपकरण सूची और प्रत्येक उपकरण के पैरामीटर सर्वर से आते हैं न कि आपके प्रोजेक्ट में हार्ड-कोडेड होते हैं। कॉल्स JSON-RPC 2.0 संदेशों के रूप में यात्रा करते हैं।
Scrapeless अंत बिंदु को होस्ट करता है, इसलिए आपके इंडेक्सर के साथ चलाने के लिए कोई सर्वर प्रक्रिया नहीं है। प्रमाणीकरण एक हेडर है। browser_* समूह Scrapeless Scraping Browser द्वारा समर्थित है, और प्रति-उपकरण पैरामीटर को Scrapeless दस्तावेज़ीकरण में दस्तावेज किया गया है।
पूर्वापेक्षाएँ
- पायथन 3.10 या बाद का।
llama-index-coreऔरllama-index-tools-mcpवर्तमान में>=3.10,<4.0घोषित करते हैं। - डैशबोर्ड से Scrapeless API कुंजी।
- केवल एजेंट अनुभाग के लिए: एक LLM एकीकरण पैकेज जैसे कि
llama-index-llms-openaiप्लस उस प्रदाता की कुंजी।
नोट: नीचे की प्रविष्टि अनुभाग में सब कुछ Scrapeless कुंजी और बिना मॉडल-प्रदाता कुंजी के साथ निष्पादित किया गया था। MCP कनेक्शन, उपकरण खोज, तर्क स्कीमाएँ, लाइव उपकरण कॉल, और
Document-से-नोड विभाजन सभी चलाए गए। अंत में एजेंट चरण एक पूर्वापेक्षा अंतर है -FunctionAgentका निर्माणImportError: llama-index-llms-openai package not foundउत्पन्न करता है बिना कोई LLM एकीकरण स्थापित किए, इसलिए वह ब्लॉक को आप द्वारा जोड़े गए कोड के रूप में दिखाया गया है न कि कैप्चर की गई आउटपुट के रूप में।
इंस्टॉल
bash
pip install "llama-index-tools-mcp==0.4.8"
यह पैकेज llama-index-core और mcp क्लाइंट को साथ लाता है। अपनी शेल में कुंजी सेट करें:
bash
export SCRAPELESS_API_KEY="your_api_key_here"
कनेक्ट करें और उपकरणों की सूची बनाएं
BasicMCPClient अंत बिंदु URL और हेडर लेता है; McpToolSpec सर्वर के उपकरण सूची को LlamaIndex उपकरणों में बदलता है:
python
import asyncio, os
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
async def main():
client = BasicMCPClient(
"https://api.scrapeless.com/mcp",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
spec = McpToolSpec(client=client)
tools = await spec.to_tool_list_async()
print("tool count:", len(tools))
print("sample names:", sorted(t.metadata.name for t in tools)[:6])
asyncio.run(main())
text
tool count: 21
sample names: ['browser_click', 'browser_close', 'browser_create', 'browser_get_html', 'browser_get_text', 'browser_go_back']
API पूरे समय async है, यही कारण है कि उदाहरण asyncio.run
Here’s the translation of the provided text into Hindi:
python
spec = McpToolSpec(client=client, allowed_tools=["scrape_markdown"])
tools = await spec.to_tool_list_async()
tool = tools[0]
print("फिल्टर की गई संख्या:", len(tools))
print("नाम:", tool.metadata.name)
print("fn_schema के क्षेत्र:", list(tool.metadata.fn_schema.model_fields))
asyncio.run(main())
text
फिल्टर की गई संख्या: 1
नाम: scrape_markdown
fn_schema के क्षेत्र: ['url']
स्कीमा सर्वर से आता है, इसलिए यह एक वास्तविक अनुबंध है न कि कोई अनुमान: scrape_markdown एकल url लेता है। LlamaIndex इसे fn_schema के रूप में प्रकट करता है, जो उस Pydantic मॉडल का समान है जिसका उपयोग एक एजेंट अपनी कॉल बनाने के लिए करेगा।
क्या आप इसे अपनी स्रोतों पर इंगित करने के लिए तैयार हैं? एक मुफ्त Scrapeless खाता बनाएं और अपने डैशबोर्ड से कुंजी के साथ कनेक्ट करें।
लाइव पृष्ठों को नोड्स में परिवर्तित करें
यह वह हिस्सा है जो पुनर्प्राप्ति के लिए महत्वपूर्ण है। उपकरण को सीधे कॉल करें, प्रत्येक परिणाम को उसके स्रोत के साथ मेटाडेटा में एक Document के रूप में लपेटें, फिर नोड्स में विभाजित करें:
python
import asyncio, os
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter
async def main():
client = BasicMCPClient(
"https://api.scrapeless.com/mcp",
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
)
spec = McpToolSpec(client=client, allowed_tools=["scrape_markdown"])
tool = (await spec.to_tool_list_async())[0]
urls = [
"https://quotes.toscrape.com/js/",
"https://quotes.toscrape.com/page/2/",
]
docs = []
for url in urls:
markdown = str(await tool.acall(url=url))
docs.append(Document(text=markdown, metadata={"source": url}))
print(f"दस्तावेज़: {len(docs)}")
splitter = SentenceSplitter(chunk_size=256, chunk_overlap=32)
nodes = splitter.get_nodes_from_documents(docs)
print(f"विभाजन के बाद नोड्स: {len(nodes)}")
print(f"पहला नोड स्रोत: {nodes[0].metadata['source']}")
print(f"पहला नोड वर्ण: {len(nodes[0].get_content())}")
asyncio.run(main())
text
दस्तावेज़: 2
विभाजन के बाद नोड्स: 14
पहला नोड स्रोत: https://quotes.toscrape.com/js/
पहला नोड वर्ण: 571
उस आउटपुट में कई चीजें हैं जिन पर ध्यान से पढ़ना चाहिए।
पहला URL एक क्लाइंट-निर्मित पृष्ठ है - इसका सामग्री एक स्क्रिप्ट द्वारा DOM में लिखा गया है - और यह अभी भी उपयोगी मार्कडाउन उत्पन्न करता है, क्योंकि रेंडरिंग सर्वर-साइड पर परिवर्तनों से पहले होती है। उस ही URL का एक सामान्य HTTP फेचिंग मार्कअप लौटाता है जिसमें कोई सामग्री नहीं होती है।
chunk_size=256 टोकनों की गिनती करता है, वर्णों की नहीं, यही वजह है कि पहला नोड 571 वर्ण लंबा है। वर्णों में एक विभाजक का आकार निर्धारित करना आमतौर पर ऐसे चंक्स में समाप्त होता है जो एक एम्बेडिंग मॉडल के संदर्भ से अधिक होते हैं।
प्रत्येक Document पर metadata={"source": url} विभाजन को सहन करता है और उस पर आधारित हर नोड पर उतरता है। यही वह है जो पुनर्प्राप्ति परिणाम को यह उद्धृत करने की अनुमति देता है कि यह कहाँ से आया है, और इसे यहाँ संलग्न करना बाद में पुनर्निर्माण करने की तुलना में बहुत आसान है।
मार्कडाउन इसके लिए सही मध्यवर्ती प्रारूप है: हेडिंग और लिंक बचे रहते हैं, जबकि स्क्रिप्ट, स्टाइलिंग, और लेआउट मार्कअप नहीं होते हैं, इसलिए एम्बेडिंग बजट सामग्री पर खर्च होता है।
उपकरणों को एक एजेंट को दें
एक बार जब उपकरण प्राप्त हो जाते हैं, तो एक एजेंट यह तय कर सकता है कि किसे कॉल करना है, न कि एक निश्चित URL सूची का पालन करना। इस चरण के लिए एक LLM एकीकरण पैकेज और उस प्रदाता की कुंजी की आवश्यकता होती है।
नोट: यह खंड एक पूर्वापेक्षा अंतर है। बिना LLM एकीकरण स्थापित किए, एजेंट का निर्माण
ImportError: llama-index-llms-openai package not found, please run pip install llama-index-llms-openaiउत्पन्न करता है, इसलिए इसके लिए कोई आउटपुट नहीं दिखाया गया है।
python
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
agent = FunctionAgent(
tools=tools,
llm=OpenAI(model="gpt-4.1-mini"),
system_prompt="सार्वजनिक पृष्ठों की खोज करें और स्रोतों के साथ साफ नोट लौटाएं।",
)
response = await agent.run("quotes.toscrape.com पर उद्धृत लेखकों का सारांश बताएं")
print(response)
निष्कर्ष
LlamaIndex को Scrapeless MCP Server से जोड़ने के लिए एक क्लाइंट, एक उपकरण विशिष्टता, और एक हेडर की आवश्यकता होती है। सर्वर 21 उपकरणों के साथ अपने स्वयं के तर्क स्कीमा प्रदान करता है, allowed_tools उन्हें उस परिष्कृत कार्यक्रम की आवश्यकता के लिए संकीर्ण करता है जो वास्तव में जरूरत होती है, और scrape_markdown चंक्स को उस प्रारूप में लौटाता है जिसे विभाजक और एम्बेडिंग मॉडल दोनों पसंद करते हैं।
जो आदत बनाए रखना है वह है_fetch_time पर स्रोत URL को Document मेटाडेटा के रूप में संलग्न करना। यह एक डिक्शनरी की लागत है, यह नोड विभाजन से बच जाता है, और यह वह है जो पुनर्प्राप्ति हिट को एक उत्तर में बदल देता है जिसे आप पृष्ठ पर वापस ट्रेस कर सकते हैं।
स्क्रैपलेस मुफ्त योजना पर शुरू करें एक कुंजी प्राप्त करने के लिए, जब आप एक इजेशन रन का आकार निर्धारित करें तो स्क्रैपलेस मूल्य निर्धारण की जांच करें, और स्क्रैपलेस MCP सर्वर अवलोकन को पूर्ण उपकरण संदर्भ के लिए देखें।
सामान्य प्रश्न
प्रश्न: LlamaIndex के लिए स्क्रैपलेस MCP सर्वर का एंडपॉइंट क्या है?
होस्ट किया गया एंडपॉइंट https://api.scrapeless.com/mcp है, जो आपके कुंजी के साथ x-api-token हेडर में BasicMCPClient के माध्यम से पहुंचा जा सकता है। कोई स्थानीय सर्वर प्रक्रिया चलाने की आवश्यकता नहीं है, क्योंकि उपकरण दूरस्थ रूप से प्रदान किए जाते हैं।
प्रश्न: स्क्रैपलेस MCP सर्वर LlamaIndex के लिए कितने उपकरण प्रदर्शित करता है?
एक लाइव कनेक्शन 21 लौटाता है: सोलह browser_* सत्र-नियंत्रण उपकरण, तीन पृष्ठ-प्राप्ति उपकरण (scrape_markdown, scrape_html, scrape_screenshot), और दो खोज उपकरण (google_search, google_trends)। इन्हें रनटाइम पर सूचीबद्ध करें, बजाय यह मानने के कि एक सर्वर रिलीज के बीच में उपकरण जोड़ सकता है।
प्रश्न: क्या मैं केवल कुछ MCP उपकरण लोड कर सकता हूँ?
हाँ। McpToolSpec को allowed_tools=["scrape_markdown"] पास करें और सूची केवल उसी उपकरण के साथ वापस आती है। इजेशन के लिए यह करना फायदेमंद है - यह स्कीमाओं को पठनीय रखता है और एजेंट को अनावश्यक ब्राउज़र सत्र खोलने से रोकता है।
प्रश्न: क्या मुझे MCP के माध्यम से पृष्ठ प्राप्त करने के लिए एक LLM कुंजी की आवश्यकता है?
नहीं। कनेक्शन, उपकरण खोज, स्कीमा निरीक्षण, और सीधे tool.acall(...) केवल स्क्रैपलेस कुंजी के साथ काम करते हैं। एक मॉडल प्रदाता तब आवश्यक होता है जब आप उपकरणों को एक एजेंट को सौंपते हैं, क्योंकि तब कुछ को यह तय करना होता है कि कौन सा उपकरण कॉल करना है।
प्रश्न: पुनर्प्राप्ति के लिए HTML के बजाय मार्कडाउन का उपयोग क्यों करें?
मार्कडाउन वह संरचना बनाए रखता है जो पुनर्प्राप्ति में मदद करती है - शीर्षक, सूचियाँ, लिंक - और स्क्रिप्ट, स्टाइलिंग और लेआउट मार्कअप को हटा देता है जो एम्बेडिंग संदर्भ का उपभोग करता है बिना किसी अर्थ को जोड़े। यदि आप अपना खुद का चयनकर्ता चलाने का इरादा रखते हैं, तो scrape_html अभी भी सही विकल्प है।
प्रश्न: मैं कैसे ट्रैक करूं कि कोई पुनर्प्राप्त चंक किस पृष्ठ से आया?
जब आप दस्तावेज़ बनाते हैं तो URL को Document(metadata={"source": url}) में डालें। वह मेटाडेटा हर नोड पर कॉपी किया जाता है जिसे स्प्लिटर इससे प्राप्त करता है, इसलिए प्रत्येक पुनर्प्राप्त चंक अपनी उत्पत्ति ले जाता है बिना किसी अतिरिक्त बहीखाता रखकर।
प्रश्न: मुझे किसी साइट के इजेशन से पहले क्या चेक करना चाहिए?
साइट की शर्तों और इसके /robots.txt निर्देशों की समीक्षा करें, जो रोबोट्स बहिष्करण प्रोटोकॉल मानक का पालन करते हैं। इजेशन को सार्वजनिक पृष्ठों तक सीमित रखें, एक स्पष्ट URL सूची या एक सीमित खोज चरण से काम करें, और प्रत्येक दस्तावेज़ पर स्रोत URL रिकॉर्ड करें ताकि इंडेक्स द्वारा लौटाए गए किसी भी चीज़ की उत्पत्ति स्पष्ट रहे।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



