JAVA爬虫初识之HTTP通信机制

最近接触爬虫相关知识,将学习和网上了解到的一些东西记录下来,以便以后需要。(删除重新发一次)

HTTP通信机制

HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。HTTP是一种无状态的协议(Web浏览器和Web服务器之间不需要建立持久的连接),即一个客户端向服务器端发出请求(request),然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。Web浏览器向Web服务器发送请求,Web服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列4个步骤:

  1. 建立TCP连接
    在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80
  2. Web浏览器向Web服务器发送请求
    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求,请求的具体格式及组成后面会详细介绍
  3. Web服务器应答
    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
  4. Web服务器关闭TCP连接
    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,但是如果浏览器或者服务器在其头信息加入了这行代码
    Connection:keep-alive
    TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

关于http请求

http request的组成:

请求方法/URI协议/版本
请求头(Request Header)
请求正文

JAVA爬虫初识之HTTP通信机制

JAVA爬虫初识之HTTP通信机制

如上两图是我在登录知乎首页时用fiddler(一款抓包软件)获取的请求信息:

  1. 第一行:POST /login/email HTTP/1.1 对应本次请求的请求方法/URI协议/版本
  2. 一图第一行之后的即为请求头(Request Header),请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,可接收的内容类型等。之后会贴上网上找的Http Herder的常见参数
  3. 请求正文。请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。此处因为用fiddler截取,fiddler自动将请求正文分离了,表现为图二。请求正文可以包含客户提交的信息等。

关于http请求方法

OPTIONS 、HEAD 、GET、POST 、PUT 、DELETE 、TRACE。目前只接触过GET方法与POST方法。

  • GET方法

GET方法是默认的HTTP请求方法,它将我们需要提交的数据拼装在url中,存在着安全隐患上。大概长这样:http://www.julie.com/login.jsp?Name=zhangsan&password=123456从这个URL请求中,很容易就可以看到用户提交的数据。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大

  • POST方法

POST方法是GET方法的一个替代方法,POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

关于http应答

http response组成:与http请求相对应,http应答也分为三个部分:

协议/版本/状态代码描述
响应头(Response Header)
响应正文

JAVA爬虫初识之HTTP通信机制

如图登录知乎首页的响应报文:

  1. 第一行 HTTP/1.1 200 OK 对应本次响应的 协议/版本/状态代码描述,后会贴上网上找的http返回码总结。
  2. 第一行后为响应头,与请求头类似响应头也包含一些服务器的信息等。
  3. 响应正文。响应正文为服务器返回的html页面,浏览器将其解析成我们看到的网页。同请求头与请求正文之间用空行分隔一样,响应头与响应正文之间也用空行分隔。

Http Header详解

Request Header:

Header 解释 示例
Accept 指定客户端能接收的内容类型 Accept: /
Accept-Charset 浏览器能接收的字符编码集 Accept-Charset: iso-8859-5
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: gzip, deflate, br
Accept-Language 浏览器可接收的语音 Accept-Language: zh-CN,zh;q=0.8
Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: close
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;
Content-Length 请求的内容长度 Content-Length: 112
Content-Type 请求的实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect 请求的特定的服务器行为 Expect: 100-continue
From 发送请求的用户的email From: [email protected]
Host 指定请求的服务器的域名和端口号 Host: www.zhihu.com
If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
Pragma 用来包含实现特定的指令 Pragma: no-cache
Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只请求实体的一部分,指定范围 Range: bytes=500-999
Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer: https://www.zhihu.com/
TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning

Response Header:

Header 解释 示例
Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes
Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12
Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD
Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control: no-store
Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding: gzip
Content-Language 响应体的语言 Content-Language: en,zh
Content-Length 响应体的长度 Content-Length: 44
Content-Location 请求资源可替代的备用的另一地址 Content-Location: /index.htm
Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022
Content-Type 返回内容的MIME类型 Content-Type: application/json
Date 原始服务器消息发出的时间 Date: Wed, 16 Nov 2016 02:12:17 GMT
ETag 请求变量的实体标签的当前值 ETag: “737060cd8c284d8af7ad3082f209582d”
Expires 响应过期的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: http://www.zcmhi.com/archives/94.html
Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma: no-cache
Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate: Basic
refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) Refresh: 5; url=http://www.zcmhi.com/archives/94.html
Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After: 120
Server web服务器软件名称 Server: Qnginx/1.2.0
Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards
Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary: Accept-Encoding
Via 告知代理客户端响应是通过哪里发送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 警告实体可能存在的问题 Warning: 199 Miscellaneous warning
WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate: Basic

注:加粗个人最近常见。

返回码总结

HTTP协议状态码表示的意思主要分为五类,大体是:
1××  保留
2××  表示请求成功地接收
3××  为完成请求客户需进一步细化请求
4××  客户错误
5××  服务器错误

详细划分:

返回码 状态 解释
100 Continue 指示客户端应该继续请求。回送用于通知客户端此次请求已经收到,并且没有被服务器拒绝。客户端应该继续发送剩下的请求数据或者请求已经完成,或者忽略回送数据。服务器必须发送最后的回送在请求之后。
101 Switching Protocols 服务器依照客服端请求,通过Upgrade头信息,改变当前连接的应用协议。服务器将根据Upgrade头立刻改变协议在101回送以空行结束的时候。
200 OK 指示客服端的请求已经成功收到,解析,接受。
201 Created 请求已经完成并一个新的返回资源被创建。被创建的资源可能是一个URI资源,通常URI资源在Location头指定。回送应该包含一个实体数据并且包含资源特性以及location通过用户或者用户代理来选择合适的方法,实体数据格式通过媒体类型来指定content-type头,最开始服务器必须创建指定的资源在返回201之前,如果行为没有被立刻执行,服务器应该返回202
202 Accepted 请求已经被接受用来处理。但是处理并没有完成。请求可能或者根本没有遵照执行,因为处理实际执行过程中可能被拒绝。
203 Non-Authoritative Information
204 No Content 服务器已经接受请求并且没必要返回实体数据,可能需要返回更新信息。回送可能包含新的或更新信息由entity-headers呈现。
205 Reset Content
206 Partial Content 服务器已经接受请求GET请求资源的部分。请求必须包含一个Range头信息以指示获取范围可能必须包含If-Range头信息以成立请求条件。
300 Multiple Choices 请求资源符合任何一个呈现方式。
301 Moved Permanently 请求的资源已经被赋予一个新的URI。
302 Found 通过不同的URI请求资源的临时文件。
303 See Other
304 Not Modified 如果客服端已经完成一个有条件的请求并且请求是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束。
305 Use Proxy 请求的资源必须通过代理(由Location字段指定)来访问。Location资源给出了代理的URI。
306 Unused
307 Temporary Redirect
400 Bad Request 因为错误的语法导致服务器无法理解请求信息。
401 Unauthorized 如果请求需要用户验证。回送应该包含一个WWW-Authenticate头字段用来指明请求资源的权限。
402 Payment Required 保留状态码
403 Forbidden 服务器接受请求,但是被拒绝处理。
404 Not Found 服务器已经找到任何匹配Request-URI的资源。
405 Menthod Not Allowed Request-Line请求的方法不被允许通过指定的URI。
406 Not Acceptable
407 Proxy Authentication Required
408 Reqeust Timeout 客服端没有提交任何请求在服务器等待处理时间内。
409 Conflict
410 Gone
411 Length Required 服务器拒绝接受请求在没有定义Content-Length字段的情况下。
412 Precondition Failed
413 Request Entity Too Large 服务器拒绝处理请求因为请求数据超过服务器能够处理的范围。服务器可能关闭当前连接来阻止客服端继续请求。
414 Request-URI Too Long 服务器拒绝服务当前请求因为URI的长度超过了服务器的解析范围。
415 Unsupported Media Type 服务器拒绝服务当前请求因为请求数据格式并不被请求的资源支持。
416 Request Range Not Satisfialbe
417 Expectation Failed
500 Internal Server Error 服务器遭遇异常阻止了当前请求的执行
501 Not Implemented 服务器没有相应的执行动作来完成当前请求。
502 Bad Gateway
503 Service Unavailable 因为临时文件超载导致服务器不能处理当前请求。
504 Gateway Timeout
505 Http Version Not Supported