构建网络爬虫的工程要点:
(1)用BFS还是DFS?
理论上,即不考虑时间因素和互联网静态不变的情况下,我们认为两者能够在大致的时间里完成所有的整个静态网页的爬取工作。
但工程上,做不到,网络爬虫更应该定义为“如何在有限的时间里最多的爬下那些重要的网页”,我们一般认为一个网页的首页是相当重要的。
显然BFS优于DFS。
那是否DFS就不使用?也不对,这和爬虫的分布式结构以及网络通信的握手成本有关,“握手”就是指下载服务器与网站的服务器建立通信的过程。
时间网络爬虫是由成百上千万太服务器组成的分布式系统,对于某一个网页,一般由特定的一台或者几台服务器专门下载,这样可以避免握手次数太多。
实际应用的网络爬虫不是对网页次序的简单BFS或者BFS,而是一个相对复杂的下载优先级排序的方法,管理这个系统的叫做“调度系统”(Scheduler),会有一个Priority Queue。BFS成分更加多一些。
(2)网页的分析和URL提取
实际中会有不是用HTML语言书写的,不少网页是一些脚本语言(比如JavaScript)生成
(3)记录访问过的URL,URL表
哈希表判重,在一台下载服务器上建立和维护一张哈希表并不是难事,但是如果分布式,多台服务器一起下载网页,就会出现问题:
问题1、哈希表太大,一台下载服务器存不下。
问题2、每台下载服务器在开始下载前和完成下载后都要维护这表哈希表,这个存储哈希表的通信就成为爬虫系统的瓶颈。
比较好的问题2的解决方法:A、明确每台下载服务器的分工,即一看到某个URL就知道交给哪台服务器去执行
B、批量处理,减少通信的次数