一、COOKIE & session
1、COOKIE:
COOKIE 就是由服务器发送给客户端的特殊信息,而这些信息以文本的方式存放在客户端,然后客户端每次向服务器发送请求都会带上这些特殊信息。让服务器来识别你的计算机。例如:你访问某些网站的时候,一些网站登录界面问是否保存密码,如果你选择保存后再登录,那么下次访问网站的时候就不许重复登录动作了,这就是COOKIE实现的。
COOKIE缺点:
① COOKIE数量和长度限制,每个domain最多只能有20条COOKIE,并且每个COOKIE长度不能超过4k
② 安全性问题,如果COOKIE被人拦截,那个人就能拿到session信息
③ 有些状态无法保存在客户端
虽然COOKIE有这些缺点,但是COOKIE能够很好的做身份识别。
2、session:
session称为“会话控制”,session对象存储特定用户会话所需的属性及配置信息。当用户在Web页跳转时,存储在session对象中的变量不会丢失。
session和COOKIE区别:
① COOKIE数据存储在客户的浏览器上,session数据放在服务器上
② COOKIE不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
③ session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
④ 单个COOKIE保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个COOKIE
⑤ 登录信息等重要信息存放为session,某些需要保留的信息放在COOKIE
二、手动使用COOKIE登录
比较傻的方法:直接复制COOKIE,手动放入请求头
1 from urllib import request
2 if __name__ =="__main__":
3 # 模拟登录人人个人主页
4 url = "http://www.renren.com/967981984/profile"
5 headers={
6 "COOKIE":"anonymid=jlxrqipq-yd1b41; depovince=BJ; _r01_=1; JSESSIONID=abcrdbDitjgodcWbI_kxw; ick_login=666ef91c-38c0-4863-b69f-bd9b48f23b6a; t=ab090cc8a1b9e5a93991f467cf8f3eab4; societyguester=ab090cc8a1b9e5a93991f467cf8f3eab4; id=967981984; xnsid=3505b17e; jebeCOOKIEs=e7f4d1cc-1fd5-4e3d-82e2-57fc6f652835|||||; ver=7.0; loginfrom=null; wp_fold=0; jebe_key=7da3f557-b4af-410d-b7c8-07ef5c61cd3a%7C873bc0529825e88a727db5146c0adb40%7C1536708771061%7C1"
7 }
8 req = request.Request(url, headers = headers)
9 res = request.urlopen(req)
10 html = res.read().decode()
11 # 把页面保存到本地
12 with open("res.html", "w") as f:
13 f.write(html)
三、使用COOKIE自动登录
http模块中有一些COOKIE模块,通过他们我们可以自动使用COOKIE
1、COOKIEJar
- 管理存储COOKIE,向传出的http请求添加COOKIE
- COOKIE存储在内存中,CookJar实例回收后COOKIE将消失
2、FileCOOKIEJar(filename, delayload = None, policy = None)
- 使用文件管理COOKIE
- filename是保存的文件的名字
3、MozillaCOOKIEJar(filename, delayload = None, policy = None)
- 创建与mocilla(火狐)浏览器COOKIE.txt兼容的FileCOOKIEJar
4、LwpCOOKIEJar(filename, delayload = None, policy = None)
- 创建与LwpCOOKIEJar标准兼容的Set-COOKIE3格式的FileCOOKIEJar
关系 COOKIEJar -> FileCOOKIEJar -> MozillaCOOKIEJar -> LwpCOOKIEJar
利用COOKIEJar访问人人
代码实现流程:
1、打开登录页面自动通过账号和密码
2、自动提取反馈回来的COOKIE
3、利用提取的COOKIE登录隐私页面
1 from urllib import request,parse
2 from http import COOKIEjar
3 # 创建COOKIEjar实例
4 COOKIE = COOKIEjar.COOKIEjar()
5 # 生成COOKIEjar管理器
6 COOKIE_handler = request.HTTPCOOKIEProcessor(COOKIE)
7 # 创建http管理器
8 http_handler = request.HTTPHandler()
9 # 创建https管理器
10 https_handler = request.HTTPSHandler()
11 # 创建请求管理器
12 opener = request.build_opener(http_handler, https_handler, COOKIE_handler)
13
14 # 登录函数
15 def login():
16 '''
17 负责初次登录
18 需要输入用户名、密码来获取登录COOKIE的凭证
19 '''
20 # 通过抓包获取的登录页面
21 url = "http://www.renren.com/PLogin.do"
22 # email 是登录账号 password是登录密码
23 data = {
24 "email":"13119144223",
25 "password":"123456"
26 }
27 data = parse.urlencode(data)
28 req = request.Request(url, data = data.encode())
29 rsq = opener.open(req)
30 def getHomePage():
31 url = "http://www.renren.com/967981984/profile"
32 # 如果已经执行了Login函数,则opener自动包含相应的COOKIE值
33 rsp = opener.open(url)
34 html = rsp.read().decode()
35 with open("rsp.html", "w") as f:
36 f.write(html)
37 if __name__ =='__main__':
38 login()
39 getHomePage()
四、COOKIE属性
使用代码查看COOKIE属性
from urllib import request,parse
from http import COOKIEjar
COOKIE = COOKIEjar.COOKIEJar()
COOKIE_handler = request.HTTPCOOKIEProcessor(COOKIE)
http_handler = request.HTTPHandler()
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler, https_handler, COOKIE_handler)def login():url = "http://www.renren.com/PLogin.do"data = {"email":"13119144223""password":"123456"}data = parse.urlencode(data)req = request.Request(url, data= data.encode())rsp = opner.open(req)if __name__ == "__main__":login()print(COOKIE)for item in COOKIE:print(item)
执行结果:
COOKIE属性
- name:名称
- value:值
- domain:可以访问此COOKIE域名
- path:可以访问COOKIE的页面路径
- expire:过期时间
- size:大小
- http:字段
四、文件保存FileCOOKIEJar
1 from urllib import request, parse
2 from http import COOKIEjar
3 #创建COOKIE文件
4 filename = "COOKIE.txt"
5 # 创建MOzillaCOOKIEjar实例
6 COOKIE = COOKIEjar.MozillaCOOKIEJar(filename)
7 # 生成COOKIEjar管理器
8 COOKIE_handler = request.HTTPCOOKIEProcessor(COOKIE)
9 # http管理器
10 http_handler = request.HTTPHandler()
11 # https管理器
12 https_handler = request.HTTPSHandler()
13 # opener管理器
14 opener = request.bulid_opener(http_handler, https_landler, COOKIE_handler)
15
16 def login():
17 url = "http://www.renren.com/PLogin.do"
18 data = {
19 "email": "13119144223",
20 "password": "123456"
21 }
22 data = parse.urlencode(data)
23 req = request.Request(url, data = data.encode())
24 res = opener.open(req)
25 COOKIE.save(ignore_discard=True, ignore_expires=True)
26 if __name__ =='__main__':
27 login()
第27行可以直接COOKIE.save()不带参数
ignore_discard=True :将要丢弃COOKIE的也保存
ignore_expires=True : 如果文件中的COOKIE已过期,继续保存