【前言】这几天一直看python爬虫登录保持。实现接口太多,太乱,新手难免云山雾罩。各种get、post,深入理解一下,其实就是由于http的特性需要这些操作。http是一种无状态、不保存上次通信结果的一种网络传输协议,虽然基于tcp但是不是连接的。

  本文先从原理角度介绍http各种特性,然后基于python语言,介绍其比较出名的一个http库——requests。主要会参考其中文的【开发文档】来总结,翻译的还是不错的。下面这幅图片是我截的文档开头,我一直认为真正的高手应该对其知识信手拈来,可以以一种风趣幽默的形式展现出来。哈哈,扯远了。

参考:《图解http》和https://blog.csdn.net/u011054333/article/details/69486364

一、http基础知识

  web使用http(超文本传输协议)来实现客户端与服务器通信。htttp属于tcp/ip协议族(四层),位于应用层。1、应用层协议是各种进程间通信的规则;2、传输层主要就是tcp和udp;3、网络层ipv4/6,用来对网络上的数据包进行封装,数据包是网络传输的最小数据单位,该层规定使用怎样的路径将数据包传给对方。要准确的到达目的地址,IP协议有两个量:ip和mac,解决局域网问题。ip通过ARP协议可以反查mac4、链路层,网络的硬件部分,网卡的驱动协议等。注意封装是逐级的,打包和解包的过程。

二、请求和响应报文

 请求: headers={}    由三部分组成

1、请求方法:get()、post()至少掌握,其他put(......以后再说。eg:GET/sample.jspHTTP/1.1(方法/URi/版本协议)大神讲解:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

  简单说,get是明文请求url信息,因为所有的响应返回信息都会跟在url中的?后面,用&连接参数,相对不安全,而且响应不会对当前浏览器产生影响;post的是携带信息请求,会把信息都封装在报文里面,相对安全,收到响应后浏览器界面也随即改变了。

2、请求头:connection默认设置为keep-alive这样在一次TCP连接时可以多次发送接收数据,提高吞吐,即持久连接,下面有介绍。

  还有其他那几个一般默认,唯一必须传的就是user-agent:浏览器的版本。

  ...(还有好多)

3、请求正文:密码,用户名可以写在headers里面,python是携带在data={}里面提交。一样的,其实就是覆盖。

响应:HTTP响应也由3个部分构成

1、状态行:状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。eg :HTTP/1.1 200 OK

其中:200为状态代码。第一个数字有五种可能的取值:

  - 1xx:   指示信息—表示请求已接收,继续处理。

  - 2xx:   成功—表示请求已经被成功接收、理解、接受。

  - 3xx:   重定向—要完成请求必须进行更进一步的操作。

  - 4xx:   客户端错误—请求有语法错误或请求无法实现。

  - 5xx: 服务器端错误—服务器未能实现合法的请求

2、响应头:

服务器端软件xinxi:Server:Apache Tomcat/5.0.12

时间:Date:Mon,6Oct2003 13:23:42 GMT

正文长度:Content-Length:112

三、几种数据传输方式

1、无状态

  http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议。这种设置的好处是:更快的处理更多的请求事务,j减轻服务器负担,确保协议的可伸缩性(快速型?)。不过随着web的不断发展,有时候需要将这种状态进行保持,例如保持登录。随即,就引入了cookie技术,cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。

2、持久性

  最初版本的http确实是连接一次收到一条数据就断开,然后周而复始的tcp三次握手,四次挥手。现在html里面会包含其他请求文件,这样频繁断开消耗太大,提出持久化技术:keep-alive.一次连接多次收发数据的次数,默认开启,次数在服务器端设置,一般300。

3、线管化

  在连接中,一次请求发出不用等待收到响应,就可以发出其他的请求。

4、内容编码

  由于某些报文的内容过大,因此在传输时,为了减少传输的时间,会采取一些压缩的措施。例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式:gzip(GUN压缩格式)

5、cookie  

  Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息, 通知客户端保存 Cookie。 当下次客户端再往该服务器发送请求时, 客户端会自动在请求报文中加入 Cookie 值后发送出去。 这样服务器端只需要保存刚刚向谁发送了这个cookie,一对比就知道是谁了。一定程度解决了登录保持是不会给服务器带来太大负担,而且服务器留存cookie的记录有个有效时长,一定时间收不到客户端的cookie就会清除记录。

  区分一下携带cookie和保持session.

6、数据转发:代理、网管、隧道  

  HTTP 通信时, 除客户端和服务器以外, 还有一些用于通信数据转发的应用程序, 例如代理、 网关和隧道。 它们可以配合服务器工作。 这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器, 并且能接收从那台服务器发送的响应再转发给客户端。

  6.1代理    

  代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。 代理不改变请求 URI, 会直接发送给前方持有资源的目标服务器。持有资源实体的服务器被称为源服务器。 从源服务器返回的响应经过代理服务器后再传给客户端。 缓存代理:代理转发响应时, 缓存代理(Caching Proxy) 会预先将资源的副本(缓存) 保存在代理服务器上。 当代理再次接收到对相同资源的请求时, 就可以不从源服务器那里获取资源, 而是将之前缓存的资源作为响应返回。 透明代理:不对收到的报文信息做任何修改。

  不仅有服务器缓存,还有客户端缓存。识别验证码的时候带上时间戳就是避免浏览器缓存的一种机制。

  6、2网关

  网关的作用和位置和代理差不多,不同的是,网关可以对http报文分析,然后和其他的服务器进行非http通信,例如可以和安全系统联动,分析数据安全性,也可以进行报文加密。

  6、3隧道

  一种长距离加密传输方式,透明存在。

四、http协议头的详解

 

 

 

python爬虫登录保持及对http总结的更多相关文章

  1. python爬虫登录

    python3 urllib.request 网络请求操作 http://www.cnblogs.com/cocoajin/p/3679821.html python实现 爬取twitter用户姓名 ...

  2. python 爬虫登录保存会话去获取只有登录能获取的数据

    #!/usr/bin/env python # -*- coding: utf-8 -*- # import ConfigParser import datetime import sys impor ...

  3. Python3爬虫登录模拟

    使用Python爬虫登录系统之后,能够实现的操作就多了很多,下面大致介绍下如何使用Python模拟登录. 我们都知道,在前端的加密验证,只要把将加密环境还原出来,便能够很轻易地登录. 首先分析登录的步 ...

  4. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  5. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  6. Python爬虫之模拟登录微信wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...

  7. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  8. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  9. Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)

    Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...

随机推荐

  1. Jenkins(5)生成allure报告

    前言 jenkins集成了allure插件,安装插件后运行pytest+allure的脚本即可在jenkins上查看allure报告了. allure安装 在运行代码的服务器本机,我这里是用的dock ...

  2. BZOJ4668: 冷战 (并查集 + LCA)

    题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h ...

  3. 2019牛客多校 Round2

    Solved:2 Rank:136 A Eddy Walker 题意:T个场景 每个场景是一个长度为n的环 从0开始 每次要么向前走要么向后走 求恰好第一次到m点且其他点都到过的概率 每次的答案是前缀 ...

  4. 【noi 2.6_9277】Logs Stacking堆木头(DP)

    题意:给出在最底层的木头的个数,问有多少种堆放木头的方式.要求木头必须互相挨着在一起. 解法:f[i]表示最底层i个木头的堆放木头的方式.注意递推的思想!只需知道上一层堆放0~i-1个(即最底层堆放i ...

  5. hdu3905 Sleeping (区间dp)

    Problem Description ZZZ is an enthusiastic ACMer and he spends lots of time on training. He always s ...

  6. Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph (二分图染色)

    题意:有\(n\)个点,\(m\)条边的无向图,可以给每个点赋点权\({1,2,3}\),使得每个点连的奇偶不同,问有多少种方案,答案对\(998244353\)取模. 题解:要使得每个点所连的奇偶不 ...

  7. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  8. c#记两个变量进行值交换

    今天腊月二十九啦,无心上班,专注划水.然后就在那里翻帖子消磨时光. 看到了这样一个问题,有人提问为什么   a=b+(b=a)*0  ??? 第一眼看上去,我也有点蒙,仔细推敲了一下,嗯~的确是交换了 ...

  9. ArcMobile的CoordinateCollection在逆时针添加点时自动调整节点顺序的问题

    为了使用ArcMobile实现量测功能,LZ自定义了一个MapGraphicLayer用于绘图,代码如下: using System.Drawing; using ESRI.ArcGIS.Mobile ...

  10. linux repo init 遇到的问题

    问题描述: 利用repo从远程服务器上取代码时候,出现错误  fatal: cannot make .repo directory:Permission denied, 加了sudo 之后,还是不行, ...