《数学之美》—— 图论和网络爬虫

作者:吴军

第9章 图论和网络爬虫

构建网络爬虫的工程要点

1、首先,用BFS还是DFS?

BDS (Breadth-First-Search)(广度优先搜索)

DFS (Depth-First-Search)(深度优先搜索)

先爬哪个网页,后爬哪个网页的调度程序,原理上基本上是BFS。

但是分布式的爬虫系统为了减少网络通信中的握手成本,一组专门下载某个网站的服务器会先下载完一个网站,然后再进入下一个网站,而不是每个网站先轮流下载5%,然后再回过头来下载第二批。这又有点像DFS,虽然下载同一个网站(或者子网站)时,还是需要用BFS的。

 

2、页面的分析和URL的提取。

当一个网页下载完成后,需要从这个网页中提取其中的URL,把它们加入到下载的队列中。早期网页是直接用HTML语言写的,URL很容易提取,现在很多网页使用一些脚本语言(如JavaScript)生成的,页面分析就要复杂的多。

因此,若你发现一些网页明明存在,但搜索引擎就是没有收录,一个可能的原因是网络爬虫中的解析程序没能成功解析网页中不规范的脚本程序。

 

3、记录哪些网页已经下载过的小本本 —— URL表

为了防止一个网页被下载多次,我们可以用一个散列记录哪些网页已经下载过。再遇到这个网页的时候,我们就可以跳过它。采用散列表的好处是,判断一个网页的URL是否在表中,平均只需一次(或者略多的)查找。

但是上千台服务器一起下载网页,且维护一张散列表会非常困难。首先,这张散列表会大到一台服务器存不下。其次,由于每个下载服务器在开始下载前和下载后都要维护这张表,以免不同的服务器做重复的工作,这个存储散列表的服务器的通信就成了整个爬虫系统的瓶颈。

如何消除这个瓶颈呢?

好的方法一般都采用了这样两个技术:首先,明确每台下载服务器的分工,也就是说在调度时一看到某个URL就知道要交给哪台服务器去下载,以免很多服务器都要去重复判断某个URL是否需要下载,然后,在明确分工的基础上,判断URL是否下载就可以批处理了,比如每次向散列表(一组独立的服务器)发送一大批询问,或者每次更新一大批散列表的内容。这样通信的次数就大大减少了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值