通过上篇的代码可以看到其实是实现了获取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)
网友评论