本来写到这里我认为我们这个实例已经讲解完成了,但是当我回过头看之后,发现之前一些比较模糊或者不是很确定的事情,在这里得到了一些新的的认识,所以觉得有必要在这里记录一下
为什么登陆的源码中要使用函数获取cookies
我记得我在第40小节的时候比较了几种方法获取的cookies,最后我们选择了firebug工具获取的cookies来直接登陆,当时也说过使用代码获取的cookies会受到限制,但是,我们在模拟登陆中,对于cookies的我们还是使用代码来获取并且处理,为什么要这样做呢?不是说会受到限制吗?
首先第一个原因是我们除了这个程序没有别的程序可以实现处理cookies的功能了,我们要在代码中模拟登陆的整个流程,这中间肯定是不能断开然后再去浏览器取cookies的,而python中似乎也只有这个库能实现cookies的处理,但实际上,我一直对这个问题耿耿于怀,所以,现在我们就来对比看看这几个cookies有什么区别,首先还是先贴上上次的源码
#!/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有什么区别,所以我还是做了这样的尝试,虽然这看起来并没有什么卵用
还是使用前面模拟登陆的绿野网站,首先我分别获取登陆前浏览器和代码获取的cookies,当然,为了将其他的干扰因素减到最小,在做这一切操作之前,我们还需要将浏览器原本的cookies全部删除
登陆前,浏览器
登陆前,代码
PHPSESSID:7v0lru00p00trv1sdjk7mbrr90
登陆后,浏览器
登陆后,代码(这本来是很长的,为了方便显示,我给他来了一个腰斩)
<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是完全没有问题的
来源:oschina
链接:https://my.oschina.net/u/2429887/blog/544499