版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!
tips:本基础系列旨在以爬虫带大家入门Python语言
本基础系类讲到这里基本将Python的用法囊括了,正则表达式、元组、列表、生成器、文档操作、数据库操作、多线程、多进程。我默认那些从第一篇开始看的初学者已经基本学会使用Python这门语言了,那么到了本章老谢觉得很有必要讲一下HTTP协议了,前面的爬虫程序我们是用了一个request的函数去从服务器上请求的数据,但我们只知其然、不知其所以然。所以本篇文章有必要让大家知道其所以然,网络中的数据是如何在万维网中交互的。
HTTP
Hypertext Transfer Protocol(HTTP)超文本传输协议,它是基于TCP/IP协议,它可以用来传输数据、文件、图片等等,默认端口为80端口,TCP/IP协议本章不做介绍,有兴趣了解的可以看我的个人博客TCP协议总结这篇文章。它是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议,它也是一个无状态的传输协议。这里需要理解两个概念,客户端(Web Client)、服务端(Web Server),客户端是指我们电脑上的浏览器,想Chrome、Firefox、IE等都叫做客户端。服务端是指提供服务的一端,就像我们通过网址去访问服务一样,这个网址(URL)对应的就是服务端。HTTP协议的工作模式可以概括如下:
基本特征
- 无连接:当客户端发起HTTP请求后,断开与服务器之间的连接并等待服务端的相应,服务端收到请求并处理请求重新建立与客户端的连接并响应请求。
- 媒体独立性: 意思是只要客户端和服务器都知道如何处理数据内容,任何类型的数据都可以通过HTTP发送。 客户端和服务器都需要使用适当的MIME类型来指定内容类型。
- 无状态: 因为HTTP是无连接的,它无状态协议的直接结果。 服务器和客户端只在当前的请求期间才知道彼此。 之后,他们俩都忘记了对方。 由于协议的这种性质,客户端和浏览器都不能在网页的不同请求之间保留信息。
协议内容
在正式开讲协议之前我们先看一下先看一下一个请求和一个应答都包含了哪些信息,前面的章节提到过怎么查看协议内容。
Request Headers请求头
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en,zh-CN;q=0.8,zh;q=0.6
Cookie: BAIDUID=0C80846E213536DBC9C41F0B0E71B9A6:FG=1; BIDUPSID=0C80846E213536DBC9C41F0B0E71B9A6; PSTM=1478063602; BDUSS=FjYlR5SExlU1NyUjcxNzRCalJLS35ZRWN0b2JlblJjdjZ2dUd0OTlJa3ZwQUphSVFBQUFBJCQAAAAAAAAAAAEAAAAg-Vcjc2Fuc2hhbzEzMTQyNDYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8X21kvF9tZSH; MCITY=-%3A; ispeed_lsm=2; cflag=15%3A3; BDRCVFR[-2cV2yayoy0]=Za_Pf0_zypmn1RvnHc1QhPEUf; BD_CK_SAM=1; PSINO=3; H_PS_645EC=aa7c2bmMU3Y8IU8%2Ff2G1H5%2FtV9meG4Iy2kIdCT4go1wXWeYOZo0%2FhbAGB5EvFk%2FCVpTJfv6u; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BD_HOME=1; H_PS_PSSID=1425_24566_12897_21113_18560_17001_24880_20719; BD_UPN=12314753
-
GET / HTTP/1.1:GET是请求方法,/请求路径,这里表示访问的路径是
www.baidu.com
,如果这里有其它值,那么就访问的是www.baidu.com/xxx
,HTTP/1.1是协议版本 - Host: 访问的主机
- Connection:连接模式,keep-alive模式为持久连接,上面介绍了HTTP协议本身是无连接的,这里使用keep-alive模式是为了提高客户端和服务器端的处理能力,因为避免了建立/释放连接的开销。close模式告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了
-
Cache-Control: 缓存控制,该字段有下列几个值
- no-cache:不要缓存的实体,要求现在从WEB服务器去取
- max-age: 只接受 Age 值小于 max-age 值,并且没有过期的对象
- max-stale:可以接受过去的对象,但是过期时间必须小于 max-stale 值
- min-fresh: 接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象
-
Upgrade-Insecure-Requests:用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理
upgrade-insecure-requests
CPS指令。撒意思呢,就是浏览器告诉服务器端我可以处理https协议,我们可以从上面的图片请求的URL地址是使用的https://www.baidu.com
- User-Agent:浏览器表明自己的身份(是哪种浏览器)。
- Accept::告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
- Accept-Encoding:浏览器申明自己接收的字符集 ,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
- Accept-Language:浏览器申明自己接收的语言 语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
- Cookie:说白点就是让服务器记住你,因为HTTP协议是无连接的,当我们登录一个网址的时候输入了用户名和密码,服务器应答的时候会设置一个Cookie(省份信息),当你下次再访问服务器时,就会带上Cookie,那么服务器解密Cookie信息就会知道你之前已经登录过了就不需要再登录了。
Response Headers应答头
HTTP/1.1 200 OK
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 09 Nov 2017 08:07:24 GMT
Expires: Thu, 09 Nov 2017 08:07:24 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=279; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1425_24566_12897_21113_18560_17001_24880_20719; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
-
HTTP/1.1 200 OK:协议版本,应答码
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
-
5xx:服务器端错误--服务器未能实现合法的请求
常见的应答码如下: - 200 OK //客户端请求成功
- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden //服务器收到请求,但是拒绝提供服务
- 404 Not Found //请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error //服务器发生不可预期的错误
- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
-
Cache-Control:需要注意的是此字段应答和请求的值是不一样的,应答有如下几种可取值
- public:可以用 Cached 内容回应任何用户
- private:只能用缓存内容回应先前请求该内容的那个用户
- no-cache:可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端
- max-age:本响应包含的对象的过期时间
- ALL: no-store:不允许缓存
- Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
- Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型
- Date:表明创建 HTTP 报文的日期和时间
- Expires:资源过期时间,浏览器会根据该过期日期与客户端时间对比,如果过期时间还没到,则会去缓存中读取该资源,如果已经到期了,则浏览器判断为该资源已经不新鲜要重新从服务端获取
- Server:WEB 服务器表明自己是什么软件及版本等信息,BWS/1.1
- Set-Cookie:设置客户端的Cookie信息
- Strict-Transport-Security:当用户在浏览器输入不带协议的网址的时候,自动识别协议为https,而不是http,max-age是一个时间值,单位秒
-
Transfer-Encoding:WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked),当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-length消息首部字段告诉客户端 需要接收多少数据。但是如果是动态页面等时,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输 数据了。即如果要一边产生数据,一边发给客户端,服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。
当然请求头和应答头还有其他字段这里没有依依列出来,感兴趣的可以去查看rfc-2616文档。
HTTP/1.1方法
HTTP/1.1提供了以下几种方法
方法名 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
GET & POST
GET和POST方法是最常用的两个方法,它们的区别如下
GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如xxx.html?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
okay,本篇文章到这里就介绍了,下一篇文章将用原生的socket去实现其中的几种方法,顺带把Python的网络编程讲了,光说不练都是假把式对吧。