爬虫程序有一个很大的问题,就是服务端会限制一个 IP 的请求频率,甚至封禁一个 IP 。解决这个问题的一个办法就是用多个不同网络的主机或代理来发出请求(同时限制频率),最后再把爬取的结果汇总。
Scrapy Cloud 就是一个这样的分布式服务: https://www.scrapinghub.com/, 是 scrapy 的作者们写的一个商业化的 SaaS 服务,核心非开源。
问题是:在接收到一个爬虫请求以后,怎样分配爬取链接到各个 worker 上面?这个问题似乎比较复杂,因为需要爬取的链接不是一个线性的列表,而是一个图结构(图中每个节点是一个需要爬取的链接),在预先只有图的根节点的情况下,怎样把爬取任务分配给各个 Worker 节点,又使得各个节点的任务尽量平均又不重合呢?
比如一个策略是,从根节点展开第一个层次的所有链接,然后把这些链接平均分配到各个 worker 开始爬取,但是有可能第二层有很多个公共的链接,各个 worker 就会重复很多爬取动作。
有什么好的想法吗?