深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程。

一、网站的树结构

1.1、一个网站的url结构图

以知乎为例,知乎目前有发现、话题、Live、书店、圆桌、专栏主要的6个tab页。每个网站的url都是有一定的层次,如下图:发现explore、话题topic、Live lives、书店pub、圆桌roundtable、专栏zhuanlan都是在主域名zhihu的下一级,而具体的Live在zhuhu.com/lives/770340328338104320,内容又在话题之下zhihu/question/67006058/answer/250037350,网站的所有内容都一层一层的类似一个树形结构。

知乎网站的url结构图

1.2、网站url链接的结构图

当然,如果我们要做爬取整个网站的url时,我们必须要知道每个网站的url链接一般情况下都是存在环路的,也就是在下一级页面存在上一级页面的url链接,这样形成一个环路。当遇到这个情况时我们需要做url去重,一般的处理方式是把已经爬过的url放到一个list,每次爬取url的时候都去这个list查看下是否已经爬过,爬过的就跳过。这块url去重我下次再详细介绍。

url链接存在环路

二、深度优先和广度优先算法原理介绍(以二叉树为例)

为了更加容易理解深度优先和广度优先算法的原理,我们把一个网站的Tab理解成一颗树的节点,如下图:

二叉树

2.1、深度优先算法

如果我们从深度优先算法来遍历这棵树的节点,那么遍历的顺序是ABDECFHG。

深度优先遍历也叫深度优先搜索(Depth First Search)。它的遍历规则:不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。

从A开始遍历。

遍历分析:A有两个邻接点B和C,选择下标小的B遍历。接着从B开始深度遍历,B有两个邻接点D和E,选择下标小的D开始深度遍历,D下面没有邻接点,那么回溯到B深度往右遍历到E,E下面没有邻接点。至此,遍历得到的值为ABDE。EDB下的节点都遍历完之后就会从C开始深度遍历,同理遍历得出的值为CFHG。那么最后得出的结果为ABDECFHG。

使用Python代码实现的伪代码如下:

深度遍历算法

从代码可以知道深度优先算法是使用递归实现的。

2.2、广度优先算法

如果我们从广度优先算法来遍历这棵树的节点,那么遍历的顺序是ABCDEFGH。

广度优先遍历也叫广度优先搜索(Breadth First Search)。它的遍历规则:

1)先访问完当前顶点的所有邻接点。(应该看得出广度的意思)

2)先访问顶点的邻接点先于后访问顶点的邻接点被访问。

从A开始遍历。

遍历分析:A有两个邻接点B和C,于是按序遍历B、C。B先于C被访问,于是B的邻接点应先于C的邻接点被访问,那就是接着访问D、E。然后在回到C,C有两个邻接点F、G。再按同样的规则访问D、E、F、G的的邻接点,只有F有一个邻接点H。广度遍历完毕,最后得出的结果为ABCDEFGH。

使用Python代码实现的伪代码如下:

广度优先算法

从代码可以知道广度优先算法是使用队列实现的。

三、总结和分析

3.1、总结

深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历(我们前面使用的是先序遍历)。具体说明如下:

先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。

中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。

后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。

广度优先遍历:又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。

3.2、分析

深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。

广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。

通常深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。

所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。

广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。

但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些。

python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法相关推荐

  1. 爬虫python是干什么的_爬虫是什么?能自学嘛

    1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是按照一定规则从互联网上抓取信息的程序,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢.少量的获取 ...

  2. python爬虫动态数据获取_爬虫系列(9)爬虫的多线程理论以及动态数据的获取方法。...

    NO·1 爬虫之多线程 1. 引入我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 不建议你用这个,不过还是介绍下了,如 ...

  3. python scrapy教程实例_爬虫框架Scrapy的第一个爬虫示例入门教程

    原标题:爬虫框架Scrapy的第一个爬虫示例入门教程 我们使用dmoz.org这个网站来作为小抓抓一展身手的对象. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建 ...

  4. python游走代码_爬虫-案例

    前提:爬虫的实际例子 搜索引擎(百度.谷歌.360搜索等). 伯乐在线. 惠惠购物助手. 数据分析与研究(数据冰山知乎专栏). 抢票软件等. 为什么用Python写爬虫程序: PHP:PHP是世界是最 ...

  5. python爬虫教程资源_爬虫学习资源整理

    啊,好久没写东西了,发现收到了好多人的私信,我只要有时间都一一回复了,虽说不一定有用,但权当我们互相交流啊,互相学习呀. 最近一篇<我分析了42万字歌词后,终于搞清楚民谣歌手唱什么了>文章 ...

  6. python爬网易新闻_爬虫基本介绍 python3 爬虫爬取网易新闻排行榜

    爬虫基本介绍 1. 什么是爬虫? 爬虫是请求⽹网站并提取数据的⾃自动化程序 2. 爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers ...

  7. python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  8. python跳舞的线_舞蹈链(Dance Link X)算法详解及python实现

    这两天打算做个数独玩玩,查了一下解数独最好的算法叫舞蹈链:Dance Link X 该算法主要是解决精确覆盖问题:比如有个集合X,以及其若干子集的集合Y,要求出一个Y的子集Y*,能够恰好分割X. 举个 ...

  9. 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘

    [业务介绍] 垂直策略团队成立于2014年,成立之初主要负责今日头条的内容标签,用户标签挖掘,推荐召回,搜索,推送和频道推荐,目前主要负责火山引擎(字节跳动全球技术ToB品牌,目前为几十家外部合作伙伴 ...

最新文章

  1. Corner Proposal Network 论文阅读(2020ECCV)
  2. std::tuple类型
  3. SpringBoot第八篇:springboot整合mongodb
  4. 步步为营-68-asp.net简单练习(get set)
  5. 云拨测助力节卡机器人,全面优化海外网站性能
  6. MySQL 性能优化--QueryCache的原理
  7. win10共享文件夹设置,本地组策略配置全攻略
  8. 用python批量爬qq号_简单教程 8位QQ靓号爬取并过滤 – Python版
  9. 工具及方法 - 编辑二进制文件(使用VSCode和Notepad++的插件Hex Editor)
  10. 英语词频统计器分词器基于Java
  11. Redis之过期键删除策略
  12. 我的世界java播放背景音乐_我的世界BOSS音乐mod
  13. iOS二维码代码实现
  14. uniapp吸顶功能实现
  15. Excel 去除重复项的几种常用技巧
  16. 实现免密登录,设置只允许student1, student2用户登录,get和post的区别,HTTP状态码,HTTP请求报文和响应报文,HTTP是如何保持连接状态的
  17. Go 使用IP纯真库获取IP对应的国家、省、市
  18. 天融信EDR 彻底卸载方法
  19. php仿山楂岛留言本源码
  20. VTK交互系统 2 交互器样式

热门文章

  1. 卷积神经网络的复杂度分析
  2. Swin Transformer升级版来了!30亿参数,刷榜多项视觉任务,微软亚研原班人马打造...
  3. 7年秘密研发,Meta拿下元宇宙「登月项目」!气动手套让指尖有真实触感
  4. 【干货】新手炼丹经验总结
  5. 为什么抢红包抢不过别人?学了这个算法就明白了!
  6. Tornado自定义分布式session框架
  7. call ret指令的总结
  8. Linux期末复习题库(1)
  9. KNN学习之图像分类与KNN原理
  10. 5 行代码实现图像分割