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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
用Python中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
python图片验证码生成代码
Jul 02 Python
python中时间模块的基本使用教程
May 14 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
python logging模块的使用详解
Oct 23 Python
python两种获取剪贴板内容的方法
Nov 06 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
封装获取dom元素的简单实例
2016/07/08 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
大学生毕业鉴定
2014/01/31 职场文书
校园活动宣传方案
2014/03/28 职场文书
科学发展观演讲稿
2014/09/11 职场文书
购房委托书
2014/10/15 职场文书
销售员岗位职责
2015/02/10 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js