前言

做爬虫的,最怕业务简单粗暴的来一句“爬一下XXXX网”。比如,“爬一下央广网”(示例链接:http://www.cnr.cn),看着密密麻麻的各种子分类,除了内容子分类,还有地区子分类;真的就是,有句不当讲的话不知道当讲不当讲。

抛开个人情绪,技术上的话,就要聊到广度优先算法和深度优先算法了。

深度优先算法

学过网站设计的小伙伴们都知道网站通常都是分层进行设计的,最上层的是顶级域名,之后是子域名,子域名下又有子域名等等,同时,每个子域名可能还会拥有多个同级域名,而且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),以此类推,直到所有的节点都被遍历或者达到既定的条件才会停止。右节点的实现过程亦是如此,不再赘述。

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

广度优先算法

广度优先算法和深度优先算法恰好相反,这里继续以上图的二叉树为例。广度优先算法的主要思想是首先从顶级域名A开始,之后从中提取出两个链接B和C,待链接B抓取完成之后,下一个要抓取的链接则是链接B的同级兄弟链接C,而不是说抓取完成链接B之后,立马往下去抓取子链接C或D。待C抓取完成之后,再返回去继续抓取兄弟链接B下的子链接D或者E,尔后再返回去抓取C链接下的兄弟链接F、G、H,以此类推。

从面上看去,广度优先算法是一种以分层的方式进行抓取的策略。首先将第一层的节点抓取完成,尔后抓取第二层的节点,再是依次抓取第三层的节点,以此类推,直到抓取完毕或者达到既定的抓取条件为止。可以认为广度优先算法是一种按照层次的方法进行遍历,所以也被称为宽度优先算法。理解好广度优先算法之后,再来看上图,可以得到该二叉树呈现的爬虫抓取链接的顺序依次为:A、B、C、D、E、F、G、H 、I(这里假设左边的链接先会被爬取)。通过上面的理解,我们可以认为到广度优先算法本质上是通过队列的方式来进行实现的。

下图展示的是广度优先算法的代码实现过程:

最开始传入一个顶节点node(链接A),然后判断节点是否非空,如果为空,则返回,反之非空的话,则将其放入到一个队列列表中,然后开始进行循环。对队列列表中的元素(此时只有节点A)使用pop()方法将其进行取出,然后将该节点的数据进行打印。将节点打印完成之后,看看其是否存在左节点(链接B)和右节点(链接C),如果左节点非空的话,则得到新的左节点(链接B),将其放入到队列列表中去。尔后程序继续往下执行,右节点的实现过程亦是如此,此时将得到右节点(链接C),将其也放入到队列列表中去。此时队列列表中的元素有链接B和链接C,之后再次进行新一轮的循环。通过这种方式,我们便实现了广度优先算法中的分层抓取链接的过程。这个逻辑相对于深度优先算法来说,更为简单。

结语

网络爬虫中广度优先算法和深度优先算法,理论比较简单,实现也比较容易,适用于常规的新闻类网站。

对于数据以接口形式加载的网站,通用性不高;除非使用Selenium等模拟浏览器的方式将样式和数据渲染进网页后,在使用相关的算法进行操作。这种方法可行,但如果有效率限制的话,成本会非常高。

浅谈网络爬虫中广度优先算法和深度优先算法相关推荐

  1. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  2. crawler_浅谈网络爬虫

    题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...

  3. 浅谈网络编程中的常见问题

    OSI七层模型 OSI七层协议模型主要是: 应用层(Application) 表示层(Presentation) 会话层(Session) 传输层(Transport) 网络层(Network) 数据 ...

  4. 浅谈网络世界中的Power Law现象(一) 什么是Power Law

    Posted by Mr.Friday 这次系列的主题是网络世界里得Power Law.这个主题其实很不好写,因为这个数学模型在生活中随处可见,而且在不同得场合,不同得环境下,人民往往对这个现象有着不 ...

  5. 生活中人们通过计算机网络进行信息交流,浅谈网络计算机应用

    浅谈网络计算机应用 摘 要:网格计算作为信息产业的新热点,将是近期内解决数据量极大的科学工程计算问题最直接和最有效的途径.随着网格计算技术的进一步发展以及服务提供商的共同努力,网格计算将会应用于更广阔 ...

  6. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  7. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  8. php 爬虫去重,浅谈动态爬虫与去重(续)

    作者:Fr1day@0keeTeam 0x00 前言 在 浅谈动态爬虫与去重 中,分享了动态爬虫中触发事件.监控节点变动.URL去重等的实现方法.在接近一年的线上运行与迭代更新过程中,处理了很多bug ...

  9. 浅谈单片机程序设计中的“分层思想”!

    浅谈单片机程序设计中的"分层思想",并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种 ...

最新文章

  1. 禁用Chrome缓存进行网站开发
  2. python更改数据框指定位置的数据_python-如何使用来自另一个数据框的新值更新pyspark数据框?...
  3. 前端综合性文档和教程总结(持续更新)
  4. 大学计算机课代表竞选稿,课代表竞选演讲稿
  5. Atitit vue.js 把ajax数据 绑定到form表单
  6. QT学习之自定义控件
  7. matlab调整文字方向,python 旋转文字方向_如何通过Python 在绘图中旋转文字?
  8. 【Docker】给运行的容器添加端口映射
  9. 读取、回收和重用:使用 Excel、XML 和 Java 技术轻松搞定报告,第 2 部分
  10. wifidog 源码初分析
  11. 阿里云ECS(centos)中安装Tomcat
  12. java.lang.NullPointterException:
  13. NTFS,exFAT,EXT4,MBR,GPT
  14. java对象与对象引用变量
  15. 互联网乱弹之360的云存储
  16. 怎么实现MindMapper破解版中格式的设置
  17. 计算机对商务英语的不利之处,商务英语教学中计算机网络利弊分析论文.docx
  18. USB转串口芯片CH340系列及CH340模块使用方法(CH340驱动,接线,串口下载详细介绍)
  19. RTX51 tiny系统容易混淆的问题
  20. 深入Unreal蓝图开发:自定义蓝图节点(下)

热门文章

  1. MySQL(二):MySQL的介绍+事务+分类+MySQL引擎
  2. Lucene倒排索引简述 之索引表
  3. 阿蒙:不如回家养猪?
  4. 凡科建站上传html,如何将自己设计的网页上传到网站上?如何把自己制作的网页上网?自己在本地建的网站,别人怎么访问?...
  5. 软件开发、设计、不做一锤子买卖,欢迎长期合作
  6. 揭秘外贸大神怎样开发客户?
  7. [福利]Process On 免费下载模板
  8. Mixlab推荐:设计师如何设计体验?
  9. 在Word中如何调整编号和文字之间的间距?
  10. leetcode 做的题目总结