
1.2.2 HTTP请求和响应
1.HTTP请求
HTTP请求是由客户端向服务器发送的相关数据,其可以分为4部分内容,即请求方法(Request Method)、请求网址(Request URL)、请求头(Request Headers)和请求体(Request Body)。
1)请求方法
当在浏览器中输入URL并按Enter键时,便会以某种请求方法发起一个HTTP请求,常用的请求方法如表1-1所示。
表1-1 常用的请求方法

2)请求网址
请求网址,即统一资源定位符URL,通过请求网址可以唯一确定所请求的资源。
URL通常由4部分组成,即协议、主机、端口和路径,其一般的语法格式如下:
protocol://hostname[:port]/path/[;parameters][?query]#fragment
其中,protocol表示协议;hostname表示主机名;port表示端口号;path表示路径;parameters表示参数;query表示查询;fragment表示信息片断。
3)请求头
由于HTTP是一种无状态协议,所以需要在请求头中添加相关的首部字段,使服务器明确客户端的目的,其常用的首部字段包括Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Cookie、Expect、From、Host、Proxy-Authorization、Referer和User-Agent等。
4)请求体
请求体的内容一般通过请求方法POST所提交的数据获得。
2.HTTP响应
HTTP响应是由服务器返回客户端的相关数据,其可以分为3部分内容,即响应状态码(Status Code)、响应头(Response Headers)和响应体(Response Body)。
1)响应状态码
响应状态码如表1-2所示,共分为5种:1xx,表示临时响应,并需要客户端继续执行操作;2xx,表示服务器成功处理了请求;3xx,表示重定向,需要进一步操作以完成请求;4xx,表示客户端的请求可能出错,影响了服务器的处理;5xx,表示服务器在尝试处理客户端的请求时发生了内部错误,而这些错误可能是服务器本身的错误,并不是客户端的请求出错。
表1-2 响应状态码

续表

续表

2)响应头
响应头包含了服务器对客户端请求的应答信息,其常用的首部字段包括Age、Expires、ETag、Last-Modified、Location、Server、Set-Cookie、Transfer-Encoding和X-Content-Type-Options等。
3)响应体
根据所选择资源的类型,服务器返回客户端的相关数据全部在响应体中。正因为如此,在编写网络爬虫时,主要通过响应体获取网页的源代码或JSON数据,并可以进一步从中提取所需要的内容。
3.HTTP请求和响应的过程
下面通过访问一个网站来具体了解HTTP请求和响应的过程。
首先打开Chrome浏览器,右击并选择“检查”即可打开浏览器的开发者工具面板,然后在网址栏输入URL“http://www.oldxia.com”并按Enter键,此时就可以看到该URL所对应的网站页面了,而在这个过程中,浏览器向网站所在的服务器发送了一个请求,服务器接收到这个请求后进行相应处理,并返回响应的结果,包括HTML、图片、声频或视频等,最后浏览器再进行解析,这样就可以将网页的内容展现出来了。
单击开发者工具面板中的Network选项,该选项由5部分组成,如图1-1所示,一是Controls(控制器),用于控制Network选项的外观和功能;二是Filters(过滤器),用于控制Requests Table(请求列表)的具体显示内容;三是Overview(概览),用于显示HTTP请求和响应的时间轴信息;四是Requests Table(请求列表),用于按资源获取的先后顺序显示所有获取的资源信息;五是Summary(概要),用于显示总的请求数、数据传输量和加载时间等信息。
而Requests Table(请求列表)中的每条资源信息都表示进行了一次HTTP请求和响应。
下面再来详细了解Requests Table(请求列表)中每列的具体含义,如表1-3所示。

图1-1 Network选项
表1-3 Requests Table中列的含义

此时,单击第1条资源www.oldxia.com,进而可以查看该资源的详细情况,其由6部分组成,如图1-2所示。
1)Headers
该部分表示资源的HTTP头信息,其包含6部分内容,具体如下:
(1)General,该信息表示HTTP请求和响应过程中的基本信息,具体如表1-4所示。
表1-4 General


图1-2 资源的详细情况
(2)Response Headers,该信息表示响应头,其常用的首部字段如表1-5所示。
表1-5 Response Headers中常用的首部字段

(3)Request Headers,该信息表示请求头。请求头是HTTP请求的重要组成部分,在编写网络爬虫时,多数情况下需要设置请求头,其常用的首部字段如表1-6所示。
表1-6 Request Headers中常用的首部字段

(4)Query String Parameters,该信息表示发起GET请求时所传递的参数。
(5)Form Data,该信息表示发起POST请求时所传递的参数。
(6)Request Payload,该信息表示发起POST请求时所传递的参数,数据格式为JSON。
这里需要注意的是,Form Data和Request Payload中的数据就是请求体(Request Body)。
2)Preview
根据所选择资源的类型显示相对应的预览信息。
3)Response
根据所选择资源的类型显示相对应的响应内容。该响应内容就是响应体(Response Body),也是解析的目标。
4)Initiator
显示请求的依赖关系,以及发出请求的原因。
5)Timing
显示资源在整个请求生命周期中各部分所花费的时间。
6)Cookies
显示所选择资源请求和响应过程中存在的Cookie信息。
4.HTTP请求和响应过程中的Cookie
单击开发者工具面板中的Application选项,然后单击该选项左侧Storage中的Cookies,即可查看客户端中的Cookie,如图1-3所示。

图1-3 Application选项
表1-7中的每条信息表示1条Cookie,其所对应每列的具体含义如表1-7所示。
表1-7 Cookie中列的含义
