Urllib库的使用九---进阶四(Cookiejar的使用)

通过上篇的代码可以看到其实是实现了获取Cookie,通过Cookie来请求网页数据的 但是这样很明显不够灵活,也不够复杂,我们有没有方便一点的做法呢?

cookiejar库 和 HTTPCookieProcessor处理器

  • 在Python处理Cookie,一般是通过cookiejar模块和 urllib模块的HTTPCookieProcessor处理器类一起使用。

cookiejar模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。

cookiejar 库

  • 该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

  • CookieJar
    管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

  • FileCookieJar (filename,delayload=None,policy=None)
    从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

  • MozillaCookieJar (filename,delayload=None,policy=None)
    从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。

  • LWPCookieJar (filename,delayload=None,policy=None)
    从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。

其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar()

实例一

获取Cookie,并保存到CookieJar()对象中:
# urllib_cookiejar_test1.py
import urllib
from http import cookiejar
# 构建一个CookieJar对象实例来保存cookie
cookiejar = cookiejar.CookieJar()
# 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler=urllib.request.HTTPCookieProcessor(cookiejar)
# 通过 build_opener() 来构建opener
opener = urllib.request.build_opener(handler)
# 4. 以get方法访问页面,访问之后会自动保存cookie到cookiejar中
opener.open("http://www.baidu.com")
## 可以按标准格式将保存的Cookie打印出来
cookieStr = ""
for item in cookiejar:
    cookieStr = cookieStr + item.name + "=" + item.value + ";"

## 舍去最后一位的分号
print (cookieStr[:-1])
#我们使用以上方法将Cookie保存到cookiejar对象中

实例二

使用MozillaCookjar() 访问网站或者cookie,并且把获得的cookie保存在创建的cookie文件中
import urllib.request
import http.cookiejar
#设置文件名
filename = 'cookie.txt'
# 声明一个MozillaCookieJar对象,MozillaCookieJar (filename,delayload=None,policy=None)
cookiejar = http.cookiejar.MozillaCookieJar(filename)
# 使用HTTPCookieProcessor()创建cookie处理器对象
handler = urllib.request.HTTPCookieProcessor(cookiejar)
#通过build_opener()来构造opener
opener = urllib.request.build_opener(handler)
#使用opener.open创建一个请求
response = opener.open('http://www.baidu.com')
#保存cookie到本地文件,cookie.txt
cookiejar.save()

实例三

MozillaCookjar() 从文件中获取cookies,作为请求的一部分去访问
import urllib.request
import http.cookiejar as cookiejar
#实例化对象
cookiejar = cookiejar.MozillaCookieJar()
#要读取得cookie文件
cookiejar.load('cookie.txt')
for i in cookiejar:
    print(i.name,i.value)

cookiejar和post模拟登录人人网

模拟登录要注意几点:

  • 登录一般都会先有一个HTTP GET,用于拉取一些信息及获得Cookie,然后再HTTP POST登录。
  • HTTP POST登录的链接有可能是动态的,从GET返回的信息中获取。
  • password 有些是明文发送,有些是加密后发送。有些网站甚至采用动态加密的,同时包括了很多其他数据的加密信息,只能通过查看JS源码获得加密算法,再去破解加密,非常困难。
  • 大多数网站的登录整体流程是类似的,可能有些细节不一样,所以不能保证其他网站登录成功
# -*- coding:utf-8 -*-
import urllib.request
import http.cookiejar as cookiejar
from urllib import parse
#1.构造一个CookieJar对象实例来保存cookie
cookie = cookiejar.CookieJar()
# 2.使用HTTPCookieProcessor()创建cookie处理器对象,
# 参数为CookieJar()对象
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
#3.通过build_opener()来构建opener
opener = urllib.request.build_opener(cookie_handler)
#4.addheaders接受一个列表,里面每一个元素都是一个headers信息的元组
#opener将会附带header信息
opener.addheaders = [
    ('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'),
]
#5.需要登录账号和密码
data = {
    'email':'账号',
    'password':'密码',
}
#6. 通过urlencode()转码
postdata = parse.urlencode(data).encode('utf-8')
#7. 构建Request请求对象,包含需要发送的用户名和密码
request = urllib.request.Request("http://www.renren.com/PLogin.do", data = postdata)
# 8. 通过opener发送这个请求,并获取登录后的Cookie值,
opener.open(request)
# 9. opener包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = opener.open("http://www.renren.com/965722397/profile")

#这里为了测试不添加cookie时访问改界面的效果
#headers = {
#    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 #Firefox/59.0',
#}
# request = urllib.request.Request('http://www.renren.com/965722397/profile',headers=headers)
# response = urllib.request.urlopen(request)

# 10. 打印响应内容
#打印结果查看是否访问成功
print(response.code)
html = response.read()
# print(html)

with open('renren.html','wb') as f:
    f.write(html)

你可能感兴趣的:(Urllib库的使用九---进阶四(Cookiejar的使用))