Python 爬虫十六式 - 第一式:HTTP协议

HTTP:伟大而又无闻的协议

学习一时爽,一直学习一直爽!php

  Hello,你们好啊,我是Connor,一个从无到有的技术小白。有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协议,只是知道HTTP协议是用来网页传输的,可是再深究一点就不明白了,因此今天咱们来说一讲什么是HTTP协议。web

今天不当讲也得讲了

1.HTTP 与 HTTPS

   1.1 什么是HTTP协议

  超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为普遍的一种网络协议。全部的WWW文件都必须遵照这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。json

  HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。浏览器

  一次HTTP请求的基本流程通常是,在创建TCP链接后,由客户端向服务端发起一次请求 request ,而服务器在接收到之后返回给客户端一个响应 response 。因此咱们看到的HTTP请求内容通常就分为请求和响应两部分。缓存

  HTTP协议一般承载于TCP协议之上,默认HTTP的端口号为80。有时也承载于TLS或SSL协议层之上,这个时候,就成了咱们常说的HTTPS,稍后咱们会详细说HTTP和HTTPS的区别。安全

   1.2 HTTP协议的特色

  1. http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。服务器

  2. 无链接。所谓的无链接就是服务器收到了客户端的请求以后,响应完成并收到客户端的应答以后,即断开链接。限制每次的链接只处理一次请求。从而节省传输时间。cookie

  3. 无状态。HTTP协议是无状态的,也就是说每一次HTTP请求之间都是相互独立的,没有联系的,服务端不知道客户端具体的状态。好比客户端访问一次网页以后关闭浏览器,而后再一次启动浏览器,再访问该网站,服务器是不知道客户关闭了一次浏览器的。这样设计的缘由是由于Web服务器通常须要面对不少浏览器的并发访问,为了提升Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息网络

  4. 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,通常来讲只须要传输请求方法和路径,就能进行访问。session

  5. 灵活:客户端能够经过HTTP协议传输任意类型的数据,包括但不限于文本,图片,视频等

   1.3 HTTP与HTTPS的区别

  HTTP你们都知道是什么东西了,那什么是HTTPS呢?HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,承载于SSL协议层之上。所以加密的详细内容就须要SSL。

区别 HTTP HTTPS
安全性 不安全 安全
是否须要证书 不须要 须要
传输方式 明文传输 加密传输
默认端口 80 443

  HTTPS和HTTP相比的主要优点就是体如今它的安全性上,它的缺点也很明显,体如今它的行能和技术方面,具体的优缺点咱们再也不多说,你们能够自行体会。


2.HTTP 请求

  每个HTTP请求都由三部分组成,分别是:请求行、请求报头、请求正文。

   2.1 请求行

  请求行通常由请求方法url路径协议版本组成,以下所示:

GET www.baidu.com HTTP/1.1

  经过上面咱们能够看到请求行分了三个部分,其中GET就是请求行中的请求方法,https://www.baidu.com 就是请求行中的url路径, HTTP/1.1就是它的协议版本。

   2.2 请求报头(请求头)

  请求头遵循如下格式:

名字:空格 + 值

   经常使用的请求头的属性以下:

属性名 做用
Host 指定的请求资源的域名(主机和端口号)。HTTP请求必须包含HOST,不然系统会以400状态码返回。
User-Agent 简称UA,内容包含发出请求的用户信息,一般UA包含浏览者的信息,主要是浏览器的名称版本和所用的操做系统。这个UA头不只仅是使用浏览器才存在,只要使用了基于HTTP协议的客户端软件都会发送,不管是手机端仍是PDA等,这个UA头是辨别客户端所用设备的重要依据。
Accept 告诉服务器能够接受的文件格式。
Cookie 告诉浏览器Cookie信息
Cache-Control 指定请求和响应遵循的缓存机制。
Referer 页面跳转处,代表请求来自于哪一个URL,用户是从该哪一个页面访问到当前页面的。
Content-Length 内容长度。
Content-Range 响应的资源范围。能够在每次请求中标记请求的资源范围,在链接断开重连时,客户端只请求该资源未下载的部分,而不是从新请求整个资源,实现断点续传。
Accept-Encoding 指定所可以接受的编码方式
Accept-Language 指浏览器能够接受的语言种类 en、en-us指英语 zh、zh-cn指中文。
Connection 客户端与服务器连接类型,keep-alive:保持连接,close:关闭连接。

   固然这些知识列举出了平时经常使用的一些请求头属性,有些网站也会使用自定义的属性,会使用诸如su,x-index等各类很是用属性以外的属性,很是容易鉴别。

   2.3 请求正文

   请求正文一般只有使用POST方式进行请求的时候才会有请求正文,若是使用GET请求的话,是不会有请求正文的,具体状况将会在后面的GET与POST请求处细说。

   2.4 HTTP请求方法

HTTP协议中定义的请求方法有如下几种:

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会致使新的资源的创建和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。
7 OPTIONS 容许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

虽然HTTP请求中定义的方法有这么多种,可是咱们日常使用的基本只有GETPOST两种方法,并且大部分网站都是禁用掉了除GETPOST外其余的方法。

由于其余几种方法经过GET或者POST都能实现,并且对于网站来讲更加的安全和可控。

  • GET

    其实简单来讲,GET方法通常用来负责获取数据,或者将一些简短的数据放到URL参数中传递到服务器。比POST更加高效和方便。

  • POST

    因为GET方法最多在url中携带1024字节数据,且将数据放到URL中传递太不安全,数据量大时URL也会变得冗长。因此传递数据量大或者安全性要求高的数据的时候,最好使用POST方法来传递数据。


3.HTTP响应

  每个HTTP请求也都由三部分组成和请求行相似,分别是:响应行、响应报头、响应正文。

   3.1 响应行

  状态行由HTTP协议版本号, 状态码, 状态消息三部分组成。以下所示:

HTTP/1.1 200 OK

上面咱们看到了响应行的内容,其中HTTP/1.1是协议版本号,200是状态码,OK是状态消息。

   2.2响应正文

  响应头格式和请求头格式相同,遵循如下格式:

名字:空格 + 值

  经常使用的响应头属性以下:

属性名 做用
Allow 服务器支持哪些请求方法(如GET、POST等)
Date 表示消息发送的时间,时间的描述格式为格林威治时间
Set-Cookie 用于把cookie发送到客户端浏览器,每个写入cookie都会生成一个Set-Cookie
Expires 能够理解为过时时间,当到期以后浏览器会从服务器从新获取,放弃本地缓存文档
Content-Type WEB服务器告诉客户端本身响应的对象的类型和字符集
Content-Encoding 文档的编码(Encode)方法。只有在解码以后才能够获得Content-Type头指定的内容类型。利用gzip压缩文档可以显著地减小HTML文档的下载时间
Content-Length 指明实体正文的长度,以字节方式存储的十进制数字来表示
Location 用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档
Refresh 表示浏览器应该在多少时间以后刷新文档,以秒计

   3.3 响应正文

  服务器返回的数据。

  3.4 状态码

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码,以代表这一次请求的状态。下面是一些常见的状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,通常来讲有五种类型:

分类 分类描述
1** 信息,服务器收到请求,须要请求者继续执行操做
2** 成功,操做被成功接收并处理
3** 重定向,须要进一步的操做以完成请求
4** 客户端错误,请求包含语法错误或没法完成请求
5** 服务器错误,服务器在处理请求的过程当中发生了错误

如下是详细的状态码列表:

状态码 状态码英文名称 中文描述
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200 OK 请求成功。通常用于GET与POST请求
201 Created 已建立。成功请求并建立了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非受权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的状况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可经过此返回码清除浏览器的表单域
206 Partial Content 部份内容。服务器成功处理了部分GET请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。从此任何新的请求都应使用新的URI代替
302 Found 临时移动。与301相似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301相似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端一般会缓存访问过的资源,经过提供一个头信息指出客户端但愿只返回在指定日期以后修改的资源
305 Use Proxy 使用代理。所请求的资源必须经过代理访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302相似。使用GET请求重定向
400 Bad Request 客户端请求的语法错误,服务器没法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,未来使用
403 Forbidden 服务器理解请求客户端的请求,可是拒绝执行此请求
404 Not Found 服务器没法根据客户端的请求找到资源(网页)。经过此代码,网站设计人员可设置"您所请求的资源没法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器没法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求代理的身份认证,与401相似,但请求者应当使用代理进行受权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不一样于404,若是资源之前有如今被永久删除了可以使用410代码,网站设计人员可经过301代码指定资源的新位置
411 Length Required 服务器没法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 因为请求的实体过大,服务器没法处理,所以拒绝请求。为防止客户端的连续请求,服务器可能会关闭链接。若是只是服务器暂时没法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI一般为网址),服务器没法处理
415 Unsupported Media Type 服务器没法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器没法知足Expect的请求头信息
500 Internal Server Error 服务器内部错误,没法完成请求
501 Not Implemented 服务器不支持请求的功能,没法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 因为超载或系统维护,服务器暂时的没法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,没法完成处理

4. URI、URL、URN

   4.1 URI、URL、URN的定义

  什么是URI? 什么是URL? 什么又是URN?三个概念中咱们接触的最多的就是URL,那URN和URI又是什么东西呢?怎么之前没听过呢?咱们来看他们三个的定义:

  URI:Uniform Resource Identifier,即统一资源标志符,用来惟一的标识一个资源。

  URL:Uniform Resource Locator,统一资源定位符。即URL能够用来标识一个资源,并且还指明了如何locate这个资源。

  URN:Uniform Resource Name,统一资源命名。即经过名字来表示资源的。

下面咱们重点说一下URL的格式,再来讲一下URI、URL、URN的区别:

   4.2 URL的格式:

  一个完整的URL包含协议名称,主机名称(IP或者域名)、端口号(没写端口号默认 为80端口)、路径、查询字符串和锚这6个部分。好比:

http//www.quanshuwang.com:80/modules/article/search.php?searchkey=abcd&searchtype=1&page=2#top

  http是它的协议名称。   www.quanshuwang.com就是它的域名。   /modules/article/search.php是它的路径。   :80是它的端口号,80是http的默认端口号,通常状况下会隐藏的。   searchtype=1&page=2是它的查询字符串。   #top是它的锚点,用来定位的,好比说回到顶部。

   4.3 URI,URL,URN之间的关系:

   上图中咱们能够看到,URL和URN是URI的子集,URI是统一资源标志符,而URL除了有标识的功能以外,还有定位的功能,能够用来描述资源的具体位置,还指明了获取资源所采用的协议。

   URN也是URL的一种表现形式,它和URL的区别就是与资源的位置无关,正式因为位置的无关性,被某个URN标识的资源在位置发生变化时,其URI能够保持不变。可是咱们在平时的使用中几乎没有用URN的,更多的用的是URL。因此URL和URN都是URI的一种扩展,一种表现形式,URL和URN确定是一个URI,可是URI不必定是URN或URL。


5. Cookie

  Cookie有时也用其复数形式 Cookies,英文是饼干的意思。指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(一般通过加密)。

  Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,而后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到Cookie之后,会验证Cookie的信息,以此来辨别用户的身份,固然若是有需求,服务器还能够根据须要对Cookie的内容进行修改。

   5.1 Cookie的做用

  Cookie实际上是HTTP请求头的扩展部分,因为HTTP协议是无状态的协议,因此为了在网页上实现登录之类的需求,因此扩展了Cookie这样的功能。

  每一次HTTP请求在数据交换完毕以后就会关闭链接,因此下一次HTTP请求就没法让服务端得知你和上一次请求的关系。而使用了Cookie以后,你在第一次登录之类的请求成功以后,服务器会在Response的头信息中给你返回Cookie信息,你下一次访问的时候带上这个Cookie信息,则服务器就能识别你为上一次成功登录的用户。

   5.2 Cookie的内容

  Cookie通常保存的格式为json格式,由一些属性组成。

  - name:Cookie的名称   - value:Cookie的值   - domain:可使用此Cookie的域名   - path:可使用此Cookie的页面路径   - expires/Max-Age:此Cookie的超时时间   - secure:设置是否只能经过https来传递此条Cookie

   5.3 domain属性

  域名通常来讲分为顶级域名,二级域名,三级域名等等。

  例如baidu.com是一个顶级域名,而www.baidu.com和map.baidu.com就是二级域名,依次类推。

  而在咱们的Cookie来讲,都有一个domain属性,这个属性限制了访问哪些域名时可使用这一条Cookie。由于每一个网站基本上都会分发Cookie,因此domain属性就可让咱们在访问新浪时不会带上百度分发给咱们的Cookie

  而在同一系的域名中,顶级域名是没法使用其二级域名的Cookie的,也就是说访问baidu.com的时候是不会带上map.baidu.com分发的Cookie的,二级域名之间的Cookie也不能够共享。但访问二级域名时是可使用顶级域名的Cookie的。

   5.4 path属性

  path属性为能够访问此cookie的页面路径。 好比domain是abc.com,path是/test,那么只有/test路径下的页面能够读取此cookie。

   5.5 expires/Max-Age属性

  字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一块儿失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。


6. Session

  Session,中文常常翻译为会话,其原本的含义是指善始善终的一系列动做/消息,好比打电话时从拿起电话拨号到挂断电话这中间的一系列过程能够称之为一个session。这个词在各个领域都有在使用。

  而咱们web领域,通常使用的是其本义,一个浏览器窗口从打开到关闭这个期间

  Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的全部请求均可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID而且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。

  Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行断定,因此相对于Cookie,Session的安全性更高。

  通常SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。


以上就是HTTP有关的全部内容了,我是Connor,一个从无到有的技术小白,若是以为我说的有什么不对的地方,欢迎指出!咱们下期再见。

学习一时爽,一直学习一直爽!


系列文章链接:

Python 爬虫十六式 - 第二式:urllib 与 urllib3 >>>
Python 爬虫十六式 - 第三式:Requests的用法 >>>
Python 爬虫十六式 - 第四式:使用Xpath提取网页内容 >>>
Python 爬虫十六式 - 第五式:BeautifulSoup,美味的汤 >>>
Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery >>>
Python 爬虫十六式 - 第七式:正则的艺术 >>>
Python 爬虫十六式 - 第八式:实例解析-全书网 >>>

相关文章
相关标签/搜索