前言
爬虫要爬取的信息主要来自于网页加载的内容,有必要了解一些网页的知识。
当我们在浏览器网址栏输入一个网址——URL,经过TCP/IP协议簇的处理,这个网址请求的信息就被发送到URL对应的服务器,接着服务器处理这个请求,并将请求的内容返回给浏览器,浏览器便显示或者下载URL请求相应的资源。这是前一篇博客所述。
在这一篇博客,笔者尝试说明浏览器是如何显示出这个页面的。如下
HTML
HTML的含义
与超文本相对的是线性文本。线性,即直线关系,成比例。一本书,从第一页到最后一页,呈现直线关系;一本书的书签,从第一章转跳至第十章,呈现的是非线性关系。对于线性的计算机文件,不能直接从从一个位置的文件非线性地转至另一个位置的文件,这中间是要经过一定的顺序;相反,超文本之间的关系是非线性的,从一个HTML文件可以直接连接至另一个HTML文件。促成这种连接的正是是超文本链接,超文本链接就是超链接,上一篇的URL就是超链接的一种,电子书中的书签也是超链接的一种。
HTML是一门语言,常用于编写网页,HTML文件是超文本的一种形式。以下是一些名称的解释,以辅助理解,不必太在意于严格的定义。
- HTML(HyperText Mark-up Language):超文本标记语言
- 超文本:HyperText,用超链接的方法,将不同空间的文字信息组织在一起的网状文本
- 链接:link,从一个文档指向其它文档或从文本锚点(anchor)指向某已命名位置的链接
- 锚点:anchor,是网页制作中超级链接的一种,又叫命名锚记。命名锚记像一个迅速定位器一样是一种页面内的超级链接
- 超链接:hyperlink,它是一种允许我们同其他网页或站点之间进行连接的页面元素
- 超文本链接:Hypertext link,就是超链接。是指用文字链接的形式来指向一个页面
- 线性:linear,指量与量之间按比例、成直线的关系,在数学上可以理解为一阶导数为常数的函数
树
树的概念
树的结构是很简单的,平时留心观察即可知道树为何是“直”的。从第一个分叉开始这树就是由无数的“开叉”结构组成,直至最微小的枝芽。怎么简单怎么来,数学上的描述不管。下面的性质和定义来自《用Python解决数据结构和算法》
树的性质
相关术语在“定义1”里面有解释,以分类树为例此处有图片
- 树是分层的,分层的意思是树的顶层部分更加宽泛一般而底层部分更加精细具体。在图1中,最上层是“界”,它下面的一层(上层的子层)是“门”,然后是“纲”等等。
- 一个节点的子节点(node)和另一个节点的子节点(children)是完全独立的。如图1,“猫属”有两个子节点“家生”和“野生”,“蝇属”中也有一个“家生”, 但它和“猫属”中的“家生”是完全不同而且相互独立的。
- 树的每个叶节点(leaf)都是不同的。如图1,对每一种动物,我们都可以从根节点(root)开始沿着一条特定的路径找到它对应的叶节点,并把它和其他动物区分开, 例如对于家猫
- 树下层的所有部分(子树Subtree)移动到树的另一位置而不影响更下层的情况。如图2,我们可以将所有标注/etc的子树从根节点下移动到usr/下面但是对httpd的内容及其子节点的内容不会有影响。

图1 一些动物的分类树

图2 一小部分Unix文件系统的分层情况
定义1
树是节点和连接节点的边的集合
这个定义简单粗暴,但蕴含的东西不少。以下是一些相关的东西,都是些抽象的概念,将其类比成枝节叶可以吧
- 节点(Node):树的基本组成
- 边(Edge):树的基本组成,连接两个节点。。每个节点(除了根节点)都有且只有一条与其他节点相连的入边(指向该节点的边),每个节点可能有许多条出边(从该节点指向其他节点的边)。
- 根节点(Root):树中唯一没有入边的节点
- 路径(Path):路径是由边连接起来的节点的有序排列
- 子节点集(Childern):当一个节点的入边来自于另外一个节点时,称前者为后者的子节点。同一个节点的所有子节点构成子节点集
- 父节点(Parent):一个节点是它的所有出边连接的节点的父节点。
- 兄弟节点(Sibling)同一节点的所有子节点胡伟兄弟节点
- 子树(Subtree):子树是一个父节点的某个子节点的所有边和后代节点所构成的集合
- 叶节点(LeafNode):没有子节点的节点称为叶节点
- 层数(Level):一个节点的层数是指从跟节点到该节点的路径的边的数目,定义根节点层数为0
- 高度(Height):树的高度等于所有节点层数的最大值
定义2
每棵树为空,或者包含一个根节点和0个或多个子树,其中每个子树也符合这样的定义
这个定义巧妙,用到递归只能“巧妙”了。
HTML的构成
HTML是由一系列的元素组成,元素由首尾标签和其中的内容组成,学习HTML就要学习那一堆元素。标签表示元素的起始和结束。下面是一个简单的HTML网页。例如代下面代码中
<li>List item one</li>是元素,<li>是首标签,</li>是尾标签,'List item one'是内容。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>simple</title></head><body><h1>A simple web page</h1><ul>

