python处理cookie详解


Posted in Python onFebruary 07, 2014

要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头:

Set-Cookie:session=8345234;expires=Sun,15-Nov-2013 15:00:00 GMT;path=/;domain=baidu.com

expires是cookie的生存周期,path是cookie的有效路径,domain是cookie的有效域.

路径"path"用于设置可以读取一个cookie的最顶层的目录.

将cookie的路径设置为你的网页最顶层的目录可以让该该目录下的所有网页都能访问该cookie.

方法:在你的cookie中加入path=/; 如果你只想让"food" 目录中的网页可以使用该cookie,则你加入path=/food;.

domain:有些网站有许多小的域名,例如百度可能还在"news.baidu.com" "zhidao.baidu.com" 和"v.baidu.com" 域名下有网页.

如果想让"baidu.com"下的所有机器都可以读取该cookie,必须在cookie中加入 "domain=.baidu.com" .

用户浏览器会存储Cookie直到过期,浏览器会向符合path和domain的服务器发送类似以下内容的HTTP请求报头:

Cookie:session=8345234。

例如,登陆www.baidu.com的时候,百度服务器发送回的HTTP响应报头中cookie是:

Set-Cookie:H_PS_PSSID=4681_4567_1452_9876_4759; path=/; domain=.baidu.com
Set-Cookie:BDSVRTM=74; path=/

浏览器的HTTP请求报头:

Cookie:BAIDUID=0FD996SDFG12********107B9C227F4C:FG=1; locale=zh; bdshare_firstime=1384567418140; NBID=D830DD2345HH2818A9F4134E5A2D778D3B:FG=1; H_PS_LC=4_shadu2014; BD_CK_SAM=1; H_PS_PSSID=4681_4567_1452_9876_4759

浏览器将cookie发送回HTTP服务器时,使用key=value字符串的编码形式,不返回expires,path和domain等可选属性。

cookie字符串通常位于HTTP_COOKIE环境变量中,可以如下读取:

import os
print "Content-type: text/plain\n"
if "HTTP_COOKIE" in os.environ:
    print os.environ["HTTP_COOKIE"]
else:
    print "HTTP_COOKIE not set!"

Python中Cookie模块(python2,python3中为http.cookies)提供了一个类似字典的特殊对象SimpleCookie,其中存储并管理着称为Morsel的cookie值集合。

每个Morsel都有name,value以及可选属性(expires,path,domain,comment,max-age,secure,version,httponly)。

SimpleCookie可使用output()方法创建以HTTP报头形式表示的cookie数据输出,用js_output()方法生成包含javascript代码的字符串。

用HTTP_COOKIE生成cookie:

cookie=Cookie.SimpleCookie(os.environ['HTTP_COOKIE'])
print cookie.output()

set cookie:

import Cookie
import datetime
import randomexpiration = datetime.datetime.now() + datetime.timedelta(days=30)
cookie = Cookie.SimpleCookie()
cookie["session"] = random.randint(1,1000000000)
cookie["session"]["domain"] = ".baidu.com"
cookie["session"]["path"] = "/"
cookie["session"]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")
print "Content-type: text/plain"
print cookie.output()
print
print "Cookie set with: " + cookie.output()

输出:

Content-type: text/plain
Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/
Cookie set with: Set-Cookie: session=155209565; Domain=.jayconrod.com; expires=Mon, 03-Mar-2014 07:42:47 PST; Path=/

Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持。

该模块主要功能是提供可存储cookie的对象。使用此模块捕获cookie并在后续连接请求时重新发送,还可以用来

处理包含cookie数据的文件。

这个模块主要提供了这几个对象,CookieJar,FileCookieJar,MozillaCookieJar,LWPCookieJar。

CookieJar对象存储在内存中。

>>> import urllib2
>>> import cookielib
>>> cookie=cookielib.CookieJar()
>>> handler=urllib2.HTTPCookieProcessor(cookie)
>>> opener=urllib2.build_opener(handler)
>>> opener.open('http://www.google.com.hk')<addinfourl at 161806444 whose fp = <socket._fileobject object at 0x9a348ac>>

访问google的cookie已经被捕捉了。

来看下是怎样的:

>>> print cookie
<cookielib.CookieJar[<Cookie NID=67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW for .google.com.hk/>, <Cookie PREF=ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk for .google.com.hk/>]>

看来是Cookie实例的集合,Cookie实例有name,value,path,expires等属性:

>>> for ck in cookie:
...     print ck.name,':',ck.value
... 
NID : 67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDW
PREF : ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmk

也可以将cookie捕捉到文件中。

FileCookieJar(filename)

创建FileCookieJar实例,检索cookie信息并将信息存储到文件中,filename是文件名。

MozillaCookieJar(filename)

创建与Mozilla cookies.txt文件兼容的FileCookieJar实例。

LWPCookieJar(filename)

创建与libwww-perl Set-Cookie3文件兼容的FileCookieJar实例。

代码:

import urllib2
import cookielib
def HandleCookie():
     #handle cookie whit file
     filename='FileCookieJar.txt'
     url='http://www.google.com.hk'
     FileCookieJar=cookielib.LWPCookieJar(filename)
     FileCookeJar.save()
     opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(FileCookieJar))
     opener.open(url)
     FileCookieJar.save()
     print open(filename).read() 
     #read cookie from file
     readfilename = "readFileCookieJar.txt"
     MozillaCookieJarFile =cookielib.MozillaCookieJar(readfilename)
     print MozillaCookieJarFile        
     MozillaCookieJarFile.load(cookieFilenameMozilla)
     print MozillaCookieJarFile
 if __name__=="__main__":
     HandleCookie()
Python 相关文章推荐
python算法学习之计数排序实例
Dec 18 Python
Python with用法实例
Apr 14 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
python实现超市扫码仪计费
May 30 Python
tensorflow实现加载mnist数据集
Sep 08 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
Python unittest基本使用方法代码实例
Jun 29 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
urllib2自定义opener详解
Feb 07 #Python
python解析html开发库pyquery使用方法
Feb 07 #Python
python3.3实现乘法表示例
Feb 07 #Python
zbar解码二维码和条形码示例
Feb 07 #Python
python命令行参数sys.argv使用示例
Jan 28 #Python
python删除文件示例分享
Jan 28 #Python
python list转dict示例分享
Jan 28 #Python
You might like
PHP实现唤起微信支付功能
2019/02/18 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
python中的__slots__使用示例
2015/02/26 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
Python 处理文件的几种方式
2019/08/23 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
优秀团支部事迹材料
2014/02/08 职场文书
高中运动会入场词
2014/02/14 职场文书
英文自荐信常用句子
2014/03/26 职场文书
设备收款委托书范本
2014/10/02 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
毕业实习感受与体会
2015/05/26 职场文书
校运会新闻稿
2015/07/17 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
python_tkinter事件类型详情
2022/03/20 Python
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang