Node.js में एक वितरित वेब क्रॉलर बनाना: कतारें और डुप्लिकेट निकालना
Senior Web Scraping Engineer
TL;DR:
- एक वितरित वेब क्रॉलर को एक स्थायी URL सीमा, राज्यहीन श्रमिकों, कैनोनिकल URL कुंजी, प्रति-होस्ट अनुरोध बजट, और एक स्पष्ट टर्मिनल क्वारंटाइन पथ की आवश्यकता होती है।
- Node.js को खोज, अनुसूची, स्थिति और भंडारण के लिए जिम्मेदार रखें। यदि स्रोत की आवश्यकता हो तो जावास्क्रिप्ट रेंडरिंग और पृष्ठ अधिग्रहण को प्रबंधित निष्पादन परत पर सौंपें।
- कैनोनिकल URL हैश का उपयोग कतार कार्य ID और भंडारण इडेम्पोटेंसी कुंजी के रूप में करें। यह कार्यकर्ता तक पहुँचने से पहले डुप्लिकेट कार्य को अवरुद्ध करता है।
- वैश्विक श्रमिक समवर्तीता और प्रति-होस्ट पेसिंग विभिन्न समस्याओं को हल करते हैं। पहले को क्षमता के साथ स्केल करें; दूसरे को स्रोत अनुमति और अवलोकित सर्वर व्यवहार से सेट करें।
- एक छोटे अधिकृत स्रोत सेट से प्रारंभ करें, प्रयास किए गए पृष्ठों के बजाय स्वीकार किए गए पृष्ठों को मापें, और केवल तब स्केल करें जब कतार की गहराई, ताजगी विलंब, और स्कीमा अस्वीकृति स्पष्ट हो।
एकल-प्रक्रिया क्रॉलर पूर्वानुमानित तरीकों से विफल होता है: इसकी मेमोरी कतार पुनरारंभ पर गायब हो जाती है, डुप्लिकेट लिंक बढ़ जाते हैं, एक धीमा होस्ट कार्यक्रम चक्र को भरता है, और ब्राउज़र निष्पादन उसी मशीन का उपयोग करता है जो काम को अनुसूचित करने वाली होनी चाहिए।
एक वितरित वेब क्रॉलर इन जिम्मेदारियों को विभाजित करता है। Node.js नियंत्रण विमान का मालिक है—URL सीमा, कार्य राज्य, डिडुप्लिकेशन, और भंडारण निर्णय। स्वतंत्र श्रमिक डेटा पथ के मालिक हैं। जावास्क्रिप्ट-रेंडर्ड सार्वजनिक पृष्ठों के लिए, एक प्रबंधित सेवा पृष्ठ को निष्पादित कर सकती है और ब्राउज़र प्रक्रियाओं को हर श्रमिक कंटेनर के अंदर रखने के बिना मार्कडाउन या एचटीएमएल वापस कर सकती है।
आवश्यकताएँ और विफलता मोड को परिभाषित करें
एक कतार चुनने से पहले, क्रॉल अनुबंध लिखें:
- कौन से डोमेन और पथ अधिकृत हैं?
- प्रत्येक क्रॉल कितने पृष्ठों और स्तरों का पता लगा सकता है?
- प्रत्येक स्रोत को किस ताजगी विंडो की आवश्यकता है?
- कौन से प्रतिक्रिया प्रारूप और आवश्यक फ़ील्ड स्वीकार किए गए पृष्ठ को परिभाषित करते हैं?
- प्रति होस्ट क्या अनुरोध गति की अनुमति है?
- अमान्य, खाली, या अप्रत्याशित परिणाम कहाँ जाते हैं?
- कार्य और पृष्ठ संस्करणों को कितने समय तक बनाए रखा जाना चाहिए?
पहली संस्करण में समाप्ति स्थितियाँ भी होनी चाहिए: अधिकतम गहराई, अधिकतम स्वीकार किए गए पृष्ठ, अधिकतम खोजे गए URL, और एक समय सीमा। ये सीमाएँ एक कैलेंडर संग्रह, फैसेटेड नेविगेशन, या ट्रैकिंग पैरामीटर को छोटे क्रॉल को एक खुली अंततः ग्राफ वॉक में बदलने से रोकती हैं।
सामान्य विफलता मोड आर्किटेक्चरल हैं:
| विफलता | मूल कारण | नियंत्रण |
|---|---|---|
| खोई हुई सीमा | इन-मेमोरी कतार | Redis-समर्थित स्थायी नौकरियाँ |
| डुप्लिकेट पृष्ठ | कुंजियों के रूप में कच्चे URL का उपयोग | कैनोनिकल URL हैश |
| एक होस्ट ओवरलोडेड | केवल वैश्विक समवर्तीता सेट | प्रति-होस्ट कतार और पेस |
| रिक्त सामग्री संग्रहीत | परिवहन सफलता को डेटा सफलता के रूप में माना गया | सामग्री स्वीकृति अनुबंध |
| श्रमिक स्केल नहीं कर सकते | स्थानीय ब्राउज़र स्थिति | राज्यहीन श्रमिक और प्रबंधित निष्पादन |
| जहर नौकरियाँ अनंत चक्र में | कोई टर्मिनल राज्य नहीं | मैनुअल रिलीज के साथ क्वारंटाइन कतार |
| क्रॉल स्वस्थ प्रतीत होता है लेकिन पुराना है | केवल थ्रूपुट मापा गया | ताजगी विलंब और स्वीकार किए गए-पृष्ठ मैट्रिक्स |
नियंत्रण विमान को पृष्ठ निष्पादन से अलग करें
क्रॉलर को दो विमानों के रूप में चित्रित किया जा सकता है:
नियंत्रण विमान: बीज → URL सामान्यीकरण → डिडुप्लिकेशन → Redis कतार → कार्य राज्य → भंडारण मेटाडेटा
निष्पादन विमान: श्रमिक → पृष्ठ अधिग्रहण → सामग्री सत्यापन → लिंक निष्कर्षण → स्वीकार किया गया रिकॉर्ड या क्वारंटाइन
यह सीमा महत्वपूर्ण है क्योंकि अनुसूचि और ब्राउज़र निष्पादन अलग-अलग स्केल करते हैं। कतार संचालन छोटे और राज्यपूर्ण होते हैं। पृष्ठ निष्पादन नेटवर्क-भारी होता है और इसे जावास्क्रिप्ट, क्षेत्रीय रूटिंग, या एक अलग ब्राउज़र सत्र की आवश्यकता हो सकती है।
Scrapeless Crawl एकल-पृष्ठ, बैच, और लिंक किए गए साइट संग्रह का समर्थन करता है जिसमें मार्कडाउन, HTML, लिंक, मेटाडेटा, और स्क्रीनशॉट जैसे प्रारूप शामिल हैं। जब निष्पादन पथ को एक इंटरैक्टिव ब्राउज़र की आवश्यकता होती है, तो Scrapeless Scraping Browser उस रनटाइम को श्रमिक कंटेनर के बाहर रखता है। Node एप्लिकेशन दायरा और स्थिति के लिए रिकॉर्ड का सिस्टम बना रह सकता है जबकि Scrapeless अधिग्रहण को संभालता है।
खोज और निष्कर्षण के लिए एक वैचारिक परिचय के लिए, पढ़ें वेब क्रॉलर क्या है। नीचे का डिज़ाइन उस स्थान से शुरू होता है जहाँ एकल- मशीन क्रॉलर रुकता है: साझा कतारें, इडेम्पोटेंट इनक्यूइंग, और कई श्रमिक।
Redis-समर्थित URL सीमा का निर्माण करें
BullMQ Redis पर वितरित कार्य निष्पादन को लागू करता है। इसके आधिकारिक दस्तावेज़ में कतारों, श्रमिकों, घटनाओं, विलंबित कार्यों, दर सीमित करने, और कार्य राज्य को शामिल किया गया है।
सीमा को एक छोटे कार्य लाभांश को संग्रहीत करना चाहिए:
| फ़ील्ड | उद्देश्य |
|---|---|
url |
एकत्र करने के लिए कैनोनिकल URL |
host |
कतार विभाजन और नीति लुकअप |
depth |
खोज सीमा |
crawlId |
सहसंबंध और रद्दीकरण |
parentUrl |
खोज के लिए उत्पत्ति |
schemaVersion |
डाउनस्ट्रीम अनुबंध |
Redis में पृष्ठ HTML न रखें। बड़े परिणामों को ऑब्जेक्ट स्टोर या डेटाबेस में संग्रहीत करें और केवल पहचानों, राज्यों, और संक्षिप्त मेटाडेटा को कतार में रखें।
जब विभिन्न डोमेनों को अलग-अलग अनुरोध बजट की आवश्यकता होती है, तो अनुमोदित होस्ट के लिए अलग-अलग कतार का उपयोग करें। docs-example-com पर सौंपे गए श्रमिक तब एक सीमित करने वाले का उपयोग कर सकते हैं, जबकि अन्य होस्ट की अपनी गति हो सकती है। एक वैश्विक कतार सरल है, लेकिन इसका सीमित करने वाला स्वतंत्र होस्ट नीतियों को व्यक्त नहीं कर सकता।
ऑपरेशन को आईडेम्पोटेंट बनाना
दो पृष्ठ समकक्ष हो सकते हैं जबकि उनके कच्चे यूआरएल भिन्न होते हैं:
- एक खंड उसी दस्तावेज़ के अंदर एक स्थान की ओर इशारा करता है;
- ट्रैकिंग पैरामीटर सामग्री को बदले बिना बदलते हैं;
- प्रश्न पैरामीटर एक अलग क्रम में दिखाई देते हैं;
- डिफ़ॉल्ट पोर्ट या ट्रेलिंग स्लैश भिन्न होते हैं;
- सापेक्ष लिंक उसी घेरनुमा पृष्ठ को हल करते हैं।
कतार सम्मिलन से पहले सामान्यीकृत करें। WHATWG URL मानक उस पार्सिंग मॉडल को परिभाषित करता है जो Node.js URL वर्ग द्वारा कार्यान्वित किया गया है।
एक सुरक्षित नीति स्रोत-विशिष्ट होती है। प्रत्येक प्रश्न पैरामीटर को हटाने से वास्तव में भिन्न पृष्ठों को मिला सकता है। ज्ञात पैरामीटर के लिए एक अनुमति सूची या अस्वीकृति सूची बनाए रखें और किसी भी पैरामीटर को बनाए रखें जो संसाधन को बदलता है।
सामान्यीकरण के बाद, यूआरएल को SHA-256 के साथ हैश करें। उस हेक्साडेसिमल डाइजेस्ट का उपयोग करें:
- BullMQ कार्य आईडी के रूप में;
- डेटाबेस अप्सर्ट कुंजी के रूप में;
- कार्य और संग्रहीत पृष्ठ के बीच उत्पत्ति लिंक के रूप में।
BullMQ एक नए कार्य को नजरअंदाज करता है जब उस कतार में पहले से उसी आईडी वाला एक अन्य कार्य मौजूद होता है। संरक्षण के द्वारा हटाए गए कार्य रिकॉर्ड उस सुरक्षा को प्रदान नहीं करते हैं, इसलिए स्थायी भंडारण को उसी आईडेम्पोटेंसी कुंजी को बनाए रखना चाहिए।
न्यूनतम संस्करण-पिन वाला Node.js प्रोजेक्ट
यह प्रोजेक्ट जानबूझकर संक्षिप्त है:
distributed-crawler/
├── package.json
└── src/
└── crawler.mjs
निर्भरता संस्करणों की जांच उनके पैकेज रजिस्ट्रियों के खिलाफ प्रारूपण के समय की गई थी। उदाहरण एक पूर्वापेक्षा-अंतर अवरोध है: यह Node.js, Redis, एक SCRAPELESS_API_KEY, और ALLOWED_HOST में सेट किए गए अधिकृत सार्वजनिक होस्ट नाम की आवश्यकता करता है। इसे एक होस्ट के लिए डिज़ाइन किया गया है ताकि कतार सीमित करने वाला वास्तव में होस्ट-विशिष्ट हो।
json
{
"name": "distributed-crawler-example",
"private": true,
"type": "module",
"scripts": {
"start": "node src/crawler.mjs"
},
"dependencies": {
"@scrapeless-ai/sdk": "1.3.1",
"bullmq": "5.79.3"
},
"engines": {
"node": ">=22"
}
}
नीचे का श्रमिक चार अंतिम परिणामों में से एक देता है: स्वीकृत, अपरिवर्तित, अस्वीकृत, और संगरक्षित। यह एक स्वचालित विफलता लूप नहीं बनाता। एक ऑपरेटर संगरक्षित रिकॉर्ड की जांच कर सकता है, उसके कारण को ठीक कर सकता है, और स्पष्ट रूप से कैनोनिकल यूआरएल को फिर से कतारबद्ध कर सकता है।
javascript
import { createHash } from "node:crypto";
import { Queue, Worker } from "bullmq";
import { ScrapingCrawl } from "@scrapeless-ai/sdk";
const redis = {
host: process.env.REDIS_HOST ?? "127.0.0.1",
port: Number(process.env.REDIS_PORT ?? 6379)
};
const allowedHost = process.env.ALLOWED_HOST ?? "example.com";
const queueName = `crawl-${hostKey(allowedHost)}`;
const frontier = new Queue(queueName, { connection: redis });
const quarantine = new Queue(`${queueName}-quarantine`, { connection: redis });
const crawl = new ScrapingCrawl({
apiKey: process.env.SCRAPELESS_API_KEY
});
function sha256(value) {
return createHash("sha256").update(value).digest("hex");
}
function hostKey(host) {
return host.toLowerCase().replaceAll(".", "-");
}
function canonicalize(input) {
const url = new URL(input);
url.hash = "";
url.hostname = url.hostname.toLowerCase();
for (const key of ["utm_source", "utm_medium", "utm_campaign"]) {
url.searchParams.delete(key);
}
url.searchParams.sort();
return url.href;
}
async function enqueue(url, crawlId, depth = 0, parentUrl = null) {
const canonicalUrl = canonicalize(url);
const parsed = new URL(canonicalUrl);
if (parsed.hostname !== allowedHost) {
throw new Error(`Host outside crawl scope: ${parsed.hostname}`);
}
const key = sha256(canonicalUrl);
await frontier.add(
"collect-page",
{
url: canonicalUrl,
host: parsed.hostname,
depth,
crawlId,
parentUrl,
schemaVersion: "crawl-page-v1"
},
{
jobId: key,
removeOnComplete: 1000,
removeOnFail: false
}
);
return key;
}
const worker = new Worker(
queueName,
async (job) => {
try {
const result = await crawl.scrapeUrl(job.data.url, {
formats: ["markdown", "links"],
onlyMainContent: true,
timeout: 15000
});
const markdown = result.markdown ?? result.data?.markdown;
if (typeof markdown !== "string" || markdown.length < 200) {
return { state: "rejected", reason: "content-contract", url: job.data.url };
}
const record = {
key: job.id,
url: job.data.url,
crawlId: job.data.crawlId,
depth: job.data.depth,
contentHash: sha256(markdown),
markdown
};
console.log(JSON.stringify({ state: "accepted", ...record }));
return { state: "accepted", key: record.key, contentHash: record.contentHash };
} catch (error) {
await quarantine.add("inspect-page", {
...job.data,
sourceJobId: job.id,
reason: error instanceof Error ? error.message : "unknown"
});
return { state: "quarantined", key: job.id };
}
},
{
connection: redis,
concurrency: 4,
limiter: { max: 2, duration: 1000 }
}
);
worker.on("completed", (job, result) => {
console.log(JSON.stringify({ event: "completed", jobId: job.id, result }));
});
worker.on("failed", (job, error) => {
console.error(JSON.stringify({
event: "worker-failed",
jobId: job?.id,
message: error.message
}));
});
await enqueue(`https://${allowedHost}/`, "demo-crawl");
उदाहरण स्वीकृत अभिलेखों को प्रिंट करता है ताकि डेटा कॉन्ट्रैक्ट दृश्यमान हो सके। `console.log` को `record.key` द्वारा कुंजीबद्ध डेटाबेस अपसर्ट के साथ बदलें। एक नई पृष्ठ संस्करण लिखने या इंडेक्स को पुनर्निर्माण करने से पहले `contentHash` की तुलना संग्रहित मान से करें।
## कार्य स्थिति मशीन को समझें
एक कैरियर को एक राज्य मॉडल की आवश्यकता होती है जिसे ऑपरेटर समझा सकें:
| स्थिति | अर्थ | अगली कार्रवाई |
|---|---|---|
| `queued` | कैनोनिकल यूआरएल प्रतीक्षा कर रहा है | कार्यकर्ता इसे क्लेम करता है |
| `active` | एक कार्यकर्ता पट्टे का मालिक है | अधिग्रहण और सत्यापन करें |
| `accepted` | सामग्री ने अनुबंध पास किया | स्टोर, अनुक्रमित करें, लिंक खोजें |
| `unchanged` | सामग्री हैश संग्रहित संस्करण से मेल खाता है | ताजगी मेटाडेटा अपडेट करें |
| `rejected` | प्रतिक्रिया पूरी हुई लेकिन सामग्री अमान्य है | मान्यकरणकर्ता या स्रोत की समीक्षा करें |
| `quarantined` | निष्पादन निर्णय उत्पन्न नहीं कर सका | मैन्युअल रूप से निरीक्षण और रिहा करें |
| `cancelled` | क्रॉल दायरा या समय सीमा समाप्त हो गई | ऑडिट मेटाडेटा बनाए रखें |
`failed` को एक ढाँचे की घटना के रूप में बनाए रखें जो कतार द्वारा रिपोर्ट की गई है, न कि केवल एक व्यवसाय स्थिति के रूप में। एक कार्य जो एक खाली अनुप्रयोग खोलता है तकनीकी रूप से पूरा हो चुका है लेकिन इसे `rejected` होना चाहिए। एक पृष्ठ जो दायरे से बाहर है उसे अधिग्रहण से पहले `cancelled` होना चाहिए। ये भेद ड्रैशबोर्ड को क्रियात्मक बनाते हैं।
## होस्ट द्वारा समांतरता नियंत्रित करें
कार्यकर्ता समांतरता का उत्तर देता है: “यह प्रक्रिया कितने कार्यों को संभाल सकती है?” एक होस्ट अनुरोध बजट पूछता है: “इस मूल को कितना ट्रैफिक मिल सकता है?” इन्हें स्वतंत्र रूप से कॉन्फ़िगर किया जाना चाहिए।
एक अधिकृत डोमेन के लिए:
1. रोबोट नियम और संविदात्मक सीमाएँ पढ़ें।
2. एक संवेदनशील प्रति-होस्ट गति निर्धारित करें।
3. एक से अधिक कार्यकर्ताओं को तब ही चलाएं जब कतार और होस्ट बजट इसकी अनुमति दे।
4. प्रतिक्रिया स्थिति, सामग्री स्वीकृति और सर्वर विलंबता को ट्रैक करें।
5. जब स्रोत संकट दिखाता है या समझौता बदलता है तो होस्ट बजट को कम करें।
BullMQ कार्यकर्ता प्रक्रियाओं और मशीनों के बीच एक कतार साझा कर सकते हैं। कतार सीमित करनेवाला चयनित कतार का समन्वय करता है, यही कारण है कि उदाहरण एक होस्ट-विशिष्ट कतार का उपयोग करता है। कई डोमेन के लिए, एक अनुमोदित रजिस्ट्रि से कतारें उत्पन्न करें और सक्रिय कार्यकर्ता वस्तुओं की संख्या को सीमित करें।
रॉबोट्स बहिष्करण प्रोटोकॉल का मानकीकरण <a href="https://www.rfc-editor.org/rfc/rfc9309.html" rel="nofollow"><strong>RFC 9309</strong></a> द्वारा किया गया है। रोबोट नियम अनुमति का एक अधिकार नहीं हैं, और ये साइट की शर्तों, गोपनीयता कर्तव्यों, या लागू कानून को प्रतिस्थापित नहीं करते हैं।
## नियंत्रण खोये बिना पृष्ठ अधिग्रहण करें
Node.js नियंत्रण तल यह तय करना चाहिए कि क्या इकट्ठा किया जा सकता है। निष्पादन स्तर यह तय करना चाहिए कि अनुमति दी गई पृष्ठ प्रस्तुति कैसे प्राप्त की जाए।
[Scrapeless Crawl त्वरित प्रारंभ](https://docs.scrapeless.com/en/crawl/quickstart/getting-started/?utm_source=website&utm_medium=blog&utm_campaign=crawl&utm_term=distributed-web-crawler-nodejs) असिंक्रोनस क्रॉल स्थिति और पृष्ठ-स्तरीय परिणामों का दस्तावेजीकरण करता है। उन पृष्ठों के लिए जिन्हें व्यापक इंटरैक्शन या जावास्क्रिप्ट निष्पादन की आवश्यकता होती है, क्रॉल के ब्राउज़र विकल्पों का उपयोग करें जबकि कतार दायरा, नौकरी की पहचान, और भंडारण निर्णय बनाए रखती है।
प्राप्त की गई सामग्री का सत्यापन करें बजाय इसके कि पूर्व निराकार करें कि निष्पादक ने व्यावसायिक निर्णय लिया। अपेक्षित पाठ, क्षेत्रों, भाषा, यूआरएल, और न्यूनतम सामग्री की आवश्यकता करें। प्रवीणता में अधिग्रहण मार्ग को स्टोर करें ताकि एक बाद के ऑडिट में यह समझा सके कि प्रत्येक पृष्ठ डेटा सेट में कैसे प्रवेश किया।
## दायरा खोये बिना लिंक खोजें
लिंक खोजना सामग्री स्वीकृति के बाद आता है। केवल उन पृष्ठों को पार्स करें जो सामग्री अनुबंध को पूरा करते हैं, फिर इन फ़िल्टरों को लागू करें इससे पहले कि आप एंक्यू करें:
- अनुमति प्राप्त होस्टनेम;
- अनुमत पथ उपसर्ग;
- समर्थित HTTP योजनाएँ;
- अधिकतम गहराई और पृष्ठ गणना;
- कैनोनिकलाइजेशन और नौकरी-ID लुकअप;
- फ़ाइल-प्रकार अपवाद;
- स्रोत-विशिष्ट क्वेरी-परामीटर नीति।
अनुमति न दें कि रीडायरेक्ट मौन रूप से अनुमत होस्ट सेट का विस्तार करें। अंतिम URL को रिकॉर्ड करें, इसे दायरे के साथ तुलना करें, और क्रॉस-डोमेन परिणामों को अस्वीकृत करें जब तक कि स्रोत रजिस्ट्रि स्पष्ट रूप से उन्हें अधिकृत नहीं करता।
साइटमैप के लिए, प्रत्येक यूआरएल को खोजी गई इनपुट के रूप में मानें ना कि विश्वसनीय आउटपुट के रूप में। इसे कैनोनिकलाइज़ करें, फ़िल्टर करें, और इसे HTML लिंक के समान फ्रंटियर पथ के माध्यम से डुप्लिकेट करें।
## पृष्ठ संस्करण और क्रॉल प्रवीणता संग्रहित करें
एक उपयोगी संग्रहण मॉडल में तीन अभिलेख होते हैं:
1. **क्रॉल:** स्कोप, बीज URL, समय सीमा, नीति संस्करण, और समग्र राज्य।
2. **पृष्ठ:** कैनोनिकल कुंजी, स्रोत URL, नवीनतम स्वीकृत हैश, संग्रहण समय, और स्कीमा संस्करण।
3. **पृष्ठ संस्करण:** सामग्री हैश, पेलोड स्थान, मेटाडेटा, और अधिग्रहण उत्पत्ति।
क्यू दीर्घकालिक डेटाबेस नहीं है। कार्य सफाई नीतियाँ पूर्ण प्रविष्टियों को हटा सकती हैं, जबकि पृष्ठ तालिका को आईडेमपोटेंसी कुंजी और संस्करण इतिहास को बरकरार रखना चाहिए, जो कि बरकरार रखने की नीति के अनुसार है।
यदि कोई पृष्ठ अपरिवर्तित है, तो पेलोड को बिना डुप्लिकेट किए ताजगी टाइमस्टैम्प अपडेट करें। यदि यह बदलता है, तो एक नई अपरिवर्तनीय पृष्ठ संस्करण लिखें, पृष्ठ रिकॉर्ड को उस पर इशारा करें, और एक अलग घटना के माध्यम से डाउनस्ट्रीम इंडेक्सिंग को सूचित करें।
## क्रॉल का अवलोकन
केवल क्यू की लंबाई भ्रामक हो सकती है। एक क्रॉलर अपनी सीमा को खाली कर सकता है जबकि हर पृष्ठ को अस्वीकार करता है। ट्रैक करें:
| संकेत | प्रश्न का उत्तर |
|---|---|
| प्रति मिनट स्वीकृत पृष्ठ | क्या उपयोगी डेटा आ रहा है? |
| खोज-से-स्वीकृति विलंब | पाइपलाइन कितनी पुरानी है? |
| डुप्लिकेट एन्क्यू दर | क्या कैनोनिकलाइजेशन प्रभावी है? |
| कारण द्वारा अस्वीकरण दर | क्या स्रोत मार्कअप या मान्यता में परिवर्तन हुआ? |
| क्वारंटाइन आयु | क्या संचालन का कर्ज बढ़ रहा है? |
| मेज़बान अनुरोध की गति | क्या नीति का पालन किया जा रहा है? |
| सामग्री-परिवर्तन की दर | क्या रिफ्रेश अनुसूची उपयुक्त है? |
| क्यू आयु पर्सेंटाइल | क्या श्रमिक क्षमता पर्याप्त है? |
OpenTelemetry अपने <a href="https://opentelemetry.io/docs/concepts/signals/" rel="nofollow"><strong>टेलीमेट्री संकेत गाइड</strong></a> में ट्रेसेस, मेट्रिक्स, लॉग, और बैगेज का वर्णन करता है। उत्पादक, क्यू इवेंट, अधिग्रहण कॉल, संग्रहण लेखन, और डाउनस्ट्रीम इंडेक्स इवेंट में एक क्रॉल ID का उपयोग करें।
पुराने स्वीकृत डेटा और पुराने क्वारंटाइन प्रविष्टियों पर पूर्ववत करें, केवल प्रक्रिया क्रैश पर नहीं। एक प्रक्रिया स्वस्थ रह सकती है जबकि डेटा सेट चुपचाप बदलना बंद कर देता है।
## तैनाती की चेकलिस्ट
- Redis को उन कार्यभार के लिए स्थायीता, प्रमाणीकरण, नेटवर्क नियंत्रण, और बैकअप के साथ चलाएँ।
- श्रमिकों को राज्यहीन रखें और उदाहरणों के बीच एक ही छवि तैनात करें।
- API कुंजियों को एक गुप्त प्रबंधक या पर्यावरण इंजेक्शन में रखें, कभी भी कार्य पेलोड में नहीं।
- पृष्ठ संरक्षण को क्यू संरक्षण से अलग परिभाषित करें।
- क्रॉल गहराई, पृष्ठ, समय, और मेज़बान स्कोप को सीमित करें।
- उत्पादकों और श्रमिकों द्वारा साझा की गई एक मेज़बान नीति स्रोत का उपयोग करें।
- तैनाती के दौरान श्रमिकों को Drain करें ताकि सक्रिय लीज़ को छोड़ नहीं दिया जाए।
- रद्दीकरण, क्वारंटाइन रिलीज, संग्रहण आईडेमपोटेंसी, और स्रोत-नीति परिवर्तनों का परीक्षण करें।
- Node.js, BullMQ, Scrapeless SDK, और पृष्ठ स्कीमा के संस्करण रिकॉर्ड करें।
एक स्वीकृत मेज़बान और एक छोटे पृष्ठ सीमा से शुरू करें। डैशबोर्ड पर यह दर्शाने के बाद ही डोमेन जोड़ें कि स्वीकृत डेटा, ताजगी, और अनुरोध नीति अपने लक्ष्यों के भीतर बनी हुई है।
## निष्कर्ष: अनिश्चितता को नहीं, सीमा को बढ़ाएँ
एक वितरित वेब क्रॉलर तब विश्वसनीय हो जाता है जब हर URL का एक कैनोनिकल पहचान हो, हर मेज़बान का एक स्पष्ट बजट हो, और हर पृष्ठ एक अर्थपूर्ण स्थिति में समाप्त हो। Node.js और BullMQ सीमा और श्रमिक समन्वय का स्वामित्व ले सकते हैं; Scrapeless प्रबंधित रेंडरिंग और नेटवर्क हैंडलिंग की आवश्यकता वाले पृष्ठ कार्यान्वयन का स्वामित्व ले सकता है।
एक सार्वजनिक, अधिकृत डोमेन के साथ सीमित प्रमाण की अवधारणा बनाएँ, [Scrapeless मूल्य निर्धारण पृष्ठ](https://www.scrapeless.com/hi/pricing?utm_source=website&utm_medium=blog&utm_campaign=crawl&utm_term=distributed-web-crawler-nodejs) की जांच करें, फिर [Scrapeless खाता बनाएँ](https://app.scrapeless.com/passport/login?utm_source=website&utm_medium=blog&utm_campaign=crawl&utm_term=distributed-web-crawler-nodejs)। अधिग्रहण को क्रॉल के माध्यम से मार्गदर्शन करें और श्रमिकों की संख्या बढ़ाने से पहले स्वीकृत पृष्ठों और ताजगी को मापें।
## अक्सर पूछे जाने वाले प्रश्न
### एक वेब क्रॉलर को वितरित क्या बनाता है?
इसकी URL सीमा और कार्य राज्य कई श्रमिक प्रक्रियाओं या मशीनों के बीच साझा होते हैं। श्रमिक स्वतंत्र कार्यों का दावा कर सकते हैं, साझा संग्रहण में परिणाम लिख सकते हैं, और एक प्रक्रिया की मेमोरी पर निर्भर किए बिना स्केल कर सकते हैं।
### Node.js क्रॉलर के लिए BullMQ का उपयोग क्यों करें?
BullMQ Redis-समर्थित क्यूज़, वितरित श्रमिकों, समवर्ती नियंत्रण, घटनाएँ, और कार्य पहचानकर्ता प्रदान करता है। क्रॉलर को अभी भी अपनी URL नीति, सामग्री अनुबंध, टिकाऊ संग्रहण, और दृश्यता की आवश्यकता होती है।
### श्रमिकों के बीच URL डेडुप्लिकेशन कैसे काम करता है?
एन्क्यू करने से पहले URL को सामान्य करें, कैनोनिकल रूप को हैश करें, और डाइजेस्ट का उपयोग क्यू कार्य ID और संग्रहण कुंजी के रूप में करें। Redis कार्य सृजन को समन्वयित करता है, जबकि डेटाबेस पुरानी नौकरियों को हटा देने के बाद आईडेमपोटेंसी को बरकरार रखता है।
### क्या हर श्रमिक को अपना ब्राउज़र लॉन्च करना चाहिए?
ज़रूरी नहीं। स्थानीय ब्राउज़र कंटेनर के आकार, मेमोरी उपयोग और परिचालन कार्य को बढ़ाते हैं। एक प्रबंधित अधिग्रहण परत रेंडर्ड सामग्री लौट सकती है जबकि श्रमिक शेड्यूलिंग, वैधता, खोज, और संग्रहण पर ध्यान केंद्रित करते हैं।
### विफल पृष्ठ कार्यों को कैसे संभाला जाना चाहिए?
व्यापारिक परिणामों को अवसंरचना घटनाओं से अलग करें। अमान्य सामग्री को अस्वीकार किया जा सकता है; अनसुलझे कार्यान्वयन त्रुटियाँ निरीक्षण और स्पष्ट रिलीज़ के लिए क्वारंटाइन क्यू में जा सकती हैं। एक सीमाहीन स्वचालित लूप से बचें।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



