美文网首页Java技术分享Java 杂谈
【爬虫】广度优先遍历抓取数据概述

【爬虫】广度优先遍历抓取数据概述

作者: 墨迹嘿嘿 | 来源:发表于2019-01-21 22:02 被阅读15次

这次都是一些纯语言的表达,可能会有点啰嗦,或者有点枯燥,也是对爬虫的一些小小的见解,可能只是一些常见话,哈哈,还是耐心的写完。

网络爬虫一般有两个基本的任务,发现包含有效的URL地址信息和下载网页

为了获取到网页,通常有一个初始的URL地址,然后通过地址去解析网页中的超链接,访问到页面信息。正所谓,所有的爬虫程序的工作都是从一个种子开始的,把所有的种子传递给集合作为参数传递给网络爬虫。

网络爬虫的整体执行流程:

1)确定一个(多个)种子网页

2)进行数据内容的提取

3)将网页中的关联网页链接进行提取出来

4)将尚未爬去的关联网页内容放入到一个队列中

5)从队列中取出一个待爬去的页面,判断之前是否爬过

6)把没有爬过的内容进行爬取,并进行之前的重复操作

7)直到队列中没有新的内容,爬虫执行结束

image image

这样进行爬虫时,一般会有一些概念必须知道的:

广度优先遍历:指网络爬虫会先抓取起始网页中链接的所有网页,然后选择其中的一种链接网页,继续抓取在此网页中的链接的所有网页。这个方法最常用,也可以进行网络爬虫并行处理,提高爬去数据效率。

广度优先遍历就是像金字塔一样,首先抓取第一层数据,作为种子节点,然后遍历第二层数据,接着遍历第三层数据,等等以此类推

在使用广度优先遍历的时候可以使用队列来存储下一个需要抓取的节点地址URL,然后通过多线程去抓取下一个节点数据,这样就可以提高爬虫的效率

image

从一个已知的种子链接开始宽度的遍历网页,为了知道哪些网页可以进行抓取,需要将新发现的网页存储到一个URL队列中,使用ArrayDeque实现一个队列,为了避免重复访问一个网址,需要将遍历过的网页URL存入到历史表中,使用HashSet实现这个历史表。如果使用Queue来实现ToDo,则对每一个增加到ToDo的元素都需要进行对象封装,因为ArrayQueue底层采用数组实现,所以增加到ArrayQueue的元素不需要对象封装,ArrayDeque性能比Queue更好,所以todo采用ArrayDeque实现。

image

在爬虫需要注意的一些事项:

1:分任务分包时,有可能出现线程安全问题

2:数据重复问题

3:频率控制问题(尽量不要过快,有可能被发爬虫干掉)

4:对象的创建和销毁问题

5:没有考虑到的所有问题


1.jpg

相关文章

网友评论

    本文标题:【爬虫】广度优先遍历抓取数据概述

    本文链接:https://www.haomeiwen.com/subject/ygohjqtx.html