在实际项目中,我们使用爬虫遍历互联网,把网络中相关的网页全部抓取过来,这也体现了爬虫的特点。爬虫爬行的过程是这样子的:互联网中每一个页面看作是一个节点,页面中的链接可以看成图的有向边。所以能用遍历的方式对互联网进行访问。
一提到图的遍历,很容易就是宽度优先遍历和深度优先遍历。
但是深度优先遍历可能会在深度上过深地遍历或者陷入黑洞,大部分爬虫不采用这种方式。但是宽度优先遍历也不是完全的宽度优先,而是采用对宽度优先的网页赋予一定的优先级。也就是通常我们说的带有偏好的宽度遍历。
图的宽度优先
简述:图的宽度优先遍历(BFS)算法是一个分层搜索的过程,和树的层序遍历算法相同,在图中选中一个节点,作为起始点,然后按照层次遍历的方式,一层一层访问。
思想:(1)节点A入队
(2)当队列非空时候继续入队
(3)队满,出队列,获得头节点A,访问A,并标记A已经被访问了
(4)查找顶点A的第一个邻接节点A1
(5)如果A1没有访问过,进队
(6)继续查找A的其他邻接节点,转(5)继续,如果所有邻接节点都访问过了,转(2)
接下来举个例子,来源于自己动手写爬虫这本书,实际上,我的文章也是这本书的个人心得而已,大家都是学习的菜鸟。
遍历过程如下:
操作 | 队列元素 |
初始 | 空 |
A入队 | A |
A出队 | 空 |
BCDEF入队 | BCDEF |
B出队 | CDEF |
C出队 | DEF |
D出队 | EF |
E出队 | F |
H入队 | FH |
F出队 | H |
G入队 | HG |
H出队 | G |
I入队 | GI |
G出队 | I |
I出队 | 空 |
总结:在表1.2所示的遍历过程,出队列的节点顺序既是图的宽度优先遍历的访问顺序,由此可以看出,图1.3所示的宽度优先遍历顺序为:A-〉B-〉C-〉D-〉E-〉F-〉H-〉G-〉I 。这里是一个基础,我们做什么事情都要从基础做起嘛,不能心急