HTTP协议简介
HTTP是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。HTTP报文
-
请求报文(HTTP Request)
HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
<method> <request-URL> <version> <headers> <entity-body>
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而 HTTP 中的GET,POST,PUT,DELETE就对应着对这个资源的查,增,改,删4个操作。
-
GET用于信息获取,而且应该是安全的 和 幂等的。
所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
幂等的意味着对同一URL的多个请求应该返回同样的结果。
-
-
响应报文(HTTP Response)
HTTP 响应与 HTTP 请求相似,HTTP响应也由3个部分构成,分别是:
状态行
响应头(Response Header)
响应正文
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。-
常见的状态码有如下几种:
- 200 OK 客户端请求成功
- 301 Moved Permanently 请求永久重定向
- 302 Moved Temporarily 请求临时重定向
- 304 Not Modified 文件未修改,可以直接使用缓存的文件。
- 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
- 404 Not Found 请求的资源不存在,例如,输入了错误的URL
- 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
- 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
-
Example
-
上面的介绍可能听的有点迷糊,我们来实际操作一下
用Chrome打开Blog
按下键盘上的F12键,打开开发人员工具
点击红框内的Network可以看到当前资源加载情况(如果Network项中为空白就在网页上刷新一遍再切换回来看看)
点击其中一个资源
[图片上传失败...(image-daa578-1548249118307)]
这时候可以看到右侧有一个Headers栏已经打开其中的General包括了上面我们讲的请求URL,请求方法,相应的状态码以及一些其他的东西
Response Headers响应头及一些相关信息
Request Headers请求头包含我们电脑向服务器发起请求的请求头信息,可以看到其中user-agent包含了我们的电脑信息
`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36`
Mozila是当时浏览器大战留下来的小玩意,表示伪装成Mozilla排版引擎的浏览器以达到兼容
,Windows NT 10.0表明了我们的系统内核版本,AppleWebKit/537.36 (KHTML, like Gecko)表示浏览器所使用的平台及浏览器平台的细节,Chrome/62.0.3202.75 Safari/537.36是被浏览器用于指示特定的直接由浏览器提供或者通过第三方提供的可用的增强功能。更多详细内容请到HTTP协议详解了解
当我们写一个爬虫时,很多时候都是在用GET、POST请求方法,通过请求库向服务器请求数据,获取到的数据再进行处理。有些时候网站不想让你抓取他们的数据,就会根据一些请求信息进行排查,像User Agent、Host、Referer、IP这都是排查的重点,所以在更高级的爬虫学习中,我们会对请求信息进行伪造,以达到欺骗对方反爬虫逻辑的目的
-
首发于个人博客Bismuth