详解在Python程序中使用Cookie的教程


Posted in Python onApril 30, 2015

大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。

为什么要使用Cookie呢?

Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。

在此之前呢,我们必须先介绍一个opener的概念。
1.Opener

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。

如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。
2.Cookielib

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。 Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录 功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

它们的关系:CookieJar —-派生—->FileCookieJar —-派生—?>MozillaCookieJar和LWPCookieJar
1)获取Cookie保存到变量

首先,我们先利用CookieJar对象实现获取cookie的功能,存储到变量中,先来感受一下
 

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 'Name = '+item.name
  print 'Value = '+item.value

我们使用以上方法将cookie保存到变量中,然后打印出了cookie中的值,运行结果如下
 

Name = BAIDUID
Value = B07B663B645729F11F659C02AAE65B4C:FG=1
Name = BAIDUPSID
Value = B07B663B645729F11F659C02AAE65B4C
Name = H_PS_PSSID
Value = 12527_11076_1438_10633
Name = BDSVRTM
Value = 0
Name = BD_HOME
Value = 0

2)保存Cookie到文件

在上面的方法中,我们将cookie保存到了cookie这个变量中,如果我们想将cookie保存到文件中该怎么做呢?这时,我们就要用到

FileCookieJar这个对象了,在这里我们使用它的子类MozillaCookieJar来实现Cookie的保存
 

import cookielib
import urllib2
 
#设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)

关于最后save方法的两个参数在此说明一下:

官方解释如下:

  •     ignore_discard: save even cookies set to be discarded.
  •     ignore_expires: save even cookies that have expiredThe file is overwritten if it already exists

由此可见,ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果在该文件中 cookies已经存在,则覆盖原文件写入,在这里,我们将这两个全部设置为True。运行之后,cookies将被保存到cookie.txt文件中, 我们查看一下内容,附图如下

 3)从文件中获取Cookie并访问

那么我们已经做到把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法来读取cookie并访问网站,感受一下
 

import cookielib
import urllib2
 
#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()

设想,如果我们的 cookie.txt 文件中保存的是某个人登录百度的cookie,那么我们提取出这个cookie文件内容,就可以用以上方法模拟这个人的账号登录百度。
4)利用cookie模拟网站登录

下面我们以我们学校的教育系统为例,利用cookie实现模拟登录,并将cookie信息保存到文本文件中,来感受一下cookie大法吧!

注意:密码我改了啊,别偷偷登录本宫的选课系统 o(?□?)o
 

import urllib
import urllib2
import cookielib
 
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({
      'stuid':'201200131012',
      'pwd':'23342321'
    })
#登录教务系统的URL
loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'
#模拟登录,并把cookie保存到变量
result = opener.open(loginUrl,postdata)
#保存cookie到cookie.txt中
cookie.save(ignore_discard=True, ignore_expires=True)
#利用cookie请求访问另一个网址,此网址是成绩查询网址
gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'
#请求访问成绩查询网址
result = opener.open(gradeUrl)
print result.read()

以上程序的原理如下

创建一个带有cookie的opener,在访问登录的URL时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。

如登录之后才能查看的成绩查询呀,本学期课表呀等等网址,模拟登录就这么实现啦,是不是很酷炫?

Python 相关文章推荐
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
Python入门_条件控制(详解)
May 16 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
20行python代码实现人脸识别
May 05 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
Python: 传递列表副本方式
Dec 19 Python
python文件编写好后如何实践
Jul 07 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
python的数学算法函数及公式用法
Nov 18 Python
Python基础之字符串格式化详解
Apr 21 Python
处理Python中的URLError异常的方法
Apr 30 #Python
介绍Python的Urllib库的一些高级用法
Apr 30 #Python
python插入数据到列表的方法
Apr 30 #Python
Python的Urllib库的基本使用教程
Apr 30 #Python
python获取当前日期和时间的方法
Apr 30 #Python
python实现TCP服务器端与客户端的方法详解
Apr 30 #Python
python排序方法实例分析
Apr 30 #Python
You might like
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
简单学习vue指令directive
2016/11/03 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python实现ip地址的包含关系判断
2020/02/07 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
金融专业个人求职信范文
2013/11/28 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫