zoukankan      html  css  js  c++  java
  • python爬虫登录保持及对http总结

    【前言】这几天一直看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协议头的详解

     

     

     

  • 相关阅读:
    go 本地安装 grpc-go
    vscode python code-runner 中文乱码解决
    spring-cloud-sleuth 学习资源
    vscode 快键键资源整理
    vscode and python
    redis分布式锁
    TF-IDF算法解释
    spring 4.1 xml配置头部信息 maven配置信息
    google像apple 30亿美元购买流量
    spring 启动异常Failed to read candidate component class
  • 原文地址:https://www.cnblogs.com/huangfuyuan/p/9347861.html
Copyright © 2011-2022 走看看