浅谈网络爬虫中深度优先算法和简单代码实现
学过网站设计的小伙伴们都知道网站通常都是分层进行设计的最上层的是顶级域名之后是子域名子域名下又有子域名等等同时每个子域名可能还会拥有多个同级域名而且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到木有咧
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
工作环境换成Ubuntu18.04小记
原文: 工作环境换成Ubuntu18.04小记 Linux汇总:https://www.cnblogs.com/dunitian/p/4822808.html#linux Ubuntu常用软件安装(小集合)http://www.cnblogs.com/dunitian/p/6670560.html Ubuntu 18.04 最小安装后: 更新之后: 系统自带的Python为3.6版本,已经没有Python2.7了 ifconfig也跟CentOS7一样了 ==> ip addr 有些危险操作被屏蔽了 更新系统 sudo apt update sudo apt upgrade sudo apt dist-upgrade 卸载应用 sudo apt autoremove gedit sudo apt autoremove firefox* 命令安装 开启远程连接 sudo apt install openssh-server -y 安装Git版本控制 sudo apt install git -y 安装浏览器 sudo add-apt-repository ppa:a-v-shkop...
- 下一篇
不安分的 Go 语言开始入侵 Web 前端领域了
从 Go 语言诞生以来,它就开始不断侵蚀 Java 、C、C++ 语言的领地。今年下半年 Go 语言发布了 1.11 版本,引入了 WebAssembly 技术,浏览器端 Javascript 的垄断地位也开始遭遇 Go 语言的攻击。这次不同以往,它意味着 Go 语言从后端渗透进了前端,进入了一个全新的世界。 WebAssembly 运行原理 WebAssembly 这个名字翻译过来就是 「Web 汇编」,也就是 Web 端的汇编语言。它是一段二进制字节码程序,Javascript 可以将这段二进制程序编译成模块,然后再实例化这个模块就可以调用字节码逻辑了。WebAssembly 代码运行的速度很快,比 Javascript 要快很多,Javascript 可以通过 WebAssembly 技术将关键性耗费性能的逻辑交给 WebAssembly 来做就可以明显提升浏览器端的性能。 对比显示,使用 WebAssembly 运行斐波那契数列相比使用原生 Javascript 来实现,运行效率上能带来 3.5 倍的提升。 WebAssembly 是一项比较新的技术,只有比较现代的浏览器才支持...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用