《自己动手写网络爬虫》读书笔记——宽度优先爬虫和带偏好的爬虫

  前面只是获取了单个网页内容,在实际中,则使用爬虫程序遍历互联网,把网络中相关的网页全部抓取过来,这也体现了爬虫程序“爬”的概念。

  互联网可以看成一个超级大的“图‘,而每个网页则可以看作是一个”节点“。页面中的链接可以看成是图的”有向边“。因此,可以通过图的遍历的方式对互联网这个”图“进行访问。图的遍历分为宽度优先和深度优先,但深度优先可能会在深度上过于”深”的遍历或者陷入“黑洞”,大多数爬虫都不采用这种方式。此外,在爬取的时候,有时候并不会完全按照宽度优先遍历的方式,而是给待遍历的网页赋予一定的优先级,根据这个优先级进行遍历,这种遍历方式又被称为带偏好的遍历。

  有关于图的宽度遍历的知识这里不予详细介绍,主要看一下宽度优先遍历。

  实际的爬虫项目是从一系列的种子链接开始的,所谓种子链接就相当于宽度优先遍历中的种子节点,只是实际爬虫项目中种子链接可以有多个,而宽度优先遍历中的种子节点只有一个。

  如何定义一个链接的子节点?每个链接对应一个HTML页面或者其他文件(word、excel、pdf等),在这些文件中,只有HTML页面有相应的“子节点”,这些“子节点”就是HTML页面上对应的超链接。这些子节点本身又是一个链接。对于非HTML文档,不能从中提取超链接。因此,可以看作图的“终端”节点。

  整个宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中的“子节点”提取出来,放入队列中以此进行抓取。被处理过的链接需要放入一张表(通常称为Visited表)中,每次处理新链接之前,需要查看这个链接是否已经存在于Visited表中。如果存在,证明链接已经处理过,跳过,不做处理,否则进行下一步处理。整个过程如下图所示:

  宽度优先遍历是爬虫中使用最广泛的一种爬虫策略,之所以使用宽度优先搜索策略,主要原因有三点:

    1)重要的网页往往里种子较近;

    2)万维网的实际深度最多能达到17层,但到达某个网页总存在一条很短的路径,而宽度优先遍历会以最快的速度到达这个网页;

    3)宽度优先有利于多爬虫的合作抓取,多爬虫合作通常弦抓取站内链接,抓取的封闭性很强。

时间: 2024-11-29 03:19:24

《自己动手写网络爬虫》读书笔记——宽度优先爬虫和带偏好的爬虫的相关文章

《自己动手写cpu》读书笔记

本文来自<自己动手写cpu>一书的总结.原来自己看过原作者的<步步惊芯--软核处理器分析>以及其他关于or1200的书.本次粗略浏览了该书,就某些感兴趣的部分详细分析,并总结成此文. 关于5级流水的架构,可以自己去参考<计算机接口>一书.本文重点不在此. 1.如何从rom里面取地址 简化版的最基本的sopc的框图如下: module openmips( input wire clk, input wire rst, input wire[`RegBus] rom_dat

TCP/IP网络编程读书笔记-简单的套接字编程(1)

在linux和windows下都是通过套接字编程进行网络编程.不同的系统上通信有部分差别,现在刚开始学习,给自己学习的时候一个总结. 一,socket函数的套接字步骤 第一,linux网络编程中接受连接请求(服务器端)套接字的四个步骤: 1)调用socket函数创建套接字 2)调用bind函数分配IP地址和端口号 3)调用listen函数转为可接收请求状态 4)调用accept函数受理连接请求 第二,linux网络编程中请求连接(客户端)套接字的两个步骤: 1)调用socket函数创建套接字 2

POJ读书笔记2.1 —— 鸡兔笼带

http://blog.csdn.net/pipisorry/article/details/36433305 问题描写叙述 一个笼子里面关了鸡和兔子(鸡有2仅仅脚.兔子有4仅仅脚.没有例外). 已经知道了笼子里面脚的总数a.问笼子里面至少有多少仅仅动物,至多有多少仅仅动物. 输入 第1行是測试数据的组数n,后面跟着n行输入.每组測试数据占1行.每行一个正整数a (a < 32768) 输出 输出包括n行,每行相应一个输入,包括两个正整数.第一个是最少的动物数.第二个是最多的动物数,两个正整数用

《自己动手写网络爬虫》读书笔记——队列与集合

队列: 在爬虫程序中, 用到了广度优先搜索(BFS)算法. 这个算法用到的数据结构就是队列. 在python中提供了collection.deque用来实现了queue的相关操作,其官方实力如下: 集合: 在爬虫程序中, 为了不重复爬那些已经爬过的网站, 我们需要把爬过的页面的url放进集合中, 在每一次要爬某一个url之前, 先看看集合里面是否已经存在. 如果已经存在, 我们就跳过这个url; 如果不存在, 我们先把url放入集合中, 然后再去爬这个页面. Python提供了set这种数据结构

锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]

1.表单验证插件Validation   2.表单插件Form 3.动态事件绑定插件livequery 可以为后来的元素绑定事件 类似于jQuery中的live()方法 4.jQuery UI   5.jQuery Cookie   6.遮罩层插件:thickbox 7.编写jQuery插件 <1>编写插件的目的:给已经有的一些列方法或函数做一个封装,一遍在其他地方使用,方便后期维护和提高开发效率. <2>三种类型的插件 a:封装对象方法的插件 jQuery.fn.extend()

swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方

新建一个类Network import UIKit //NSURLSession 的使用过程: // //构造 NSURLRequest //确定 URL //确定 HTTP 方法(GET.POST 等) //添加特定的 HTTP 头 //填充 HTTP Body //驱动 session.dataTaskWithRequest 方法,开始请求 //(5)设置 SSL 证书钢钉.在我们调用 HTTPS 协议的时候,事先把 SSL 证书存到 App 本地,然后在每次请求的时候都进行一次验证,避免中

Unix 网络编程 读书笔记2

第三章 套接字编程简介 每一个 Socket 都用一个半相关描述:{协议,本地地址,本地端口}一个完整的 Socket 则用一个相关描述{协议,本地地址,本地端口,远程地址,远程端口}每一个 Socket 有一个本地的唯一 Socket 号,由操作系统分配. 1.struct sockaddr这个结构用来存储套接字地址.数据定义: struct sockaddr { unsigned short sa_family; /* address族, AF_xxx */ char sa_data[14]

Unix 网络编程 读书笔记3

第四章 基本tcp 套接口编程 注意区分AF_XXX 和PF_XXX,AF代表address family, PF代表protocol family. 1 socket 函数 2 connect 函数 3 bind 函数 4 listen 函数 注:主动.被动 与 服务器.客户端没有明确的对应关系 linux中定义backlog为 完成队列的最大个数 5 accept 函数

Unix 网络编程 读书笔记

第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64.? IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32位的地址空间,理论的内存使用限制为4G.? PL64 ● 表示pointer/long两种数据类型是64位(8个字节),提供64位地址空间,使用内存超过4G(达2^60bytes=1EB). more infoabout IPL32 and PL64, please refer to http://www-3