聚沙成塔--爬虫系列(十七)(初识http协议)

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!

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的网络编程讲了,光说不练都是假把式对吧。


欢迎关注我:「爱做饭的老谢」,老谢一直在努力...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,326评论 6 152
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,201评论 3 82
  • 前言:最近发现自己在网络相关这一块基础很是欠缺,所以准备花时间了解一下,本文主要是讲http协议的一些基础,和一些...
    justCode_阅读 2,092评论 0 23
  • HTTP概述 超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最...
    曹渊说创业阅读 3,838评论 2 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139