python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法
深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程。
一、网站的树结构
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爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法相关推荐
- 爬虫python是干什么的_爬虫是什么?能自学嘛
1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是按照一定规则从互联网上抓取信息的程序,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢.少量的获取 ...
- python爬虫动态数据获取_爬虫系列(9)爬虫的多线程理论以及动态数据的获取方法。...
NO·1 爬虫之多线程 1. 引入我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 不建议你用这个,不过还是介绍下了,如 ...
- python scrapy教程实例_爬虫框架Scrapy的第一个爬虫示例入门教程
原标题:爬虫框架Scrapy的第一个爬虫示例入门教程 我们使用dmoz.org这个网站来作为小抓抓一展身手的对象. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建 ...
- python游走代码_爬虫-案例
前提:爬虫的实际例子 搜索引擎(百度.谷歌.360搜索等). 伯乐在线. 惠惠购物助手. 数据分析与研究(数据冰山知乎专栏). 抢票软件等. 为什么用Python写爬虫程序: PHP:PHP是世界是最 ...
- python爬虫教程资源_爬虫学习资源整理
啊,好久没写东西了,发现收到了好多人的私信,我只要有时间都一一回复了,虽说不一定有用,但权当我们互相交流啊,互相学习呀. 最近一篇<我分析了42万字歌词后,终于搞清楚民谣歌手唱什么了>文章 ...
- python爬网易新闻_爬虫基本介绍 python3 爬虫爬取网易新闻排行榜
爬虫基本介绍 1. 什么是爬虫? 爬虫是请求⽹网站并提取数据的⾃自动化程序 2. 爬虫的基本流程 发起请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers ...
- python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- python跳舞的线_舞蹈链(Dance Link X)算法详解及python实现
这两天打算做个数独玩玩,查了一下解数独最好的算法叫舞蹈链:Dance Link X 该算法主要是解决精确覆盖问题:比如有个集合X,以及其若干子集的集合Y,要求出一个Y的子集Y*,能够恰好分割X. 举个 ...
- 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘
[业务介绍] 垂直策略团队成立于2014年,成立之初主要负责今日头条的内容标签,用户标签挖掘,推荐召回,搜索,推送和频道推荐,目前主要负责火山引擎(字节跳动全球技术ToB品牌,目前为几十家外部合作伙伴 ...
最新文章
- Corner Proposal Network 论文阅读(2020ECCV)
- std::tuple类型
- SpringBoot第八篇:springboot整合mongodb
- 步步为营-68-asp.net简单练习(get set)
- 云拨测助力节卡机器人,全面优化海外网站性能
- MySQL 性能优化--QueryCache的原理
- win10共享文件夹设置,本地组策略配置全攻略
- 用python批量爬qq号_简单教程 8位QQ靓号爬取并过滤 – Python版
- 工具及方法 - 编辑二进制文件(使用VSCode和Notepad++的插件Hex Editor)
- 英语词频统计器分词器基于Java
- Redis之过期键删除策略
- 我的世界java播放背景音乐_我的世界BOSS音乐mod
- iOS二维码代码实现
- uniapp吸顶功能实现
- Excel 去除重复项的几种常用技巧
- 实现免密登录,设置只允许student1, student2用户登录,get和post的区别,HTTP状态码,HTTP请求报文和响应报文,HTTP是如何保持连接状态的
- Go 使用IP纯真库获取IP对应的国家、省、市
- 天融信EDR 彻底卸载方法
- php仿山楂岛留言本源码
- VTK交互系统 2 交互器样式