浅析深度优先与广度优先的遍历算法(简单实践)

前段时间和产品人员、运营人员聊产品相关的事情,他们提出想通过收集一些网站数据去分析其它产品功能的数据情况以及制定推广计划,因此去了解了爬虫相关的知识。

深度优先和广度优先算法在爬虫遍历页面url的算法的时候经常用到,笔者在本文中主要与大家分享讲解这两个算法的原理。

image

一、网站的url结构

每个网站都是有一定结构层次,在一个主域名下可能会有多个内容模块,网站的所有内容都是类似一个树形结构一层一层的,如下图:

浅析深度优先与广度优先的遍历算法(简单实践)_第1张图片
image

二、原理剖析

我们把网站的结构理解为一颗树的结构,每一个页面就是一个节点,如图:

浅析深度优先与广度优先的遍历算法(简单实践)_第2张图片
image

▎深度优先算法

通过深度优先遍历出来的结果是: A-->B-->D-->H-->E-->C-->F-->G

深度优先算法过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次:

●首先访问根节点,然后依次从根节点的未被访问的邻接点出发,进行深度优先遍历,直至和根节点有路径相通的节点都被访问。

●若此时尚有节点未被访问,则从一个未被访问的节点出发,重新进行深度优先遍历,直到所有顶点均被访问过。

由深度优先算法的规则可知该算法具体实现使用递归实现的。

▎广度优先算法

通过广度优先遍历出来的结果是: ** A-->B-->C-->D-->E-->F-->G-->H**

广度优先算法是从一个节点开始,根据层次从上到下的遍历节点,在同一层中从左到右遍历节点:

●首先访问根节点,然后访问距根节点距离为1的顶点。假设有3个节点与根节点相邻,深度优化搜索会在访问根节点后访问这3个节点。

●在完成访问距根节点距离为1的节点后,将它取出并重复相同的过程。其中哪一个节点是第一个节点,这根据队列的数据结构来处理。

所以也把广度优化算法称为横向顺序遍历,因为它一层一层地访问节点。广度优化搜索通过队列实现。

三、简单实践

这两种算法在爬虫遍历页面时经常被用到,我用了广度优先算法做了一个简单的爬取网站所有 url 的 demo 。这个 demo 主要用到了 python3 的三个库 urllib 、BeautifulSoup 以及ss l。

Urllib 库用来网页请求、响应获取;BeautifulSoup 库用来将html解析为对象进行处理;ssl是解决访问Https时不受信任SSL证书问题;这几个库还有其他功能,感兴趣的可以去了解它们的API:

导入urllib、BeautifulSoup库


import ssl

import urllib.request

from bs4 import BeautifulSoup

获取网页内容


#解决访问Https时不受信任SSL证书问题

context = ssl._create_unverified_context()

#使用urllib库抓取URL内容

resp=urllib.request.urlopen(link_url, context=context)

html=resp.read()

解析网页内容(这边只解析提取网页里面的链接)


 #使用BeautifulSoup库解析网页内容

soup = BeautifulSoup(html, 'html.parser') 

tags = soup.find_all('a')

for tag in tags:

    child_urls.add(tag.attrs('href'))

使用广度优先算法进行爬取


while not queue.empty():

    current_url = queue.get()

    if current_url not in found_urls:

        found_urls.add(current_url)

        quene.put(getLinkUrls(current_url))

四、比较分析

◆深度优先算法采用栈的方式,有回溯操作,不会保留全部节点,占用空间少,但运行速度较慢。

◆广度优先算法采用队列的方式,无回溯操作,保留全部节点,运行速度较快,但占用空间较多。

◆深度优先算法和广度优先算法的时间复杂度都是O(n2),n为节点数。

浅析深度优先与广度优先的遍历算法(简单实践)_第3张图片
image

五、工具推荐

借助代码去抓取想要的数据并进行可视化分析是最方便灵活的,但是很多产品和运营说到学代码,可能马上就放弃了。

那么有没有不懂代码就可以实现抓取数据,进行可视化分析的方法呢?以下就是我为大家推荐的三款工具:

  • NO.1 八爪鱼采集器

八爪鱼可以比较容易的从网页精确采集你需要的数据,内容涵盖电商类、生活服务类、社交媒体类、论坛类。

**▎八爪鱼采集器优点:

●操作简单,完全可视化图形操作,无需专业IT人员,任何会使用电脑上网的人都可以轻松掌握。

●采集任务自动分配到云端多台服务器同时执行,提高采集效率,可以很短的时间内 获取成千上万条信息。

●模拟人的操作思维模式,可以登陆,输入数据,点击链接,按钮等,还能对不同情况采取不同的采集流程。

●内置可扩展的OCR接口,支持解析图片中的文字,可将图片上的文字提取出来。

●采集任务自动运行,可以按照指定的周期自动采集,并且还支持最快一分钟一次的实时采集。

●内置从入门到精通所需要的视频教程,2分钟就能上手使用,另外还有文档,论坛,qq群等。

**▎八爪鱼采集器缺点:

●它又免费版本,当时很多功能需要付费或者积分。

●大量采集数据的时候,容易出现采集不全的情况。

●判断语录较弱,无法进行复杂判断,也无法执行复杂逻辑。

浅析深度优先与广度优先的遍历算法(简单实践)_第4张图片
image
  • NO.2 火车采集器 -

火车采集器成立的比较久,经过了十几年的迭代,可以实现抓取、清洗、分析,挖掘及最终的可用数据呈现,一整套服务。

火车采集器优点:

●采集原理是基于 web 结构的源代码提取,几乎适用于所有的网页,以及网页中能够看到的所有内容;

●支持接口和插件多种扩展延伸,满足更加多样化的使用需求,使火车采集器真正做到全网通用。

●在每个功能上都做了优化设置,除了最基础的数据采集,更是融入了强大的数据处理和数据发布功能,全面完善了对于数据利用的整个流程。

●火车采集器在许多细节操作中配置多项可选方式。

●分布式高速采集系统,占用资源少。

●实时地监控采集,数据不易遗漏。

火车采集器缺点:

●规则配置烦琐。

●比较占用内存和CPU资源,大批量采集速度不行,资源回收控制得不好。

●高级功能必须付费版才能使用。

浅析深度优先与广度优先的遍历算法(简单实践)_第5张图片
image
  • NO.3 Tableau -

Tableau是数据可视化做的最好的平台之一,功能十分强大。

Tableau 优点:

●优秀的数据可视化展示效果,数据图表制作能力强

●操作简单,上手快不需要写代码,数据的导入和加载都是向导式

●内置美观的可视化图表,不用考虑配色,表格处理好格式即可。

Tableau 缺点:

●基于数据查询的工具,难以处理不规范数据,难以转化复杂模型。

●对输入数据类型有要求,运行起来比较慢,且只能支持PC电脑,这也是很多Newsroom后来抛弃它的原因。

●本身没有后端数据仓库,宣称自己是内存BI,实际用起来对硬件要求极高,对于超千万条的数据分析,必须借助于其他ETL工具处理好数据再进行前端分析

●无法支持中国式复杂表样

●本地化服务差

●价格昂贵

浅析深度优先与广度优先的遍历算法(简单实践)_第6张图片
image

由此可见,工具有很多优点,但也有局限,对于有大量数据需求以及比较复杂的需求时候还是需要通过代码实现,建议感兴趣的产品和运营可以稍微了解下 python 。

image

以上,就是我对深度优先与广度优先的遍历算法的个人理解以及部分推荐的三个工具,大数据时代的到来,对数据爬取的需求越来越大,让我们一起学习起来。

你可能感兴趣的:(浅析深度优先与广度优先的遍历算法(简单实践))