专业书籍精读 · System Design Interview 卷一 · 第 9 章

设计网页爬虫

System Design Interview Vol 1 · Ch 9 · Alex Xu · 2020

EN →

这一章讲什么?

你在搜索框里敲两个字,半秒钟就跳出上万条结果——那些网页当然不是在你敲字的时候现去读的,而是早就被一个程序一页页抄回来、整理好放着了。这个日夜不停在网上抄书的程序叫爬虫。《System Design Interview》第 9 章就是让你从零把它造出来。

打个比方

把爬虫想成一个抄书员,手里只有一张地址清单。他去清单上的第一个地址,把那儿的东西整页抄下来;抄的过程中发现文章里提到了另外二十个地址,他就把这二十个补到清单末尾。然后去下一个地址,如此循环。

神奇的地方在于:这张清单永远在变长。他抄得越多,清单越长——整个互联网就是这样被一圈一圈卷进来的。

难的不是「抄」,是「排队」

下载一个网页是最简单的一步,真正难的是决定下一个去哪。清单上排着几百亿个地址,而麻烦有两层:

第一层,清单上的地址会扎堆。一个网页里的链接,大多指向同一家网站。所以老老实实按顺序抄,清单上会连着出现几百个同一家的地址——抄书员一口气冲过去连敲几百次门,等于把人家门铃按爆了。人家一生气,直接把你拉黑,你就再也抄不到了。

第二层,地址不该一视同仁。新闻网站首页一小时就变一次样,某个十年没人动过的静态页面抄一次就够了。清单要是不分轻重,你会把宝贵的时间花在没人看的角落里。

核心办法:排两次队

这一章的灵魂就是:把「先去谁」和「别打扰谁」拆成前后两道队伍。

前面一道按重要性排——重要、更新勤的地址排前面,优先被叫号。后面一道按门牌号分:每一家网站单独开一个队,并且一家只派一个人去,两次敲门之间还得等一会儿。这样一来,前面那道保证你不浪费时间,后面那道保证你不惹人厌。两件互相打架的事,被两道队伍分开解决了。

诚实说一句代价:礼貌就是慢。你越守规矩、等得越久,抄完全网需要的时间就越长;想抄得快,只能同时铺开更多家网站,而不是在一家使劲敲。

路上的两种坑

一是抄到重复的。同一篇文章常挂在好几个地址下。所以抄书员得设两道关卡:出门前问「这个地址我去过没」,抄完后再问「这段内容我有了没」。

二是走进迷宫。有些网站的目录能一层套一层无限生成下去,一头扎进去就出不来。最省事的一刀是限制地址长度,剩下的只能靠人工把已知的迷宫记进黑名单。

一句话记住

爬虫的难点不在「怎么下载」,而在怎么排队:用两层队列把「先抓重要的」和「别把人家网站抓崩」这两件互相冲突的事分开解决;再在下载前和入库前各设一道去重关卡,挡掉去过的地址和抄过的内容。

想进到具体机制、记号和示意图? → 切到精读版