图论中的遍历算法:广度优先搜索BFS,深度优先搜索DFS;
互联网就是一张图,每个网页是一个节点,超链接就是连接网页的弧;
从任何一个网页出发,利用图的遍历算法,自动访问到每个网页,并把他们存起来–网页爬虫;
1、BFS还是DFS?
理论上来说,这两个算法都是可行的;
考虑到实际因素,互联网是动态的,不是静态不变的,所以网络爬虫问题更应该定义为“在有限的时间里最多的爬下最重要的网页”。
1)最重要的:
各个网站最重要的网页应该是首页,,其次是从首页直接链接的网页;如果爬虫很小,只能爬取有限的网页,在这个前期下,显然BFS优于DFS;
2)最多的:
爬虫的分布式结构,网络通信的握手成本;握手是指下载服务器和网站服务器建立通信的过程,这需要时间;如果握手次数太多,则下载效率就会降低;因此,为避免握手次数太多,都是先下载第一个网站,完成后,再进入第二个网站,而不是每个网站轮流下载;
这有点像DFS;
网络爬虫对网页遍历的次序,不是简单的BFS或者DFS;
2、页面的分析和url的提取
当一个网页下载完后,需要从该网页中提取出所有的url,加入到下载队列中;
静态网页,url有明显的标识,很容易提取;
有些网页,动态脚本生成,url不是直接可见的;
3、记录哪些网页已经下载过
一个网页可以被多个网页中的超链接指向,因此,一个网页可能被多次访问到;
为了防止一个网页被多次下载,可以用要给散列表记录哪些网页已经下载过;
采用散列表的好处:判断一个网页的url是否在表中,平均只需一次的查找;
散列表会很大===瓶颈;