浅谈网络爬虫中深度优先算法和简单代码实现

学过网站设计的小伙伴们都知道网站一般都是分层进行设计的,最上层的是顶级域名,以后是子域名,子域名下又有子域名等等,同时,每一个子域名可能还会拥有多个同级域名,并且URL之间可能还有相互连接,千姿百态,由此构成一个复杂的网络。面试

当一个网站的URL很是多的时候,咱们务必要设计好URL,不然在后期的理解、维护或者开发过程当中就会很是的混乱。理解以上的网页结构设计以后,如今正式的引入网络爬虫中的深度优先算法。算法


上图是一个二叉树结构,经过对这个二叉树的遍历,来类比抓取网页,加深对爬虫策略的理解。深度优先算法的主要思想是首先从顶级域名A开始,以后从中提取出两个连接B和C,待连接B抓取完成以后,下一个要抓取的连接则是D或者E,而不是说抓取完成连接B以后,立马去抓取连接C。抓取完连接D以后,发现连接D中全部的URL已经被访问过了,在这以前咱们已经创建了一个被访问过的URL列表,专门用于存储被访问过的URL。当连接D彻底被抓取完成以后,接下来就会去抓取连接E。待连接E爬取完成以后,不会去爬取连接C,而是会继续往下深刻的去爬取连接I。原则就是连接会一步一步的往下爬,只要连接下还有子连接,且该子连接还没有被访问过,这就是深度优先算法的主要思想。深度优先算法是让爬虫一步一步往下进行抓取完成以后,再一步一步退回来,优先考虑深度。理解好深度优先算法以后,再来看上图,能够获得该二叉树呈现的爬虫抓取连接的顺序依次为:A、B、D、E、I、C、F、G、H(这里假设左边的连接先会被爬取)。实际上,咱们在作网络爬虫过程当中,不少时候都是在用这种算法进行实现的,其实咱们经常使用的Scrapy爬虫框架默认也是用该算法来进行实现的。经过上面的理解,咱们能够认为深度优先算法本质上是经过递归的方式来进行实现的。网络

下图展现的是深度优先算法的代码实现过程。数据结构

深度优先过程其实是经过一种递归的方式来进行实现的。看上图的代码,首先定义一个函数,用于实现深度优先过程,而后传入节点参数,若是该节点非空的话,则将其打印出来,能够类比一下二叉树中的顶级点A。将节点打印完成以后,看看其是否存在左节点(连接B)和右节点(连接C),若是左节点非空的话,则将其进行返回,再次调用深度优先函数自己进行递归,获得新的左节点(连接D)和右节点(连接E),以此类推,直到全部的节点都被遍历或者达到既定的条件才会中止。右节点的实现过程亦是如此,再也不赘述。框架

深度优先过程经过递归的方式来进行实现,当递归不断进行,没有跳出递归或者递归太深的话,很容易出现栈溢出的状况,因此在实际应用的过程当中要有这个意识。函数

深度优先算法和广度优先算法是数据结构里边很是重要的一种算法结构,也是很是经常使用的一种算法,并且在面试过程当中也是很是常见的一道面试题,因此建议你们都须要掌握它,下一篇文章咱们将介绍广度优先算法,敬请期待。网站

关于网络爬虫中深度优先算法的简单介绍就到这里了,小伙伴们get到木有咧?设计

相关文章
相关标签/搜索