Web Crawler หรือ Spider/Robot ใช้ค้นพบและรวบรวมเนื้อหาเว็บ เช่น Web Pages, Images และ Videos บทนี้มุ่งเน้นการออกแบบ Web Crawler ที่ขยายได้สำหรับ Search Engine Indexing
บทนำ
Web Crawler หรือ Spider/Robot ใช้ค้นพบและรวบรวมเนื้อหาเว็บ เช่น Web Pages, Images และ Videos บทนี้มุ่งเน้นการออกแบบ Web Crawler ที่ขยายได้สำหรับ Search Engine Indexing
การใช้งาน Web Crawlers
- Search Engine Indexing: รวบรวม Web Pages เพื่อสร้าง Searchable Indexes (เช่น Googlebot)
- Web Archiving: รักษาข้อมูลเว็บสำหรับอนาคต (เช่น US Library of Congress)
- Web Mining: ค้นพบความรู้จากข้อมูลเว็บ
- Web Monitoring: ตรวจจับละเมิดลิขสิทธิ์หรือเครื่องหมายการค้า
ความท้าทายในการออกแบบ
- Scalability: รองรับพันล้าน Pages โดยใช้ Parallelization
- Robustness: จัดการ HTML ที่เสีย, Crashes และ Malicious Links
- Politeness: หลีกเลี่ยงการทำให้ Servers ท่วมด้วย Requests มากเกินไป
- Extensibility: รองรับ Content Types ใหม่ด้วยการเปลี่ยนแปลงน้อยที่สุด
ข้อกำหนด
- Crawl 1 พันล้าน Web Pages ต่อเดือน
- เก็บเฉพาะ HTML Content
- ติดตาม Pages ใหม่และอัปเดต
- ละเว้น Duplicate Content
- จัดเก็บ Crawled Data เป็นเวลา 5 ปี
Components
1. Seed URLs
จุดเริ่มต้นสำหรับ Crawler - ต้องเลือกจุดเริ่มที่ดีเพื่อ Traverse Links ให้ได้มากที่สุด
2. URL Frontier
เก็บ URLs ที่ต้อง Download - Implement เป็น FIFO Queue
3. HTML Downloader
Download Web Pages จาก URLs ที่ URL Frontier จัดเตรียมไว้
4. DNS Resolver
แปลง URLs เป็น IP Addresses
5. Content Parser
ตรวจสอบและ Parse Web Pages - ละเว้น Pages ที่เสีย
6. Content Seen?
ตรวจสอบ Duplicate Content โดยเปรียบเทียบ Hash Values
7. Content Storage
จัดเก็บ HTML Pages บน Disk (Content ยอดนิยมใน Memory เพื่อลด Latency)
8. URL Extractor
แยก Links ใหม่จาก Parsed Pages
9. URL Filter
กัน URLs ที่ถูก Blacklist หรือผิดพลาดออก
10. URL Seen?
ติดตาม URLs ที่เยี่ยมชมแล้วเพื่อหลีกเลี่ยง Duplication
Workflow
- เพิ่ม Seed URLs ไปยัง URL Frontier
- HTML Downloader ดึง URLs และ Resolve IPs ผ่าน DNS Resolver
- Content Parser ตรวจสอบและส่งต่อ Content ไปยัง "Content Seen?"
- หาก Content ใหม่ แยก Links ผ่าน URL Extractor
- กรองและเพิ่ม Links ที่ไม่ซ้ำไปยัง URL Frontier
URL Frontier - Politeness & Priority
Politeness
- ให้แน่ใจว่ามีเพียงหนึ่ง Request ต่อ Host ณ เวลาหนึ่ง
- เพิ่ม Delay ระหว่าง Download Tasks
- ใช้ Mapping จาก Hostnames ไปยัง Queues และ Workers
Priority
- กำหนด Priority สูงกว่าให้ Pages ที่สำคัญ (เช่น โดย PageRank หรือความถี่ในการอัปเดต)
- Front Queues จัดการ Prioritization
- Back Queues จัดการ Politeness
การหลีกเลี่ยงปัญหา
- Duplicate Content: ตรวจจับโดยเปรียบเทียบ Hash Values
- Spider Traps: หลีกเลี่ยง Infinite Loops ด้วยเทคนิคเช่น URL Length Limits
- Data Noise: กรองเนื้อหาที่ไม่เกี่ยวข้อง
เนื้อหานี้อ้างอิงจาก ByteByteGo - System Design Interview - An Insider's Guide