目录
简介:
- 了解并能够复述浏览器加载网页的过程
- 熟悉 HTTP 的基本原理,能够归纳 URL 格式、HTTP 请求格式和 HTTP 响应格式
网络爬虫请求网页的过程可以理解为用户使用浏览器加载网页的过程。这个过程其实是
向
Web
服务器发送请求的过程,即浏览器向
Web
服务器发送请求,
Web
服务器将响应内容以
网页形式返回给浏览器。因此,了解浏览器与
Web
服务器之间的通信方式和交互过程,理解
网页的组成、结构、分类、数据格式,能加深对网络爬虫的理解。本章将针对网页请求原理
的相关知识进行讲解。
2.1 浏览器加载网页的过程
当我们在浏览器的地址栏中输入百度首页的网址,按
Enter
键后可以看到浏览器中显示了
百度首页。那么,我们在按
Enter
键之后究竟发生了哪些事情呢?
简单来说,在我们按
Enter
键后,浏览器经历了以下
4
个过程。
(
1
)浏览器通过域名系统(
Domain Name System
,
DNS
)服务器查找百度服务器对应的
IP
地址。
(
2
)浏览器向
IP
地址对应的
Web
服务器发送
HTTP
请求。
(
3
)
Web
服务器接收
HTTP
请求后进行处理,向浏览器返回
HTML
页面。
(
4
)浏览器对
HTML
页面进行渲染并呈现给用户。
以上过程其实就是浏览器加载网页的过程,具体如图
2-1
所示。
在图
2-1
中,浏览器从
Web
服务器加载网页的过程是
HTTP
请求响应的过程。
2.2 HTTP 基础
2.2.1 URL 简介
URL
(
Uniform Resource Locator
)又称
URL
地址,表示统一资源定位符,用于指定因特
网上某个资源的位置。
URL
地址的语法格式如下。
scheme://[user]:[password]@host:[port]/path;[params]?[query]#[frag]
上述语法格式中,方括号包括的内容为可选项,关于
URL
地址的语法格式中各选项的说
明如表
2-1
所示。
表 2-1 URL 地址的语法格式中各选项的说明
URL
地址中比较重要的选项为
scheme
、
host
、
port
和
path
,关于这
4
个选项的介绍如下。
1.scheme
scheme
用于规定如何访问指定资源的主要标识符,它会告诉负责解析
URL
的应用程序应
该使用什么传输协议。常见的传输协议如表
2-2
所示。
表 2-2 常见的传输协议
2.host
host
指存放资源的主机名或者
IP
地址。它用于标识互联网上的唯一一台计算机,保证用
户可以高效地从成千上万台联网的计算机中找到这台计算机。
IP
地址分为
IPv4
(互联网协议第
4
版)和
IPv6
(互联网协议第
6
版)。目前较通用的
IP
地址是
IPv4
,它通常以“点分十进制”表示成“
a.b.c.d
”的形式,如
202.108.22.5
就是一个
IP
地址。不过
IP
地址不方便被人们记忆,因此人们发明了域名,并通过
DNS
服务器将域名和
IP
地址相互映射,例如
.baidu.com
就是
202.108.22.5
对应的域名。
3.port
port
用于标识在一台计算机上运行的不同程序,它与主机地址以“
:
”进行分隔。每个网
络程序都对应一个或多个特定的端口号,例如,采用
HTTP
的程序默认使用的端口号为
80
,
采用
HTTPS
的程序默认使用的端口号为
443
。
4.path
path
是由
0
个或多个“
/
”隔开的字符串,一般用于指定本次请求的资源在服务器中的位置。
一个典型的
URL 地址示例如图 2-2 所示。
图 2-2 URL 地址示例
2.2.2 HTTP 和 HTTPS
用户使用浏览器访问某个网站时,浏览器会将请求发送到
Web
服务器,而
Web
服务器接
收到请求后会进行响应,并将响应结果返回浏览器。为了保证在浏览器和
Web
服务器之间传
输数据的可靠性,浏览器和
Web
服务器必须遵守一定的协议。对于网络爬虫来说,它采集的
页面通常使用的是
HTTP
和
HTTPS
。下面分别对这两种协议进行介绍。
1.HTTP
HTTP
全称为超文本传输协议(
Hyper Text Transfer Protocol
),它用于将
Web
服务器的超
文本资源传送到浏览器中。
HTTP
能够高效、准确地传送超文本资源,但浏览器与
Web
服务器的连接是一种一次性
连接,它限制每次连接只能处理一个请求。这意味着每个请求都是独立的,服务器返回本次
请求的应答后便立即关闭连接,下次请求再重新建立连接。
016
Python 网络爬虫基础教程
2.HTTPS
HTTPS
全称为超文本传输安全协议(
Hypertext Transfer Protocol Secure
),该协议在
HTTP
的基础上添加了安全套接字层(
Secure Socket Layer
,
SSL
),数据在传输过程中主要通过数字
证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
2.2.3 HTTP 请求格式
浏览器向
Web
服务器发送的信息是一个
HTTP
请求,每个
HTTP
请求由请求行、请求头、
空行以及请求数据(有的也称为请求体)这
4
个部分组成,
HTTP
请求的格式如图 2-3 所示。
图 2-3 HTTP 请求的格式
下面是通过浏览器访问百度百科页面中的词条
python
时发送的请求信息,具体如下。
1 GET /item/Python/407313 HTTP/1.12 Host: www.baidu.com3 Connection: keep-alive4 Pragma: no-cache5 Cache-Control: no-cache6 sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"7 sec-ch-ua-mobile: ?08 Upgrade-Insecure-Requests: 19 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36......10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,......11 Sec-Fetch-Site: same-origin12 Sec-Fetch-Mode: navigate13 Sec-Fetch-User: ?114 Sec-Fetch-Dest: document15 Referer: https://baike.baidu.com/16 Accept-Encoding: gzip, deflate, br17 Accept-Language: zh-CN,zh;q=0.9,fr;q=0.818 Cookie: zhishiTopicRequestTime=1626326884529; ......
在上述的请求信息中,第
1
行代码是请求行,第
2
~
18
行代码是请求头信息。需要注意
的是,即使请求信息中没有请求数据,也必须在末尾加上空行。
下面分别对请求行和请求头进行介绍。
1.请求行
上述请求信息中,请求行的内容具体如下。
GET /item/Python/407313 HTTP/1.1
在请求行中,
GET
表示向服务器请求网络资源时所使用的请求方法,
/item/Python/407313
表示请求的
URL
地址,
HTTP/1.1
表示使用的
HTTP
版本。
常用的请求方法包括
GET
和
POST
,其中
GET
用于请求服务器发送某个资源,
POST
用
第 2 章 网页请求原理
017
于向服务器提交表单或上传文件,表单数据或文件的数据会包含在请求体中。请求方法
GET
和
POST
的区别主要体现在两个方面,具体如下。
(
1
)传输数据大小。
GET
请求方法通过请求参数传输数据,最多只能传输
2KB
的数据;
POST
请求方法通过实体内容传输数据,传输的数据大小没有限制。
(
2
)安全性。
GET
请求方法的参数信息会在
URL
中明文显示,安全性比较低;
POST
请
求方法传递的参数会隐藏在实体内容中,用户看不到,安全性更高。
值得一提的是,不同
HTTP
版本支持的请求方法有所不同。以目前使用较为广泛的
HTTP 1.0
和
HTTP 1.1
为例,
HTTP 1.0
完善了请求
/
响应模型,并补充定义了
GET
、
POST
、
HEAD
等
3
种请求方法;
HTTP 1.1
在
HTTP 1.0
的基础上进行了更新,新增了
OPTIONS
、
PUT
、
DELETE
、
TRACE
、
CONNECT
等
5
种请求方法。
2.请求头
请求行紧挨的部分就是若干个请求头信息,请求头主要用于说明服务器要使用的附加信
息,如客户端可以接收的
数据类型、压缩方法、客户端可以接受的字符集类型。观察上述示
例的请求头可知,每一个请求头均由一个头字段名称和一个值构成,头字段与值之间以冒号
分隔。
关于请求头中的常用字段的介绍如下。
(
1
)
Host
。
Host
用于指定被请求资源的服务器主机名和端口号。
(
2
)
User-Agent
。
User-Agent
用于标识客户端身份。通常页面会根据不同的
User-Agent
信息自动作出适配,
甚至返回不同的响应内容。
(
3
)
Accept
。
Accept
用于指定浏览器或其他客户端可以接受的多用途互联网邮件扩展(
Multipurpose
Internet Mail Extensions
,
MIME
)文件类型。服务器可以根据该字段判断并返回适当的文件格式。
(
4
)
Referer
。
Referer
用于标识当前请求页面的来源页面地址,即表示当前页面是通过此来源页面里的
链接进入的。
(
5
)
Accept-Charset
。
Accept-Charset
用于指定浏览器可以接受的字符集类型。早期版本的
HTTP 1.1
规定了一
个默认的字符集(
ISO-8859-1
),目前每一种内容类型都有自己的默认字符集。
(
6
)
Cookie
。
Cookie
是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以
用来实现模拟登录。
(
7
)
Content-Type
。
Content-Type
用于指出实体内容的
MIME
文件类型,例如,
text/html
代表
HTML
格式,
image/gif
代表
GIF
图片,
application/json
代表
JSON
类型,更多文件类型可以查看
Content-Type
对照表。
2.2.4 HTTP 响应格式
Web
服务器返回给浏览器的响应信息由
4
个部分组成,分别是状态行、响应头、空行以
018
Python 网络爬虫基础教程
及响应正文。
HTTP
响应的格式如图
2-4
所示。
下面是通过浏览器访问百度百科中词条
python
时,
Web
服务器返回的响应信息,具体内
容如下。
1 HTTP/1.1 200 OK2 Connection: keep-alive3 Content-Encoding: deflate4 Content-Security-Policy-Report-Only: default-src https:......5 Content-Type: text/html; charset=UTF-86 Date: Thu, 15 Jul 2021 06:25:42 GMT7 Server: Apache8 Vary: Accept-Encoding9 Transfer-Encoding: chunked1011 <html>12 <head>13 <meta charset="UTF-8">14 <meta http-equiv="X-UA-Compatible" content="IE=Edge" />......
上述响应信息中,第
1
行代码是状态行,第
2
~
9
行代码是响应头,第
10
行是空行,第
11
~
14
行代码是响应正文。需要注意的是,即使响应信息中没有响应正文,也必须在末尾加
上空行。
下面分别对状态行、响应头和响应正文进行介绍。
1.状态行
上述响应信息的状态行的具体内容如下。
HTTP/1.1 200 OK
在状态行中,
HTTP/1.1
表示
HTTP
的版本号,
200
表示响应状态码,
OK
表示响应状态码
的简短描述。
响应状态码代表服务器的响应状态,它的作用是告知浏览器请求
Web
资源的结果,如请
求成功、请求异常、服务器处理错误等。响应状态码及说明如表
2-3
所示。
表 2-3 响应状态码及说明
2.响应头
上述响应信息中,状态行下面的部分便是若干个响应头信息。响应头的格式与请求头的
格式相同。关于响应头中的常用字段及常用值的介绍如下。
(
1
)
Cache-Control
:
must-revalidate
、
no-cache
、
private
。
Cache-Control
表示服务器告知浏览器当前的
HTTP
响应是否可以缓存,取值为
must
revalidate
表示在一个缓存过期之后,不能直接使用这个过期的缓存,必须检验之后才能使用;
取值为
no-cache
表示浏览器可以缓存资源,每次使用缓存资源前都必须重新验证其有效性;
取值为
private
表示响应只能被单个用户缓存,不能作为共享缓存。
(
2
)
Connection
:
keep-alive
、
closed
。
Connection
表示浏览器是否使用持久
HTTP
连接,取值为
keep-alive
表示使用持久连接;
取值为
closed
表示不使用持久连接。
(
3
)
Content-Encoding
:
gzip
、
compress
、
identity
。
Content-Encoding
表示服务器对特定媒体类型的数据进行压缩,取值为
gzip
表示采用
Lempel-Ziv
压缩算法;取值为
compress
表示采用
Lempel-Ziv-Welch
算法;取值为
identity
表
示数据未经压缩或修改。
(
4
)
Content-Type
:
text/html;charset=UTF-8
。
Content-Type
表示服务器告知浏览器实际返回的内容的类型,取值为
text/html;charset=
UTF-8
表示服务器返回资源文件的类型为
text/html
,字符编码格式为
UTF-8
。
3.响应正文
响应正文是服务器返回的具体数据,常见的数据是
HTML
源代码。浏览器在接收到
HTTP
响应后,会根据响应正文的不同类型进行不同的处理。如果响应正文是
DOC
文档,那么浏览
器会借助安装在本机的
Word
程序打开这份文档;如果响应正文是
RAR
压缩文件,那么浏览
器会弹出一个下载窗口让用户下载解压软件;如果响应正文是
HTML
文档,那么浏览器会在
自身的窗口中展示该文档