目录
为什么要使用Cookie
Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容,登陆前与登陆后是不同的,或者不允许的。 使用Cookie和使用代理IP一样,也需要创建一个自己的opener。在HTTP包中,提供了cookiejar模块,用于提供对Cookie的支持。
cookie & session
- 由于http协议的无记忆性,人们为了弥补这个缺憾,所采用的一个补充协议
- cookie是发放给用户(即http浏览器)的一段信息,session是保存在服务器上的对应的另一半信息,用来记录用户信息,可以用F12查看Network中点击name中的信息然后可以查看cookie信息
cookie和session的区别
- 存放位置不同
- cookie不安全
- session会保存在服务器上一定时间,会过期
- 单个cookie保存数据不超过4k, 很多浏览器限制一个站点最多保存20个
session的存放位置
- 存在服务器端
- 一般情况,session是放在内存中或者数据库中
- 没有cookie登录 ,可以看到,没使用cookie则反馈网页为未登录状态
- 案例1
使用cookie登录
- http.cookiejar功能强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
- (手动)直接把cookie复制下来,然后手动放入请求头
- 案例 2
- (自动)http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
- CookieJar
- 管理存储cookie,向传出的http请求添加cookie,
- cookie存储在内存中,CookieJar实例回收后cookie将消失
- FileCookieJar(filename, delayload=None, policy=None):
- 使用文件管理cookie
- filename是保存cookie的文件
- MozillaCookieJar(filename, delayload=None, policy=None):
- 创建与mocilla浏览器cookie.txt兼容的FileCookieJar实例
- LwpCookieJar(filename, delayload=None, policy=None):
- 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
- 他们的关系是: CookieJar(派生出)-->FileCookieJar-->MozillaCookieJar & LwpCookieJar
- CookieJar
- 工作原理:创建一个带有cookie的opener,在访问登录的URL时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。查看登录之后才能看到的信息。
-
利用cookiejar访问人人, 案例3
- 自动使用cookie登录,大致流程是:
- 打开登录页面后自动通过用户名密码登录
- 自动提取反馈回来的cookie
- 利用提取的cookie登录隐私页面
- handler是Handler的实例,用来处理复杂请求,常用参看案例代码
- # 生成 cookie的管理器
- cookie_handler = request.HTTPCookieProcessor(cookie)
- # 创建http请求管理器
- http_handler = request.HTTPHandler()
- # 生成https管理器
- https_handler = request.HTTPSHandler()
- 创立handler后,使用opener打开,打开后相应的业务由相应的hanlder处理
- cookie作为一个变量,打印出来, 案例4
- cookie的属性
- name: 名称
- value: 值
- domain:可以访问此cookie的域名
- path: 可以访问此cookie的页面路径
- expires:过期时间
- size: 大小
- Http字段
- cookie的属性
-
cookie的保存-FileCookieJar, 案例5
-
cookie的读取, 案例6
案例1:
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/965187997/profile"
rsp = request.urlopen(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
案例2:
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/965187997/profile"
headers = {
#Cookie写的是网页中F12打开,然后看Cookie信息
"Cookie": ""
}
req = request.Request(url, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
案例3:
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 发送登录信息的地址,此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
if __name__ == '__main__':
login()
getHomePage()
案例4:
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
if __name__ == '__main__':
'''
执行完login之后,会得到授权之后的cookie
我们尝试把cookie打印出来
'''
login()
print(cookie)
for item in cookie:
print(type(item))
print(item)
for i in dir(item):
print(i)
案例5:
from urllib import request, parse
from http import cookiejar
# 创建filecookiejar的实例
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
负责初次登录
需要输入用户名密码,用来获取登录cookie凭证
:return:
'''
# 此url需要从登录form的action属性中提取
url = "http://www.renren.com/PLogin.do"
# 此键值需要从登录form的两个对应input中提取name属性
data = {
"email": "13119144223",
"password": "123456"
}
# 把数据进行编码
data = parse.urlencode(data)
# 创建一个请求对象
req = request.Request(url, data=data.encode())
# 使用opener发起请求
rsp = opener.open(req)
# 保存cookie到文件
# ignor_discard表示及时cookie将要被丢弃也要保存下来
# ignore_expire表示如果该文件中cookie即使已经过期,保存
cookie.save(ignore_discard=True, ignore_expires=True)
if __name__ == '__main__':
login()
案例6:
from urllib import request, parse
from http import cookiejar
# 创建cookiejar的实例
cookie = cookiejar.MozillaCookieJar()
#直接读取上一个案例得到的cookie
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 创建http请求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 创建请求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已经执行了login函数,则opener自动已经包含相应的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
if __name__ == '__main__':
getHomePage()