Web crawler ডিজাইন

Crawler কোনো সাইটকে চাপ না দিয়ে শত কোটি পেজ আনে। URL frontier, deduplication ও politeness নিয়ম ডিজাইন করি।

যুক্ত ওয়েব পেজের ওপর দিয়ে চলা মাকড়সা

লক্ষ্য: seed URL থেকে শুরু করে পেজ নামানো, লিংক বের করা ও অনুসরণ করা, যাতে search index বা বিশ্লেষণের জন্য কনটেন্ট জমে।

Requirement

  • শত কোটি পেজে scale; ওয়েবসাইটের প্রতি ভদ্র থাকা।
  • একই পেজ দুবার না আনা এবং crawler trap এড়ানো।
  • robots.txt মানা; ব্যর্থতা ও ধীর সাইট সামলানো।
  • গুরুত্বপূর্ণ পেজ সতেজ রাখা।

মূল উপাদান

  1. URL frontier: crawl-এর অপেক্ষায় থাকা URL-এর queue।
  2. Fetcher: পেজ নামানো worker।
  3. DNS resolver (cache করা; DNS bottleneck হতে পারে)।
  4. Parser: টেক্সট ও লিংক বের করে।
  5. Deduplication: URL-দেখা-হয়েছে আর কনটেন্ট-দেখা-হয়েছে যাচাই।
  6. Storage: raw পেজ object storage-এ, metadata database-এ।

URL frontier

এটি শুধু queue নয়। এটিকে সামলাতে হয়:

  • অগ্রাধিকার: গুরুত্বপূর্ণ সাইট ও ঘন ঘন বদলানো পেজ আগে।
  • Politeness: এক সাইটে একসাথে শতশত request নয়। প্রতি host-এর আলাদা queue রাখুন, একই host-এ request-এর মধ্যে বিরতি দিন, আর দেওয়া থাকলে Crawl-delay মানুন।

প্রচলিত ডিজাইনে hash দিয়ে প্রতিটি host একটি worker-এ ম্যাপ হয়, যাতে ওই worker সেই host-এর গতি নিয়ন্ত্রণ করে।

Deduplication

  • URL normalisation: host ছোট হাতের, fragment বাদ, query parameter সাজানো, relative লিংক সমাধান।
  • URL-seen set: জানা URL বাদ দিতে Bloom filter বা বড় hash set।
  • কনটেন্ট dedup: পেজের কনটেন্টের hash (বা প্রায়-ডুপ্লিকেটের জন্য simhash) করে mirror ও কপি বাদ দিন।

Crawler trap

অসীম ক্যালেন্ডার, URL-এ session ID এবং স্বয়ংক্রিয় লিংক loop crawler-কে আটকে দিতে পারে। প্রতিরোধ: সর্বোচ্চ গভীরতা, প্রতি domain-এ URL সংখ্যার সীমা, URL দৈর্ঘ্যের সীমা এবং pattern শনাক্তকরণ।

robots.txt ও নৈতিকতা

প্রতিটি host-এর robots.txt এনে cache করুন ও মানুন। স্পষ্ট user-agent ও যোগাযোগ URL দিয়ে নিজের crawler চেনান। ছোট সাইটে ভারী load দেবেন না।

Distribution ও ব্যর্থতা

Host-এর hash দিয়ে অনেক মেশিনে কাজ ভাগ করুন। ব্যর্থ fetch backoff দিয়ে retry করুন, timeout দিন, এবং frontier-এর অবস্থা checkpoint করুন যাতে crash-এ অগ্রগতি না হারায়।

Freshness

পেজ কত ঘন ঘন বদলায় সে অনুযায়ী আবার crawl করুন: সংবাদের homepage ঘন ঘন, static পেজ কম। Bandwidth বাঁচাতে HTTP ETag / If-Modified-Since ব্যবহার করুন।

কনটেন্ট-সংক্রান্ত বিষয়

অনেক পেজে JavaScript render লাগে। Headless browser ধীর ও ব্যয়বহুল, তাই শুধু যেখানে দরকার সেখানে ব্যবহার করুন।

মূল কথা: per-host politeness-সচেতন frontier, Bloom-filter URL dedup, কনটেন্ট hashing, trap-এর সীমা, এবং robots.txt-এর প্রতি সম্মান।


System Design সিরিজ, পর্ব ৩ (case study): 12 নম্বর (মোট 16)। আগের লেখা: Double booking ছাড়া ticket booking সিস্টেম ডিজাইন.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া