Python中Cookie的处理(二)cookielib库

               

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

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

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

1. CookieJar

    CookieJar对象存储在内存中。

1
2
3
4
5
6
>>>import urllib2
>>>import cookielib
>>> cookie=cookielib.CookieJar()
>>> handler=urllib2.HTTPCookieProcessor(cookie)
>>> opener=urllib2.build_opener(handler)
>>> opener.open('http://www.google.com.hk'

访问google的cookie已经被捕捉了,来看下是怎样的:

 
 
>>>print cookie
<cookielib.CookieJar[<Cookie NID=67=B6YQoEIEjcqDj-adada_WmNYl_JvADsDEDchFTMtAgERTgRjK452ko6gr9G0Q5p9h1vlmHpCR56XCrWwg1pv6iqhZnaVlnwoeM-Ln7kIUWi92l-X2fvUqgwDnN3qowDWfor .google.com.hk/>, <Cookie PREF=ID=7ae0fa51234ce2b1:FF=0:NW=1:TM=1391219446:LM=1391219446:S=cFiZ5X8ts9NY3cmkfor .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
 
 
 
 

般,我们HTTP抓包得到的Cookie位于Request Header中,格式如下:

Cookie: key1=val1; key2=val2; key3=val3

要使用该字符串发起HTTP请求,有几种方法:

  1. 使用httplib添加到headers中
  2. 使用cookielib创建CookieJar对象在urllib2中使用
  3. 使用requests模块

它们各有不足:

  1. httplib不会自动管理cookie(不会在后续的请求中自动添加、更新、删除过期)
  2. cookielib的处理过程稍复杂
  3. requests需要另安装

使用httplib直接添加cookie到header

如果不需要程序自己管理cookie,这个方法是极简单的。下面简单示例处理GET请求:

 

 

import httplib
import urlparse

def request(url, cookie=''):
    ret = urlparse.urlparse(url)    # Parse input URL
    if ret.scheme == 'http':
        conn = httplib.HTTPConnection(ret.netloc)
    elif ret.scheme == 'https':
        conn = httplib.HTTPSConnection(ret.netloc)
       
    url = ret.path
    if ret.query: url += '?' + ret.query
    if ret.fragment: url += '#' + ret.fragment
    if not url: url = '/'
   
    conn.request(method='GET', url=url , headers={'Cookie': cookie})
    return conn.getresponse()

if __name__ == '__main__':
    cookie_str = 'tLargeScreenP=1; Authorization=Basic%20HereIsMySecret; subType=pcSub; TPLoginTimes=2'
    url = 'http://192.168.1.253'
    html_doc = request(url, cookie_str).read()
    import re
    print 'With Auth:', re.search('<title>(.*?)</title>', html_doc, re.IGNORECASE).group(1)

    html_doc = request(url).read()
    print 'Without Auth:', re.search('<title>(.*?)</title>', html_doc, re.IGNORECASE).group(1)

request函数就是全部的内容,测试IP 192.168.1.253是我房间的无线路由器。第一次HTTP请求带Cookie,第二次不带Cookie,返回的标题不一样:

httplib-cookie

前篇介绍了直接使用httplib发送Cookie,简洁直观。创建cookielib.CookieJar对象自动管理Cookie稍繁琐一些,但是一旦创建,可供urllib2创建opener,后续的所有cookie更新和过期删除都是自动处理的。

1. 解析Cookie Str,得到Cookie.SimpleCookie对象

我们得到的Request Header中,Cookie是这样的格式:

Cookie: key1=val1; key2=val2; key3=val3

第一步是解析它,得到Cookie.SimpleCookie对象。通过字符串构造即可: Cookie.SimpleCookie(cookie_str)

得到的是一个dict-like对象,它的每一个值都是一个Set-Cookie语句,上述例子解析后是:

2. 用SimpleCookie创建cooklib.Cookie对象

上述SimpleCookie不能直接使用,因为一个完整的Cookie,还必须包括额外的字段,如:domain、path、expires等。第二步工作是创建cooklib.Cookie对象,直接将key, value传入cooklib.Cookie类的构造函数即可。

得到一系列cookielib.Cookie对象,便可以依次用它们来更新CookieJar了。

3. 完整的示例代码

import cookielib
import Cookie
import urllib2

def build_opener_with_cookie_str(cookie_str, domain, path='/'):
    simple_cookie = Cookie.SimpleCookie(cookie_str)    # Parse Cookie from str
    cookiejar = cookielib.CookieJar()    # No cookies stored yet

    for c in simple_cookie:
        cookie_item = cookielib.Cookie(
            version=0, name=c, value=str(simple_cookie[c].value),
                     port=None, port_specified=None,
                     domain=domain, domain_specified=None, domain_initial_dot=None,
                     path=path, path_specified=None,
                     secure=None,
                     expires=None,
                     discard=None,
                     comment=None,
                     comment_url=None,
                     rest=None,
                     rfc2109=False,
            )
        cookiejar.set_cookie(cookie_item)    # Apply each cookie_item to cookiejar
    return urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))  

  # Return opener


if __name__ == '__main__':
    cookie_str = 'tLargeScreenP=1; Authorization=Basic%20HereIsMySecret; subType=pcSub; TPLoginTimes=2'
    opener = build_opener_with_cookie_str(cookie_str, domain='192.168.1.253')
  
    html_doc = opener.open('http://192.168.1.253').read()
    import re
    print 'Open With Cookie:', re.search('<title>(.*?)</title>', html_doc, re.IGNORECASE).group(1)

    html_doc = urllib2.urlopen('http://192.168.1.253').read()
    print 'Open Without Cookie:', re.search('<title>(.*?)</title>', html_doc, re.IGNORECASE).group(1)

           

猜你喜欢

转载自blog.csdn.net/qq_44910432/article/details/89295648
今日推荐