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)
请求正文

这里写图片描述

如上两图是我在登录知乎首页时用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)
响应正文

这里写图片描述

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

  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
AuthorizationHTTP授权的授权证书Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cache
Connection表示是否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close
CookieHTTP请求发送时,会把保存在该请求域名下的所有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发送请求的用户的emailFrom: user@email.com
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如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为EtagIf-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-AgentUser-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对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEAD
Cache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-store
Content-Encodingweb服务器支持的返回内容压缩编码类型。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
Serverweb服务器软件名称Server: Qnginx/1.2.0
Set-Cookie设置Http CookieSet-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××  服务器错误

详细划分:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值