目录
3.1 HTTP协议简介
用户在客户端(web浏览器)请求某个url时,该请求会被发送到web服务器,web服务器接收到客户端的请求后,将响应请求,并向客户端传送数据.为保证数据在客户端和web服务器之间传输信息的可靠性,客户端和web服务器必须遵守一定的标准或规则,其中最为重要的便是HTTP(Hyper Text Transfer Protocol)协议.
HTTP协议,即超文本传输协议,是web系统最核心的内容,用于从web服务器传输数据到客户端.
text/html:HTML格式的文本文档
image/jpeg:JPEG格式的图片
image/png:PNG格式的图片
image/webp:无损格式的图片
image/gif:GIF格式的图片
text/plain:普通的ADCII文本文档
application/json:JSON格式的内容
video/mp4:MP4格式的视频
video/quicktime:Apple的QuickTime视频(MOV格式的视频)
video/x-msvideo:AVI格式的视频
video/x-flv:FLV格式的视频
HTTP是应用层协议,其数据在网络中传输需要依赖于TCP/IP协议.TCP,即传输控制协议,用于保证数据在两台主机之间传输的可靠性,TCP实行"顺序控制"(数据会按照发送的顺序到达)和"重发控制" (传输数据时,为每个数据包启动一个超时定时器,如果定时器在超时之前,接收方确认了信息,则释放数据包占用的缓存区,否则,发送方就重新发送这个数据包儿).IP,即网际协议,负责将数据包从源发送到最终的目标计算机,但不提供可靠性传输,也不具备"重发控制"TCP/IP协议通常被认为是具有4个层次的系统,数据链路层,网络层,传输层和应用层,每个层次负责不同的功能.
应用层 (HTTP) |
传输层 (TCP) |
网络层 (IP) |
数据链路层 (操作系统,硬件驱动设备,网卡等) |
- 应用层:改成位于计算机网络体系结构的最上层,其他三层为其服务.日常开发以及使用的应用软件便处于应用层,如使用浏览器访问网页.TCP/IP协议的应用架构多采用客户端/服务端(Client/Server)模型,即客户端(如浏览器)向服务端(服务器)发送请求,服务端向客户端传送数据.因此,可以看出HTTP协议处于应用层.
- 传送层:该层用于保证客户端与服务端之间的数据传输.
- 该层用于选择合适的网间路由和交换节点,处理网络中流动的数据包(数据传输的最小单位)
- 数据链路层:该层又称为网络接口层,用于处理连接网络的硬件部分,包括操作系统,硬件驱动设备,网卡和光纤等.
3.2 URL
在进行网络通信前,需要通过URL建立客户端与服务器之间的连接.
URL的组成部分:
协议:URL使用的协议为HTTP,在HTTP后面跟"//".有很多网站,从安全的角度考虑,使用的是安全超文本传输协议HTTPS.HTTPS在HTTP的基础上加入了安全套接层SSL,SSL主要用于客户端和服务器之间的身份认证和数据加密传输,其支持使用X509数字认证.如使用HttpClient处理一些HTTPS对应的URL时,需要创建定制的SSL连接
域名:www.baidu.com的url域名为www.****.com.如果没有域名,则必须有客户端可以访问到的主机ip地址,例如在命令行cmd中,使用ping www.baidu.com获取到网站的ip地址,在浏览器中输入该ip地址也能访问网页.
端口:位于域名的后面,域名和端口采用":"分隔.如果使用默认端口80,则URL可以省略端口信息
路径:由多个"/"隔开的字符串组成,表示主机上的一个目录或文件地址.
参数:以"?"开始,采用name=value的格式,URL的参数可以有多个,参数之间用一个"&"隔开.如在某购物网站中搜索关键词"手机",得到下面一串URL,其中参数为"keyword"=手机&enc=utf-8&wq=手机&pvid=101d1b98589b4
3.3 报文
报文是指以一种格式组织起来的数据,分为请求报文和响应报文.其中,请求报文包括请求方法,请求的url,版本协议以及请求头信息.响应报文包括请求协议,响应状态码,响应头信息和响应内容.
3.4 HTTP请求方法
在客户端像服务器发送请求时,需要确定使用的请求方法,请求方法表明了对URL指定资源的操作方式,服务器会根据不同的请求方法进行不同的响应.在HTTP/1.1中,共定义了8种请求方法
- GET:发送请求获取服务器上的某特定资源,例如:HTML文档,PDF和图片等.GET是常见的请求方法,但安全性较低,大多数网络爬虫,都采用GET获取网络资源
- POST:像服务器提交数据,请求服务器进行处理.在通常情况下,表单提交操作需要使用POST
- HEAD:与GET类似,只会从服务器获取资源的头信息,不能获取响应内容.
- PUT:使用客户端向服务器传送的数据取代指定的内容.
- DELETE:请求服务器删除制定资源
- CONNECT:在客户端配置代理的情况下,使用CONNECT建立客户端与服务器之间的联系
- OPTIONS:询问服务器支持的请求方法,允许客户端查看服务器的性能.
- TRACE:对可能经过代理服务器传送到服务器上的报文进行追踪.
目前,这8种请求方法使用较多的是GET和POST,另外需要注意的是这些请求方法的名称是区分大小写的.
3.5 HTTP状态码
HTTP的状态码由3位数字组成,描述了客户端向服务器请求过程中发生的状况.状态码的第一个数字描述了状况类型.HTTP状态码由5中类型
数字 | 类型 | 描述 |
1XX | 信息性状态码 | 服务器收到请求,需要请求者继续执行操作 |
2XX | 响应成功状态码 | 客户端的请求成功并被服务器处理,返回响应内容 |
3XX | 重定向状态码 | 客户端请求的URL呗转移到新的URL,需要进行附加操作以完成请求 |
4XX | 客户端的错误状态码 | 客户端请求的语法错误或网页不存在 |
5XX | 服务器端错误状态码 | 服务器在处理请求时发生错误 |
- 200:表叔客户端发送的其请求已被服务器正常处理.
- 204:表示客户端发送的请求已被服务器正常处理,但在返回的响应报文中不包含实体的主体部分
- 301:永久性重定向,表示请求资源已被分配到新的URL
- 302:临时性重定向,表示请求资源已被临时分配到新的URL,希望用户能使用新的URL访问.比如登录某网站后会通过302跳转到登录后的主页
- 303:临时重定向,告知客户端请求的资源存在另一个URL,应使用GET方法定向获取请求资源
- 403:表示客户端的请求被服务器拒绝,一般不说明拒绝的原因.使用网络爬虫短时间内获取大量数据时,会被服务器认定为攻击行为,服务器可能产生拒绝行为,同时本机IP也会被封.
- 404:表示服务器无法找到URL对应的资源,通常服务器会返回一个实体,以便在客户端展示给用户.
- 500:表示在服务器执行请求时发生了错误,也有可能是web应用存在bug或临时故障
- 503:表示服务器暂时处于超负载或正在进行停机维护状态,无法处理请求.出现状态码503的界面,其提示信息为"No server is available to handle this request".
3.6 HTTP信息头
HTTP信息头,也称头字段和首部.是构成HTTP报文的要素之一,具有传递额外重要信息的作用.HTTP信息头通常包括4类:通用头,请求头,响应头和实体头.其中请求头和响应头分别只在请求信息和响应信息中出现,而通用头和实体头会在其请求信息和响应信息中都可出现.只有在消息中包含实体数据时,实体头才会出现.
3.6.1 通用头
通用头既可以在请求信息中出现也可以在响应信息中出现,其提供了与报文相关的基本信息.表3.2列出了HTTP通用头的字段名及其功能
Cache-Control | 请求和响应遵循的缓存机制 |
Connection | 客户端和服务器指定与请求或响应连接有关的选项,例如是否需要持久连接 |
Date | 创建HTTP报文的时间,即信息发送时间 |
Pragma | 包含用来实现特定的指令,通常用Pragma:no-cache |
Trailer | 表明以chunked编码传输的报文实体数据尾部存在的字段 |
Transfer-Encoding | 规定了传输报文实体数据采用的编码方法 |
Upgrade | 检测HTTP协议,允许服务器指定一种新的协议 |
Via | 追踪客户端与服务器之间的请求报文和响应报文的传输路径(网管,代理服务器等) |
Warning | 告知用户与缓存相关的警告 |
- Cache-Control:指令可按请求和响应分类.请求消息中的缓存指令包括no-cache,no-store,max-age,max-stale,min-fresh,only-if-cached等,响应信息中的指令包括public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate和max-age等.
指令 | 说明 |
no-cache | 告知服务器不直接使用缓存,目的是防止从缓存中返回过期的资源 |
no-store | 提示请求或响应中包含机密信息,规定不缓存请求或响应中的任何内容 |
max-age | 客户端希望接收存在时间不超过规定描述的资源 |
max-stale | 客户端希望接收存在时间超过规定描述的资源 |
min-fresh | 客户端希望接收还未超过指定秒数的缓冲资源 |
only-if-cached | 客户端仅在服务器本地已缓存目标资源的情况下,才要求服务器返回资源 |
public | 可向任一方提供响应缓存 |
private | 仅向特定用户提供响应缓存 |
no-cache | 不能直接使用缓存,要向服务器发起验证 |
no-store | 提示请求或响应中包含机密信息,规定不缓存请求或响应中的任何内容 |
no-transform | 不得对资源进行转换或转变 |
max-age | 告知客户端,资源在规定描述之内是最新的,无需向服务器发送新请求 |
must-revalidate | 可缓存但必须由服务器发送验证请求,请求失败返回504 |
proxy-revalidate | 可缓存但必须由服务器发送验证请求,请求失败返回504 |
//下面为请求指令的一个案例
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: max-age=0
Cache-Control: max-stale=3000
Cache-Control: min-fresh=60
Cache-Control: only-if-cached
//下面为响应指令的一个案例
Cache-Control: must-revalidate
Cache-Control: no-cache=Location
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: public
Cache-Control: private
Cache-Control: proxy-revalidate
//可以使用多个值
Cache-Control: private,s-maxage=0,max-age=0,must-revalidate
- Connection: 主要指令有Upgrade,keep-alive,close.Upgrade用于检测协议是否可以使用更高版本连接控制不在转发给代理头字段.HTTP/1.1版本的请求默认使用持久连接,当服务器想要断开连接时,则Connection指定为close.HTTP/1.1之前的HTTP版本默认使用非持久连接,当客户端想要保持网络连接打开时,则Connection指定为keep-alive.
Connection: Upgrade
Connection: keep-alive
Connection: close
- Date:用于创建HTTP报文的时间
Date: Tue, 09 Oct 2018 00:09:08 GMT
- Pragma: HTTP/1.1之前版本中的通用头,仅作为向后兼容只支持HTTP/1.0协议的缓存服务器.规范定义的形式唯一,如下所示(效果与HTTP/1.1协议中的Cache-Control:no-cache相同).
Pragma: no-cache- Trailer: 一个响应头,允许服务器在发送的报文主体后面添加额外的内容
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
Trailer: Expires
//HTML内容
0
Expires: Tue. 09 Oct 2018 00:09:08 GMT
- Upgrade: 用于向服务器指定某种传输协议以便服务器进行转换,使用头字段Upgrade时,需要额外指定Connection:Upgrade
Upgrade: HTTP/2.0,SHTTP/1.3,IRC/6.9,RTA/x11
- Via: 由代理服务器添加,适用于正向和反向代理,在请求和响应头中均可出现.用法需要规定所使用的协议版本号 ,公共代理的url一级端口号,内部代理名称或者别名.如果访问"http://developer.*****.net"便可以看到Via通用头.如下所示
- via:1.17fdbb15d3214abd3294enbbbc.******.net
- Warning:使用Warning时需要规定所使用的三位数字警告码(如110,111,112,113等),添加到Warning首部的服务器或软件的名称或伪名称.描述错误信息的警告和日期时间,如下所示
- Warning:112 - "cache down" Tue, 09 Oct 2018 00:09:08 GMT
3.6.2 请求头
请求头是从客户端向服务器发送请求报文时所用的字段.服务器根据请求头信息,为客户端提供响应.在网络爬虫采集数据时,为了更好地模拟浏览器访问服务器,经常需要设置一些请求头信息,比如添多个不同的User-Agent.如下所示为部分HTTP请求头的字段名及其功能.
字段名 | 功能 |
Accept | 指定客户端可以处理的数据类型 |
Accept-Charset | 指定客户端可以接收的字符集 |
Accept-Encoding | 指定浏览器能够进行解码的数据编码格式 |
Accept-Language | 指定浏览器可以接收的语言种类 |
Cookie | 客户端发送请求时,会把保存在该请求域下的所有cookie值一起发送给服务器 |
Host | 指定请求的服务器域名和端口号,不包括协议 |
Origin | 置顶请求的服务器名称,即包括=协议和域名 |
Referer | 告知服务器请求的原始资源的url,即包括协议,域名,端口等信息 |
Upgrade-Insecure-Request | 向服务器发送一个信号,表示客户对加密和认证响应的偏好 |
User-Agent | 发送请求的应用程序名称 |
- Accept:使用形式为type/subtype,使用时一般一次指定多种数据类型.示例如下:
- Accept:*/*
- Accept:text/css,*/*;q=0.1
- Accept:text/html,application/xhtml+xml,application;q=0.9,*/*;q=0.8
- Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
在上面的几个示例中,*代表所有,每种数据类型之间用分号分隔,q表示给数据类型设置优先级,其取值范围是(0,1],如果不设置默认为1
- Accept-Charset:使用形式与Accept类似,使用时一般一次指定多种字符集.示例如下
- Accept-Charset: utf8,gbk,q=0.8
- Accept-Encoding:常用的数据编码方式有 gzip,deflate,br,sdch,compress和identity.示例如下
- Accept-Encoding: gzip, deflate, br
- Accept-Encoding: gzip, deflate, sdch, br
- Accept-Language: 长虹的语言种类有zh-CN(简体中文),zh(中文),en-US(英语-美国)和en(英语) ,使用时可以设置语言的优先级.示例如下:
- Accept-Language:zh-CN,zh;q=0.9,en;q=0.8
- Cookie:语法为Cookie: name=value,包含多个name和value值的,中间使用";"字符分割,下面给出了一些示例:
- Cookie: WMF-LAST-ACCESS=10-Oct-2018;WMF-LAST-ACCESS-GLOBAL=10............
- Host:所有的HTTP请求必须携带Host头,如服务器未设定主机,则Host为空值.
- Host: www.****.com
- Origin:一般用于CORS跨域请求和POST请求中,下面给出了请求谷歌学术得到的Origin
- Origin:https://scholar.******.com
- Referer:浏览器向服务器发送请求主要有两种方式,即用户在浏览器中直接输入了url,用户通过单机某网页上的超链接访问url.通常情况下,使用第一种方式浏览器不会发送Referer信息给服务器,而使用第二种方式发送Referer信息给服务器.因此,Referer常被网站管理人员用来追踪网站的访问者,并查看其实如何导航进入网站的,如在谷歌学术网站中输入关键词"LdaReferer",而直接在浏览器输入网址便不会在请求头中找到Referer.在网络爬虫中,经常在请求的headers中伪造Referer来绕过网站的一些防爬措施
- Referer:https://scholar.*****.com/scholar?hl=zh-CN&as_sdt............
- Upgrade-Lnsecure-Requests:用于升级不安全请求,指示浏览器在进行url请求之前省级不全的网站,如"http://blog.*****.net"会升级成"https://blog.*****.net
- Upgrade-Insecure-Requests: 1
- User-Agent:用于标识请求浏览器的身份,目前,很多网站为了防止自身数据被网络爬虫采集,都会对请求头进行校验,其中重要的校验对象便是:User-Agent.而网络爬虫为了更好的采集数据,通常需要添加User-Agent库,每次采集url时,可以从User-Agent库中随机挑选一个使用,进而达到伪造浏览爱去安全访问服务器资源的目的
3.6.3 响应头
响应头是从服务器端向客户端发送响应报文时所用的字段.下表为响应头的字段以及功能
字段名 | 功能 |
Accept-Rangegs | 指定服务器对资源请求的可接受范围类型,字段的值定义了范围类型的单位 |
Age | 服务器产生响应进过的时间 |
Set-Cookie | 用来由服务器端向客户端发送cookie |
Server | 指明服务器软件以及版本号 |
Vary | 告知代理是使用缓存响应还是从源服务器中重新请求资源 |
下面响应头示例:
Accept-Ranges: bytesAge: 1296
Set-Cookie: BDRCVFR[Fc9oatPmwxn]=mk3SLVN4HKm; path=/;domain=.baidu.com
Vary: Accept-Encoding
Server: BWS/1.1
3.6.4 实体头
请求报文和响应报文中经常包含一些实体数据,如浏览器采用post提交的表单数据,服务器返回给浏览器的网页数据.实体头提供了大量的有关实体数据的信息,包括实体数据的类型,长度和压缩方法等.表3.7所示为部分HTTP实体头的字段名及其功能.
字段名 | 功能 |
Allow | 列出资源所支持的HTTP方法集合 |
Content-Encoding | 告知客户端服务器对实体数据的编码方式 |
Content-Language | 告知客户端实体数据使用的语言类型 |
Content-Length | 实体数据的长度 |
Content-Location | 实体数据的资源位置 |
Content-Range | 当前传输的实体数据在整个资源中的字节范围 |
Content-Type | 实体数据的类型 |
Expires | 实体数据的有效期 |
Last-Modifies | 实体数据上次被修改的日期及时间 |
Allow:告知客户端服务器能够支持的请求方法,当服务器接收不到支持的请求方法时,会以405作为响应返回
Allow:GET,POST,HEAD
Content-Encoding:常用的数据编码方式有gzip,deflate,br,sdch.....示例如下:
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: br
Content-Language:常用的语言种类有zh-CN(简体中文),zh(中文),.....示例如下:
Content-Language: enContent-Language: zh-CN
Content-Length: 单位是字节.注意当对实体数据进行编码传输时,不适用.示例如下:
Content-Length: 11410
Content-Location: 当客户端请求的资源在服务器有多个地址时,服务器可以通过Content-Location字段告知客户端其他可选地址.示例如下:
Content-Location: /index.html
Content-Range: 主要用于针对范围请求,即告知客户端返回响应实体的哪个部分符合范围请求,字段值以字节为单位.示例如下:
Content-Range:byte 800-5000/67589
Content-Type:使用形式与请求头Accept类似,字段值用type/subtype表示,另外也可以在Content-Type中对实体数据的字符集进行设置.示例如下:
Content-Type: text/html; charset=UTF-8
Expires:如果在响应头Cache-Control设置了max-age指令,则Expires可以被忽略.Expires示例如下:
Expires: Thu, 11 Oct 2018 01:23:51 GMT
Last-Modified:指URL对应资源的最后一次修改时间.Last-Modified示例如下
Last-Modified: Wed, 03 Oct 2018 13:57:31 GMT
3.7 HTTP响应正文
HTTP响应正文指服务器返回的一定格式的数据,Accept请求头和Content-Type实体头,Accept表示客户端可以接收响应正文的数据类型,字段值可以有多个,而Content-Type主要表示服务器返回响应正文的数据类型,仅有一个字段值.网络爬虫中经常解析的几种数据类型:HTML,XML,JSON