原本写到这里我认为咱们这个实例已经讲解完成了,可是当我回过头看以后,发现以前一些比较模糊或者不是很肯定的事情,在这里获得了一些新的的认识,因此以为有必要在这里记录一下python
为何登录的源码中要使用函数获取cookies
浏览器
我记得我在第40小节的时候比较了几种方法获取的cookies,最后咱们选择了firebug工具获取的cookies来直接登录,当时也说过使用代码获取的cookies会受到限制,可是,咱们在模拟登录中,对于cookies的咱们仍是使用代码来获取而且处理,为何要这样作呢?不是说会受到限制吗?服务器
首先第一个缘由是咱们除了这个程序没有别的程序能够实现处理cookies的功能了,咱们要在代码中模拟登录的整个流程,这中间确定是不能断开而后再去浏览器取cookies的,而python中彷佛也只有这个库能实现cookies的处理,但实际上,我一直对这个问题耿耿于怀,因此,如今咱们就来对比看看这几个cookies有什么区别,首先仍是先贴上上次的源码cookie
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" import urllib2 import cookielib #声明一个CookieJar对象实例来保存cookie cookie = cookielib.CookieJar() #利用urllib2库的HTTPCookieProcessor对象来建立cookie处理器 handler=urllib2.HTTPCookieProcessor(cookie) #经过handler来构建opener opener = urllib2.build_opener(handler) #此处的open方法同urllib2的urlopen方法,也能够传入request response = opener.open('http://www.baidu.com') for item in cookie: print item.name+':'+item.value
我这里使用的是百度的url,咱们知道百度是须要登录的,咱们从浏览器获取到的是登录以后的cookies,而咱们这个代码是不能实现登录的,因此获取的是未登录的cookies,这两个cookies确定是不同的,通过前面的解释应该很容易理解,但是我真的很想知道登录前和登录后,经过浏览器和经过代码获取的cookies有什么区别,因此我仍是作了这样的尝试,虽然这看起来并无什么卵用session
仍是使用前面模拟登录的绿野网站,首先我分别获取登录前浏览器和代码获取的cookies,固然,为了将其余的干扰因素减到最小,在作这一切操做以前,咱们还须要将浏览器本来的cookies所有删除
函数
登录前,浏览器工具
登录前,代码网站
PHPSESSID:7v0lru00p00trv1sdjk7mbrr90
登录后,浏览器ui
登录后,代码(这原本是很长的,为了方便显示,我给他来了一个腰斩)url
<cookielib.CookieJar[<Cookie PHPSESSID=jm7n7e8qrbhc1j95mrvf5lbq03 for www.lvye.org/>, <Cookie lvyebbs=1e9bec842fcbfeca3668f75b2921d2058d0dac3e99f217be35f9da07f59032aa for www.lvye.org/>]>
咱们来分析一下这几组数据,首先,不论是登录前仍是登录后,使用两种方法获取的两组数据是不同的,在浏览器获取的数据中,登录前和登录后,PHPSESSID是同样的,可是登录后多了一项,而使用代码获取的cookies中,登录先后数据都是不同的,这是为何呢?
这得说到session,也就是会话,只要向服务器发送请求,就能够算是发起一次会话,会话的时间有长有短,具体的能够上网去查一下,cookies里面的PHPSESSID就是会话的id,咱们使用浏览器打开绿野网并登录的过程当中,因为网页一直没有关闭,也就是说一直保持着这一个会话,因此PHPSESSID是同一个,可是,登录先后,cookies会变化,前面也说到,登录后的cookies会带有浏览器返回来的一个标识,因此,浏览器获取到的cookies也是变化的,浏览器君仍是很诚实的,那么,代码呢?
首先第一次的代码是使用cookielib获取的,也就是上面的那段代码,而第二次使用的是模拟登录的源码,只是将获取到的cookies输出出来,因此这两次使用的代码是彻底没问题的,可是为何这两次代码获取的结果都没一个同样的呢?
代码虽然能获取cookies,可是却不能保持会话,也就是说,两次代码总共发起了两次会话,因此获取的PHPSESSID并不同,可是咱们能够看到,虽然登录先后的值不同,可是内容,项目和浏览器获取的是同样的,说明使用cookielib获取的cookies是可靠的
2. opener自动处理cookies
前面也说到,urlopen不具备处理cookies和验证等功能,因此要使用opener,后面的代码中也屡次说到opener会自动对cookies进行处理并在下一次访问的时候自动携带cookies进行访问,可是这个"自动"是怎么回事呢?咱们来编写代码试试看吧
咱们就找新鲜的代码,前面的验证码登录中咱们接触到不少的cookies,因此,咱们用这个例子来尝试最合适不过了,咱们将这个过程当中全部的cookies都输出来看看吧,代码就不贴上来了,咱们直接来看结果吧
<cookielib.CookieJar[<Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]> <cookielib.CookieJar[<Cookie IF_REAL=0 for .ifeng.com/>, <Cookie IF_TIME=1450140425515 for .ifeng.com/>, <Cookie IF_USER=2027598917%40qq.com for .ifeng.com/>, <Cookie sid=45CC6C7439F91C9EDDC19C800306B899user66726221 for .ifeng.com/>, <Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]> <cookielib.CookieJar[<Cookie IF_REAL=0 for .ifeng.com/>, <Cookie IF_TIME=1450140425515 for .ifeng.com/>, <Cookie IF_USER=2027598917%40qq.com for .ifeng.com/>, <Cookie reborn=AncOJghiBSwEPgY2BzcGNFFrC2IGYwAx for .ifeng.com/>, <Cookie sid=45CC6C7439F91C9EDDC19C800306B899user66726221 for .ifeng.com/>, <Cookie PHPSESSID=d7g7molaicj3ckredp085km2l4 for id.ifeng.com/>]>
咱们看到这里的PHPSESSID是同一个的,也就说明了在这个代码中,因为全部操做都是按从上到下的顺序进行的,因此整个过程都保持在一个会话中,并且,三个不一样状态的cookies也是不同的,这也跟前面说的验证码的机制相吻合,整个过程当中咱们只使用一个opener,只对cookies进行一次获取的操做,然后面却可以输出三个不一样cookies,这因此也体现了opener可以对cookies进行自动处理,不须要咱们重复获取
为了对比咱们再来看看浏览器获取的几个cookies
登陆前
输入验证码登陆后
进入个人博客
除了一些乱七八糟的数据以外,可是这些数据也是不会变的,大致上的数据是同样的,并且登陆先后数据的变化也跟代码里面显示的同样,至于为何会多出这么多数据,这有多是浏览器的设置或者什么的,可是,咱们能够肯定的是,使用cookielib处理的cookies是彻底没有问题的