Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
比如说有些网站需要登录后才能访问某个页面,在登陆之前,你想抓取某个页面内容是不允许的。那么我们可以利用urllib库保存我们登陆的cookie,然后抓取其他页面就达到目的了。
当你获取一个URL时,你使用一个opener。在前面,我们使用的都是默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以需要创建更一般的opener来实现对cookie的设置。
cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib模块配合使用来访问Internet资源。Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它们的关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar
(1)获取cookie保存到变量
首先,我们先利用CookieJar对象实现获取cookie的功能,存储到变量中:
(python3中将cookielib改成了 http.cookiejar)
import urllib.request import http.cookiejar cookie=http.cookiejar.CookieJar() #声明一个CookieJar对象实例来保存cookie handler=urllib.request.HTTPCookieProcessor(cookie) #通过urllib库的HTTPCookieProcessor对象来创建cookie处理器 opener=urllib.request.build_opener(handler) #通过handler来构建opener response=opener.open('http://www.baidu.com') #此处的open方法同urllib的urlopen方法,也可以传入request for item in cookie: print('Name= '+item.name) print('Value= '+item.value)运行结果:
Name= BAIDUID
Value= 9689FC72C262647C8950A2822C8C67CA:FG=1
Name= BIDUPSID
Value= 9689FC72C262647C8950A2822C8C67CA
Name= H_PS_PSSID
Value= 1422_21105_17001_20927
Name= PSTM
Value= 1490773982
Name= BDSVRTM
Value= 0
Name= BD_HOME
Value= 0
在上面的方法中,我们将cookie保存到了cookie这个变量中,如果我们想将cookie保存到文件中该怎么做呢?这时,我们就要用到
FileCookieJar这个对象了,在这里我们使用它的子类MozillaCookieJar来实现Cookie的保存
import urllib.request import http.cookiejar filename='cookie.txt' #设置保存cookie的文件,同级目录下的cookie.txt cookie=http.cookiejar.MozillaCookieJar(filename) #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 handler=urllib.request.HTTPCookieProcessor(cookie) #利用HTTPCookieProcessor对象来创建cookie处理器 opener=urllib.request.build_opener(handler) #通过handler来构建opener response=opener.open("http://www.baidu.com") #创建一个请求,原理同urllib的urlopen cookie.save(ignore_discard=True,ignore_expires=True) #ignore_discard的意思是即使cookies将被丢弃也将它保存下来 # ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入 # 在这里,我们将这两个全部设置为True运行结果:
# Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This is a generated file! Do not edit. .baidu.com TRUE / FALSE 3638258686 BAIDUID 228A4EA883C0DFD8E21D90DBB57F54B7:FG=1 .baidu.com TRUE / FALSE 3638258686 BIDUPSID 228A4EA883C0DFD8E21D90DBB57F54B7 .baidu.com TRUE / FALSE H_PS_PSSID 1444_21088_22175_22158 .baidu.com TRUE / FALSE 3638258686 PSTM 1490774810 www.baidu.com FALSE / FALSE BDSVRTM 0 www.baidu.com FALSE / FALSE BD_HOME 0
3)从文件中获取Cookie并访问
那么我们已经做到把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法来读取cookie并访问网站,感受一下
import http.cookiejar import urllib.request cookie=http.cookiejar.MozillaCookieJar() #创建MozillaCookieJar实例对象 cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True) #从文件中读取cookie内容到变量 request=urllib.request.Request("http://www.baidu.com") #创建请求的request handler=urllib.request.HTTPCookieProcessor(cookie) #利用HTTPCookieProcessor对象来创建cookie处理器 opener=urllib.request.build_opener(handler) #通过handler来创建opener response=opener.open(request) print(response.read())运行部分结果:
设想,如果我们的 cookie.txt 文件中保存的是某个人登录百度的cookie,那么我们提取出这个cookie文件内容,就可以用以上方法模拟这个人的账号登录百度。
import urllib.request import http.cookiejar import urllib.parse filename='cookie.txt' cookie=http.cookiejar.MozillaCookieJar(filename) #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件中 handler=urllib.request.HTTPCookieProcessor(cookie) #利用HTTPCookieProcessor对象来创建cookie处理器 opener=urllib.request.build_opener(handler) #通过handler来创建opener postdata=urllib.parse.urlencode({ 'stuid':'21xxxxxx', 'pwd':'xxxxxx'}).encode(encoding='utf-8') loginurl='http://cas.dhu.edu.cn/authserver/login?service=http%3A%2F%2Fmy.dhu.edu.cn%2Findex.portal' #登录学校教务系统的url result=opener.open(loginurl,postdata) #模拟登陆,并把cookie保存到变量 cookie.save(ignore_discard=True,ignore_expires=True) #保存cookie到cookie.txt文件中 gradeurl='http://xkzx.dhu.edu.cn/manage' #请求访问成绩查询网址 result=opener.open(gradeurl) print(result.read())程序原理:
创建一个带有cookie的opener,在访问登录的url时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。如登陆之后才能查看的成家本学期的课表啊