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实现的阳历转阴历(农历)算法
Apr 25 Python
Python找出list中最常出现元素的方法
Jun 14 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
Django中反向生成models.py的实例讲解
May 30 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
通过python顺序修改文件名字的方法
Jul 11 Python
python调用摄像头显示图像的实例
Aug 03 Python
Python 判断奇数偶数的方法
Dec 20 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
python实现俄罗斯方块小游戏
Apr 24 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python类的动态修改的实例方法
2017/03/24 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
python 简单的调用有道翻译
2020/11/25 Python
python wsgiref源码解析
2021/02/06 Python
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
元宵晚会主持词
2014/03/25 职场文书
什么是就业协议书
2014/04/17 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
解除劳动合同协议书
2014/09/17 职场文书
解决 redis 无法远程连接
2022/05/15 Redis