设计一个网络爬虫

Scenario: 有多少网页, 有多长,有多大
Service: Crawler, TaskService, StrorageService
Storage: Use db To store task, 用 big table存网页

网络爬虫是一个写多读少的系统: webcrawler

设计一个新闻爬取系统
send http request, grab contents of the news list page
extract all news titles from news list page

常见问题:

  1. 单线程为什么要比多线程要慢?因为这里要等。

  2. 用深度优先还是用广度优先,广度优先天然带队列

  3. 多线程共享队列的问题
    每个线程都删队列的头,就会有问题。

分布式web crawler

Queue

URL queue, 1 trillion, 20 * 2 = 40TB 内存 太大了
不能放在内存里面,只能存在硬盘上面,数据库
没法控制顺序, 频率 和优先级, Queue解决不了

Task Table

需要一个task table(DB),解决优先级和频率的问题
task table
id , url, state, priority, available time (控制频率)
1, http:// idle, 1, 2019-03-04

架构

WebPage storage <-> crawler <-> task table(dB)

其他问题
  1. 表太大的话需要拆表
    拆表 但是就有一个scheduler 因为在不同的服务器上

  2. Exponential back off, failure的情况或者不怎么更新的网页

  3. Dead cycle, 某些网站总是只指向它自己。每个巨型网站不能超过多少的限额

你可能感兴趣的:(设计一个网络爬虫)