js333 > 计算机互联网 > python中cookielib模块的使用方法,python的cookielib说

原标题:python中cookielib模块的使用方法,python的cookielib说

浏览次数:63 时间:2019-10-04

cookielib是一个自动处理cookies的模块,如果我们在使用爬虫等技术的时候需要保存cookie,那么cookielib会让你事半功倍!他最常见的搭档模块就是python下的urllib和request。

cookielib介绍

Python模拟登陆练习——imooc.com登陆,pythonimooc.com

写下这篇文章的时候,是博主学习python的第三天( 也许是第四天:( ),python是博主接触的第二门解释型语言(第一门是javascript)。

讲真在很久之前就想要用博客记录自己的学习历程了,然而就像写日记一样,写着写着就放弃了-。-

so今天决定给自己一个好的开端~

博主的学习方式是直奔目的,遇到问题百度各种博客,网站,百度找不到google找,就这样。这种学习方式是真的见效快,但显而易见,基础会比较薄弱。

因此学习python的基本语法,就直奔爬虫了!

-----------------------------------以上是一段大前言---------------------------------------------

今天博主要把三天学习spider的过程,经验分享出来,希望能给一些新手们指点一下道路,也给自己的python生涯刻一道痕迹。

博主愚以为,模拟登陆网站无非有两种方式:

现在让博主以imooc.com为例讲解一下网站的模拟登陆

自学Python之五 爬虫基础练习之SmartQQ协议,pythonsmartqq

  BAT站在中国互联网的顶端,引导着中国互联网的发展走向。。。既受到了多数程序员的关注,也在被我们所惦记着。。。

  关于SmartQQ的协议来自HexBlog,根据他的博客我自己也一步一步的去分析,去尝试,自己不了解不知道的总是神秘的,如果你有这种好奇心,那么真相就只有一个。接下来我先把协议放出来,至于分析方法,以后有机会再谈谈。。。其实我也是个半吊子水平。。。谁知道下次改了协议还灵不灵呢!

  登录之前,获取二维码:

  循环获取二维码状态(是否失效,是否在手机上授权):   refer为:

  获取cookie中ptwebqq:这次的url是手机扫描二维码之后得到的返回值。refer不变。

  获取返回值vfwebqq:" + ptwebqq + "&clientid=53999199&psessionid=&t=1446710396202。refer为

  成功登录,得到uin,psessionid:"

  根据得到的信息获取好友列表:

  让我们来看看程序:

1 #HttpClient.py
  # -*- coding: utf-8 -*- 2 import cookielib, urllib, urllib2, socket 3 4 class HttpClient: 5 __cookie = cookielib.CookieJar() 6 __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie)) 7 __req.addheaders = [ 8 ('Accept', 'application/javascript, */*;q=0.8'), 9 ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)') 10 ] 11 urllib2.install_opener(__req) 12 13 def Get(self, url, refer=None): 14 try: 15 req = urllib2.Request(url) 16 if not (refer is None): 17 req.add_header('Referer', refer) 18 return urllib2.urlopen(req, timeout=120).read() 19 except urllib2.HTTPError, e: 20 return e.read() 21 except socket.timeout, e: 22 return '' 23 except socket.error, e: 24 return '' 25 26 def GetWithOutRead(self, url, refer=None): 27 try: 28 req = urllib2.Request(url) 29 if not (refer is None): 30 req.add_header('Referer', refer) 31 return urllib2.urlopen(req, timeout=120) 32 except urllib2.HTTPError, e: 33 return e.read() 34 except socket.timeout, e: 35 return '' 36 except socket.error, e: 37 return '' 38 39 def Post(self, url, data, refer=None): 40 try: 41 #req = urllib2.Request(url, urllib.urlencode(data)) 42 req = urllib2.Request(url,data) 43 if not (refer is None): 44 req.add_header('Referer', refer) 45 return urllib2.urlopen(req, timeout=120).read() 46 except urllib2.HTTPError, e: 47 return e.read() 48 except socket.timeout, e: 49 return '' 50 except socket.error, e: 51 return '' 52 53 def Download(self, url, file): 54 output = open(file, 'wb') 55 output.write(urllib2.urlopen(url).read()) 56 output.close() 57 61 def getCookie(self, key): 62 for c in self.__cookie: 63 if c.name == key: 64 return c.value 65 return '' 66 67 def setCookie(self, key, val, domain): 68 ck = cookielib.Cookie(version=0, name=key, value=val, port=None, port_specified=False, domain=domain, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False) 69 self.__cookie.set_cookie(ck)

  1 #WebQQ.py
  2 # -*- coding: utf-8 -*-
  3 from Tkinter import *
  4 from time import sleep
  5 from HttpClient import HttpClient
  6 import json,io
  7 from multiprocessing import Process
  8 import multiprocessing
  9 from PIL import Image, ImageTk
 10 class WebQQ(HttpClient):
 11     def __init__(self):
 12         self.__cookie = ""
 13         self.__ptwebqq = ""
 14         self.__vfwebqq = ""
 15         self.__hash = ""
 16         self.__uin = ""
 17         self.__root = ""
 18         self.__psessionid = ""
 19         self.queue = multiprocessing.Queue()
 20 
 21     #获取二维码
 22     def __ptqrshow(self):
 23         img = self.Get(url="https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&e=0&l=M&s=5&d=72&v=4&t=0.4139144900254905")
 24         if(img!=None):
 25             data_stream = io.BytesIO(img)
 26             imgfile = Image.open(data_stream)
 27             p = Process(target=self._run_proc, args=(imgfile,))
 28             p.start()
 29             print(u"二维码下载完毕,请尽快扫描...")
 30             return True
 31         else:
 32             print(u"二维码下载失败")
 33             return False
 34 
 35     #检测扫码状态,登录进度
 36     def __ptqrlogin(self):
 37         res = self.Get("https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1"+
 38                        "&login2qq=1&aid=501004106&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10"+
 39                        "&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=0-0-136435"+
 40                        "&mibao_css=m_webqq&t=undefined&g=1&js_type=0&js_ver=10139&login_sig=&pt_randsalt=0",
 41                        "https://ui.ptlogin2.qq.com/cgi-bin/login")
 42         if(res!=None):
 43             result = res.find("登录成功")
 44             if(result==-1):
 45                 sleep(1)
 46 
 47                 return self.__ptqrlogin()
 48             elif(result!=-1):
 49                 res = res.decode("UTF-8")
 50                 return self.__check_sig(res[res.find("http"):res.find(u"','0','登录成功!'")].encode())
 51             else:
 52                 return False
 53         else:
 54             return False
 55     #获得ptwebqq  cookie
 56     def __check_sig(self,url):
 57         res = self.Get(url=url,refer="https://ui.ptlogin2.qq.com/cgi-bin/login")
 58         if(res!=None):
 59             self.__ptwebqq = self.getCookie("ptwebqq")
 60             self.__getvfwebqq()
 61             return self.__login2()
 62         else:
 63             return False
 64     #获得vfwebqq  cookie
 65     def __getvfwebqq(self):
 66         res = self.Get(url="http://s.web2.qq.com/api/getvfwebqq?ptwebqq="+self.__ptwebqq+
 67                        "&clientid=53999199&psessionid=&t=1446710396202",
 68                      refer="http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1")
 69         if(res!=None):
 70             jsn = json.loads(res)
 71             self.__vfwebqq = jsn["result"]["vfwebqq"]
 72     #登录 获取uin psessionid
 73     def __login2(self):
 74         data = "r=%7B%22ptwebqq%22%3A%22"+self.__ptwebqq+"%22%2C%22clientid%22%3A53999199%2C%22psessionid%22%3A%22%22%2C%22status%22%3A%22online%22%7D"
 75 
 76         res = self.Post(url = "http://d1.web2.qq.com/channel/login2",
 77                         data = data.encode(encoding="utf8"),
 78                         refer = "http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2")
 79         if(res==None):
 80             return False
 81         jsn = json.loads(res)
 82         if(jsn["retcode"]==0):
 83             self.__uin = jsn["result"]["uin"]
 84             self.__psessionid = jsn["result"]["psessionid"]
 85             self.__hash = self.__friendsHash(self.__uin,self.__ptwebqq)
 86             self.__get_user_friends()
 87             return True
 88         else:
 89             return False
 90     #好友的hash  参考HexBlog  
 91     def __friendsHash(self,uin,pt):
 92         N=[0 for x in range(4)]
 93         V=[0 for x in range(4)]
 94         U=[0 for x in range(8)]
 95         #    字符串转换为字符数组
 96         k=pt.encode(encoding="UTF8")
 97         n=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
 98         for x in range(len(k)):
 99             N[x%4]^=ord(k[x])
100         x=int(uin)
101         V[0] = x >> 24 & 255 ^ 69;
102         V[1] = x >> 16 & 255 ^ 67;
103         V[2] = x >> 8 & 255 ^ 79;
104         V[3] = x & 255 ^ 75;        
105         for x in range(8):
106             U[x]=(x%2==0) and N[x>>1] or V[x>>1]
107         result=""
108         for x in U:
109             result+=n[x>>4&15]
110             result+=n[x&15]
111         return result
112     #获取好友列表
113     def __get_user_friends(self):
114         data="r=%7B%22vfwebqq%22%3A%22"+self.__vfwebqq+"%22%2C%22hash%22%3A%22"+self.__hash+"%22%7D"
115         res=self.Post(url="http://s.web2.qq.com/api/get_user_friends2",
116                        data=data.encode(encoding="utf8"),
117                          refer="http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1")
118         if(res!=None):
119             #    记录好友列表
120             jsn=json.loads(res)
121             if(jsn["retcode"]==0):
122                 #    正确返回列表后
123                 for x in jsn["result"]["marknames"]:
124                     print (x["markname"])
125     #心跳包并接收消息,现在不能用了
126     #def __poll(self):
127     #    data="r=%7B%22ptwebqq%22%3A%22"+self.__ptwebqq+"%22%2C%22clientid%22%3A53999199%2C%22psessionid%22%3A%22"+self.__psessionid +"%22%2C%22key%22%3A%22%22%7D"
128     #    res=self.Post(url="http://d1.web2.qq.com/channel/poll2",
129     #                  data=data.encode(encoding="utf8"),
130     #                  refer="http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2")
131     #    if(res!=None):
132     #        print res
133 
134     def __check_queue(self):
135         try:
136             out = self.queue.get_nowait()
137             if out == 'stop':
138                 self.__do_stop()
139                 return
140             # Could check for other commands here, too
141         except :
142             pass
143         self.__root.after(100, self.__check_queue)
144 
145     def __stop(self):
146         self.queue.put('stop')
147 
148     def __do_stop(self):
149         self.__root.destroy()
150 
151     def _run_proc(self,imgfile):
152         self.__root = Tk()
153         result = ImageTk.PhotoImage(imgfile)
154         label = Label(self.__root, image=result)
155         label.pack()
156         self.__root.after(100, self.__check_queue)
157         self.__root.mainloop()
158     def run(self):
159         if(self.__ptqrshow()):
160             if(self.__ptqrlogin()):
161                 print(u"登录成功")
162                 self.__stop()
163 
164 if  __name__ =="__main__":
165     qq=WebQQ()
166     qq.run()

 

爬虫基础练习之SmartQQ协议,pythonsmartqq BAT站在中国互联网的顶端,引导着中国互联网的发展走向。。。既受到了多数程序员的...

但是老高在使用cookielib的时候总是碰到这样那样的问题,在查看cookielib的源码后,有所感悟。

I. 核心类

 开始

博主习惯用urllib2+cookielib的方式写爬虫,所以代码的一开始是这样的:

#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import urllib2
import urllib
import cookielib
#以上是套路
#以下创建一个cookiejar管理cookie,同时创建opener并安装到urllib2中
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
opener.addheaders=[('user-agent','Mozilla/5.0')]

 

opener.addheaders可以以list的形式添加header,非常方便

I. 核心类

Cookie

 然后

cookie是一种服务器记录用户信息的小文件,尽管有时候会侵犯大家的隐私,但是在存储用户的登录信息实现自动登陆的方式还是很方便的。

它的工作流程是这样的:

了解cookie的工作原理后,我们访问一下主页,把cookie搞下来

Cookie

该类实现了Netscape and RFC 2965 cookies定义的cookie标准,基本可以理解为某一条cookie数据。

博主是这样写的:

#先写下几条url
url_login = 'http://www.imooc.com/passport/user/login'
url_index = 'http://www.imooc.com'
url_test = 'http://www.imooc.com/user/setbindsns'
data = {
    'username':'*********',
    'password':'*******',
    'verify':'',
    'remember':'1',
    'pwencode':'0',
    'referer':'http://www.imooc.com'
}
data_encoded = urllib.urlencode(data)

#get主页获取cookie
req_index = urllib2.Request(url_index)
res_index = opener.open(req_index)

我们可以打印下cookie看看:

print cj._cookies

 

该类实现了Netscape and RFC 2965 cookies定义的cookie标准,基本可以理解为某一条cookie数据。

部分代码如下,很多属性是不是很眼熟?

 {'www.imooc.com': {'/': {'PHPSESSID': Cookie(version=0, name='PHPSESSID', value='3q1c66hds4h054f19ciqb4rtg2', port=None, port_specified=False, domain='www.imooc.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)}}, '.imooc.com': {'/': {'imooc_isnew_ct': Cookie(version=0, name='imooc_isnew_ct', value='1486280759', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), 'cvde': Cookie(version=0, name='cvde', value='5896d8376631d-1', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False), 'imooc_isnew': Cookie(version=0, name='imooc_isnew', value='1', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), 'imooc_uuid': Cookie(version=0, name='imooc_uuid', value='d6a73549-4d53-47b6-90bc-28888d3438b8', port=None, port_specified=False, domain='.imooc.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)}}}

这是什么,我不知道。Let it go.

部分代码如下,很多属性是不是很眼熟?

        self.domain_initial_dot = domain_initial_dot
        self.path = path
        self.path_specified = path_specified
        self.secure = secure
        self.expires = expires
        self.discard = discard
        self.comment = comment
        self.comment_url = comment_url
        self.rfc2109 = rfc2109

然后

那我们带着cookie去登陆吧!不知道带哪一条?全带走!

req_login = urllib2.Request(url_login,data_encoded)
res_login = opener.open(req_login)

 

我们试着把结果打印在html上:

imooc = open('e:/imooc.html','w')
imooc.write(res_login.read())
imooc.close()

 当我们打开: 图片 1

 这TM好像不是个html,通常情况下他会返回一个html,然而这串符号难住了学了3天python的小白。

注意到一条信息: “msg” : "u6210u529f"显然是unicode格式的字符串,简单转化后,他的意思是 :“成功” 

博主窃喜。既然成功了,那么有效信息一定存在于这串符号中。 

到此,正确的思路是,拿着这2条url,uid用开发者工具继续搜索相关信息。

。。

然而博主走了一条小弯路。

        self.domain_initial_dot = domain_initial_dot
        self.path = path
        self.path_specified = path_specified
        self.secure = secure
        self.expires = expires
        self.discard = discard
        self.comment = comment
        self.comment_url = comment_url
        self.rfc2109 = rfc2109
CookiePolicy

CookiePolicy

逆向分析大法

博主决定把登陆之后的cookies复制下来,逐条测试登陆需要的cookie

很简单,一条一条的删,看什么时候能登陆就好了。。。

。。。。

经过筛选,博主找到2条我们需要的cookie:loginstate、apsid。

于是博主决定在近百条cookie中找一下apsid这条信息

。。。

找到了!

图片 2

 

而访问的url就是我们得到的2条之一!只是带了几个参数

实践证明这2条随便选一条get一下就得到我们需要的cookie了。

该类的主要功能是收发cookie,即确保正确的cookie发往对应的域名,反之一样。

该类的主要功能是收发cookie,即确保正确的cookie发往对应的域名,反之一样。

窃喜

我们需要3个参数:token(url已经附带)、callback、 _(下划线-。-)

经验证 ,callback参数是固定值。

好的,那我们搜索一下下划线的值。

查下cookie,发现它是imooc_isnew_ct的值

到这里基本已经大功告成了~

全部代码:

#coding=utf8
#最后版本
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import urllib2
import urllib
import cookielib

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
opener.addheaders=[('user-agent','Mozilla/5.0')]

url_login = 'http://www.imooc.com/passport/user/login'
url_index = 'http://www.imooc.com'
url_test = 'http://www.imooc.com/user/setbindsns'
data = {
    'username':'13153154784',
    'password':'liuweidong',
    'verify':'',
    'remember':'1',
    'pwencode':'0',
    'referer':'http://www.imooc.com'
}
data_encoded = urllib.urlencode(data)


#get主页获取cookie
req_index = urllib2.Request(url_index)
res_index = opener.open(req_index)
print cj._cookies
print

#post登陆页面
req_login = urllib2.Request(url_login,data_encoded)
res_login = opener.open(req_login)
print res_login.read()
res_dict = eval(res_login.read())
url_ssologin = res_dict['data']['url'][0]

print url_ssologin

import re
url_ssologin = re.sub(r'\/','/',url_ssologin)

print url_ssologin

params = {
    'callback':'jQuery19106404770042720387_1486274878204',
    '_': str(cj._cookies['.imooc.com']['/']['imooc_isnew_ct'])[23:33]
}
url_ssologin = url_ssologin+'&'+urllib.urlencode(params)

#sso登陆页面
req_sso = urllib2.Request(url_ssologin)
res_sso = opener.open(req_sso)
# print res_sso.read()
# print cj._cookies['.imooc.com']['/']['loginstate']



req_test = urllib2.Request(url_test)
res_test = opener.open(req_test)
imooc = open('c:/users/asus/desktop/imooc.html','w')
imooc.write(res_test.read())
imooc.close()

 

博主其实遇到了好多问题,走了好多弯路,感谢某dalao的无私帮助:)

第一次写博客,欢迎技术交流与指正~

 

写下这篇文章的时候,是博主学习python的第三天( 也许是第四天:( ),python是博主接触的第...

DefaultCookiePolicy

DefaultCookiePolicy

该类实现了CookiePolicy的接口。

该类实现了CookiePolicy的接口。

CookieJar

CookieJar

CookieJar是cookie的集合,可以包含有很多Cookie类,是我们的主要操作对象。里面有一系列的方法可以支持更加细致的操作!

CookieJar是cookie的集合,可以包含有很多Cookie类,是我们的主要操作对象。里面有一系列的方法可以支持更加细致的操作!

FileCookieJar

FileCookieJar

该类继承自CookieJar,CookieJar只是在内存中完成自己的生命周期,FileCookieJar的子类能够实现数据持久化,定义了save、load、revert三个接口。

该类继承自CookieJar,CookieJar只是在内存中完成自己的生命周期,FileCookieJar的子类能够实现数据持久化,定义了save、load、revert三个接口。

MozillaCookieJar & LWPCookieJar

MozillaCookieJar & LWPCookieJar

两个实现类,继承关系如下:

两个实现类,继承关系如下:

MozillaCookieJar & LWPCookieJar

MozillaCookieJar & LWPCookieJar

II. 使用

图片 3

简单例子

II. 使用

一段简单的使用代码

简单例子

#!/usr/bin/env python
# encoding: utf-8

一段简单的使用代码

import requests
import cookielib

#!/usr/bin/env python
# encoding: utf-8

url = ''
jar = cookielib.LWPCookieJar('cookie.txt')

import requests
import cookielib

# 试着载入cookie
# 提一个问题,为什么要加入ignore_discard属性?
try:
    jar.load(ignore_discard=True)
except:
    pass

url = ''
jar = cookielib.LWPCookieJar('cookie.txt')

# 建立一个session
s = requests.Session()

# 试着载入cookie
# 提一个问题,为什么要加入ignore_discard属性?
try:
    jar.load(ignore_discard=True)
except:
    pass

# 设定 headers与cookies
s.headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'}
s.cookies = jar

# 建立一个session
s = requests.Session()

# 访问url
r = s.get(url)

# 设定 headers与cookies
s.headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'}
s.cookies = jar

# 持久化cookie
jar.save(ignore_discard=True)

# 访问url
r = s.get(url)

# 打印cookie
for item in jar:
    print "cookie name : %s ---- value: %s" % (item.name, item.value)
我们得到如下cookie

# 持久化cookie
jar.save(ignore_discard=True)

cat cookie.txt

# 打印cookie
for item in jar:
    print "cookie name : %s ---- value: %s" % (item.name, item.value)

#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="2F5340B39928231AA09353CDAE3DA14D:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BIDUPSID=2F5340B39928231AA09353CDAE3DA14D; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: H_PS_PSSID=14872_1457_14412_14509_14444_12826_10812_14430_12868_14871_12723_14962_14919_14902_15384_12095_13937_15963; path="/"; domain=".baidu.com"; path_spec; domain_dot; discard; version=0
Set-Cookie3: PSTM=1434892424; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
生成一个Cookie类

我们得到如下cookie

我们由Cookie的定义可以简单的生成一条cookie

cat cookie.txt

import cookielib

#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="2F5340B39928231AA09353CDAE3DA14D:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BIDUPSID=2F5340B39928231AA09353CDAE3DA14D; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: H_PS_PSSID=14872_1457_14412_14509_14444_12826_10812_14430_12868_14871_12723_14962_14919_14902_15384_12095_13937_15963; path="/"; domain=".baidu.com"; path_spec; domain_dot; discard; version=0
Set-Cookie3: PSTM=1434892424; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2083-07-09 16:27:51Z"; version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0

class Cookie:
    def __init__(self, version, name, value,
                 port, port_specified,
                 domain, domain_specified, domain_initial_dot,
                 path, path_specified,
                 secure,
                 expires,
                 discard,
                 comment,
                 comment_url,
                 rest,
                 rfc2109=False,
                 ):
         .....

生成一个Cookie类

# 初始化一个cookie

我们由Cookie的定义可以简单的生成一条cookie

def createCookie(name, value, domain, expires=None):
    return cookielib.Cookie(
        version=None,
        name=name,
        value=value,
        port='80',
        port_specified=True,
        domain=domain,
        domain_specified=True,
        domain_initial_dot=False,
        path='/',
        path_specified=True,
        secure=False,
        expires=expires,
        discard=False,
        comment=None,
        comment_url=None,
        rest=None,
        rfc2109=False
    )

import cookielib

new_cookie = createCookie('phpgao', 'laogao', 'www.phpgao.com', '1434977736')

class Cookie:
    def __init__(self, version, name, value,
                 port, port_specified,
                 domain, domain_specified, domain_initial_dot,
                 path, path_specified,
                 secure,
                 expires,
                 discard,
                 comment,
                 comment_url,
                 rest,
                 rfc2109=False,
                 ):
         .....

# 加入到现有cookies

# 初始化一个cookie

mycookie = cookielib.CookieJar()
mycookie.set_cookie(new_cookie)

def createCookie(name, value, domain, expires=None):
    return cookielib.Cookie(
        version=None,
        name=name,
        value=value,
        port='80',
        port_specified=True,
        domain=domain,
        domain_specified=True,
        domain_initial_dot=False,
        path='/',
        path_specified=True,
        secure=False,
        expires=expires,
        discard=False,
        comment=None,
        comment_url=None,
        rest=None,
        rfc2109=False
    )

new_cookie = createCookie('phpgao', 'laogao', 'www.phpgao.com', '1434977736')

# 加入到现有cookies

mycookie = cookielib.CookieJar()
mycookie.set_cookie(new_cookie)

III. 扩展阅读

cookielib和urllib2模块相结合模拟网站登录

1.cookielib模块

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其中他们的关系如下:

图片 4
 
2.urllib2模块

说到urllib2模块最强大的部分绝对是它的opener,

urllib2模块的 OpenerDirector 操作类。这是一个管理很多处理类(Handler)的类。而所有这些 Handler 类都对应处理相应的协议,或者特殊功能。分别有下面的处理类:

    BaseHandler
    HTTPErrorProcessor
    HTTPDefaultErrorHandler
    HTTPRedirectHandler
    ProxyHandler
    AbstractBasicAuthHandler
    HTTPBasicAuthHandler
    ProxyBasicAuthHandler
    AbstractDigestAuthHandler
    ProxyDigestAuthHandler
    AbstractHTTPHandler
    HTTPHandler
    HTTPCookieProcessor
    UnknownHandler
    FileHandler
    FTPHandler
    CacheFTPHandler

cookielib模块一般与urllib2模块配合使用,主要用在urllib2.build_oper()函数中作为urllib2.HTTPCookieProcessor()的参数。

由此可以使用python模拟网站登录。

先写个获取CookieJar实例的demo:

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3
 4 import urllib
 5 import urllib2
 6 import cookielib
 7
 8 #获取Cookiejar对象(存在本机的cookie消息)
 9 cookie = cookielib.CookieJar()
10 #自定义opener,并将opener跟CookieJar对象绑定
11 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
12 #安装opener,此后调用urlopen()时都会使用安装过的opener对象
13 urllib2.install_opener(opener)
14
15 url = ""   
16 urllib2.urlopen(url)

 

然后写个用POST方法来访问网站的方式(用urllib2模拟一起post过程):

 1 #! /usr/bin/env python
 2 #coding=utf-8
 3
 4 import urllib2
 5 import urllib
 6 import cookielib
 7
 8 def login():
 9     email = raw_input("请输入用户名:")
10     pwd = raw_input("请输入密码:")
11     data={"email":email,"password":pwd}  #登陆用户名和密码
12     post_data=urllib.urlencode(data)   #将post消息化成可以让服务器编码的方式
13     cj=cookielib.CookieJar()   #获取cookiejar实例
14     opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
15     #自己设置User-Agent(可用于伪造获取,防止某些网站防ip注入)
16     headers ={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
17     website = raw_input('请输入网址:')
18     req=urllib2.Request(website,post_data,headers)
19     content=opener.open(req)
20     print content.read()    #linux下没有gbk编码,只有utf-8编码
21
22 if __name__ == '__main__':
23     login()

注意这个例子经过测试,发现只有人人网和开心网之类的网站可以,而像支付宝,百度网盘,甚至是我们学校的教务系统都不能成功登录,就会显示如下的报错消息:

Traceback (most recent call last):
  File "login.py", line 23, in <module>
    login()
  File "login.py", line 19, in login
    content=opener.open(req)
  File "/usr/lib/python2.7/urllib2.py", line 406, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 444, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 405: Method Not Allowed

可能是这些网站在编写时不接受客户端请求该方法,具体原因我也不知道为什么。而且这个程序不能自动通过有验证码验证的网站,所以纯粹学习它的原理吧。

然后放一下用python模拟登录的几个示例(转自:

#  -*- coding: utf-8 -*-
# !/usr/bin/python

import urllib2
import urllib
import cookielib
import re

auth_url = ''
home_url = '';
# 登陆用户名和密码
data={
    "username":"nowamagic",
    "password":"pass"
}
# urllib进行编码
post_data=urllib.urlencode(data)
# 发送头信息
headers ={
    "Host":"www.nowamagic.net",
    "Referer": ""
}
# 初始化一个CookieJar来处理Cookie
cookieJar=cookielib.CookieJar()
# 实例化一个全局opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
# 获取cookie
req=urllib2.Request(auth_url,post_data,headers)
result = opener.open(req)
# 访问主页 自动带着cookie信息
result = opener.open(home_url)
# 显示结果
print result.read()

1. 使用已有的cookie访问网站

import cookielib, urllib2

ckjar = cookielib.MozillaCookieJar(os.path.join('C:Documents and SettingstomApplication DataMozillaFirefoxProfilesh5m61j1i.default', 'cookies.txt'))

req = urllib2.Request(url, postdata, header)

req.add_header('User-Agent',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )

f = opener.open(req)
htm = f.read()
f.close()

2. 访问网站获得cookie,并把获得的cookie保存在cookie文件中

import cookielib, urllib2

req = urllib2.Request(url, postdata, header)
req.add_header('User-Agent',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

ckjar = cookielib.MozillaCookieJar(filename)
ckproc = urllib2.HTTPCookieProcessor(ckjar)

opener = urllib2.build_opener(ckproc)

f = opener.open(req)
htm = f.read()
f.close()

ckjar.save(ignore_discard=True, ignore_expires=True)

3. 使用指定的参数生成cookie,并用这个cookie访问网站

import cookielib, urllib2

cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
values = {'redirect':", 'email':'abc@abc.com',
          'password':'password', 'rememberme':", 'submit':'OK, Let Me In!'}
data = urllib.urlencode(values)

request = urllib2.Request(url, data)
url = urlOpener.open(request)
print url.info()
page = url.read()

request = urllib2.Request(url)
url = urlOpener.open(request)
page = url.read()
print page

另外,补充一下urllib2的方法:

1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。

URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术。常用在把一串很长的网站网址,转成较短的网址。因为当要传播某网站的网址时,常常因为网址太长,不好记忆;又有可能因为换了网路的免费网页空间,网址又必须要变更,不知情的使用者还以为网站关闭了。这时就可以用网路上的转址服务了。这个技术使一个网页是可借由不同的统一资源定位符(URL)连结。

>>> import urllib2
>>> url = ""
>>> req = urllib2.Request(url)
>>> response = urllib2.urlopen(req)
>>> response.geturl()
''
>>> print response.info()
Date: Fri, 28 Mar 2014 03:30:01 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=AF7C001FCA87716A52B353C500FC45DB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=1466_5225_5288_5723_4261_4759_5659; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Expires: Fri, 28 Mar 2014 03:29:06 GMT
Cache-Control: private
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xea1372bf0001780d
BDUSERID: 0

我们可以通过urllib2 默认情况下会针对 HTTP 3XX 返回码自动进行 redirect 动作(URL重定向),无需人工配置。要检测是否发生了 redirect 动作,只要检查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。

import urllib2
my_url = ''
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirected

my_url = ''
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirected

Debug Log

使用 urllib2 时,可以通过下面的方法把 debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试,有时可以省去抓包的工作

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('')

本文由js333发布于计算机互联网,转载请注明出处:python中cookielib模块的使用方法,python的cookielib说

关键词:

上一篇:没有了

下一篇:没有了