cookie和session的区别
- cookie数据存放在客户浏览器上,session放在服务器上
- cookie不安全
- session访问增多时会占用服务器性能
- cookie保存的数据不能超过4K,很多浏览器都设置一个站点最多保存20个cookie
爬虫处理cookie和session
- 携带一堆cookie组成cookie池
- 能不使用cookie时尽量不用,速度快,但是如果要获取登录后的页面,必须带cookie
requests处理session请求
- requests提供了一个session类,用来实现客户端和服务端的会话保持
-
使用方法
- 实例化一个session对象
- 让session发送get或者post请求
session发送过一次请求后,后面再请求就可以带上之前的cookie了
session = requests.session()
response = session.get(url,headers)
想象一下浏览器请求数据的思路:先登录,再退出再登录进去的时候是已经登录好的页面。因为之前登录成功的cookie已经带上了,这就是session的工作,那么代码中就要实例化一个session。具体步骤如下:
-
实例化session
-
先使用session发送请求登录网站,把cookie保存在session中
-
再使用session请求登录之后才能访问的网站,session能够自动携带之前登录成功时已经保存好的cookie,这样就是带着cookie进行请求,所以能直接进入登录后的页面,而不是需要登录的页面。
-
以登录人人网为例使用requests模块提供的session类来请求登录之后的页面
-
不发送post请求,使用cookie、get获取登录后页面的情况
-
cookie过期时间很长的网站,在cookie过期之前拿到所有数据,比较麻烦。
政府的一些网站,维护不好的小网站。不用先发送post请求,直接复制一段cookie就能用 -
配合其他程序使用,其他程序专门获取cookie,当前程序专门获取页面。’
将cookie字符串转换成字典:字典推倒式
.
In [1]: {i:i+10 for i in range(10)}
Out[1]: {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}
.
In [2]: {i:“b” for i in range(10)}
Out[2]:
{0: ‘b’,
1: ‘b’,
2: ‘b’,
3: ‘b’,
4: ‘b’,
5: ‘b’,
6: ‘b’,
7: ‘b’,
8: ‘b’,
9: ‘b’}
同样,将cookie转换成字典,用split按分号和空格进行切割
Cookie: anonymid=jz7qmfmcto8wwo; depovince=GW; r01=1; JSESSIONID=abcCK1kawMcd3ah1RGdYw; ick_login=da5f2b8c-652f-4858-9bac-234416c4065d; t=bd6af47190e48bf012f3ebac11062df73; societyguester=bd6af47190e48bf012f3ebac11062df73; id=971883413; xnsid=7c7d1fb8; jebecookies=18e4275a-0156-4887-bc7e-ff96090ac620|||||; ver=7.0; loginfrom=null; jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491238; jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491240; wp_fold=0
cookies.split按照分号和空格切割后得到的结果是一个列表
In [5]: cookies = “anonymid=jz7qmfmcto8wwo; depovince=GW; r01=1;
JSESSIONID=abcCK1kawMcd3ah1RGdYw;
ick_login=da5f2b8c-652f-4858-9bac-234416c4065d;
t=bd6af47190e48bf012f3ebac11062df73;
societyguester=bd6af47190e48bf012f3ebac11062df73; id=971883413;
xnsid=7c7d1fb8; jebecookies=18e4275a-0156-4887-bc7e-ff96090ac620|||||;
ver=7.0; loginfrom=null;
jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491238;
jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491240;
wp_fold=0”In [6]: cookies.split("; ")
Out[6]: [‘anonymid=jz7qmfmcto8wwo’,
‘depovince=GW’, ‘r01=1’, ‘JSESSIONID=abcCK1kawMcd3ah1RGdYw’,
‘ick_login=da5f2b8c-652f-4858-9bac-234416c4065d’,
‘t=bd6af47190e48bf012f3ebac11062df73’,
‘societyguester=bd6af47190e48bf012f3ebac11062df73’, ‘id=971883413’,
‘xnsid=7c7d1fb8’,
‘jebecookies=18e4275a-0156-4887-bc7e-ff96090ac620|||||’, ‘ver=7.0’,
‘loginfrom=null’,
‘jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491238’,
‘jebe_key=3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491240’,
‘wp_fold=0’]
利用字典推倒式遍历这些列表,字典的键是列表中第i个元素等号左边的内容,值是等号右边的内容。再次利用split按等号进行切割,键取第0个,值取第一个。
利用 {i:i+10 for i in range(10)}公式将切割后的列表转换成字典。
In [7]: {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
Out[7]:
{‘jebecookies’: ‘18e4275a-0156-4887-bc7e-ff96090ac620|||||’,
‘societyguester’: ‘bd6af47190e48bf012f3ebac11062df73’,
‘r01’: ‘1’,
‘jebe_key’: ‘3d4c9a96-95cd-4ac7-ab28-f0e31a95b956%7C2207a2a4e8711f1ca89c7158cb284901%7C1565574491442%7C1%7C1565574491240’,
‘depovince’: ‘GW’,
‘ick_login’: ‘da5f2b8c-652f-4858-9bac-234416c4065d’,
‘anonymid’: ‘jz7qmfmcto8wwo’,
‘JSESSIONID’: ‘abcCK1kawMcd3ah1RGdYw’,
‘loginfrom’: ‘null’,
‘wp_fold’: ‘0’,
‘xnsid’: ‘7c7d1fb8’,
‘t’: ‘bd6af47190e48bf012f3ebac11062df73’,
‘id’: ‘971883413’,
‘ver’: ‘7.0’}
因为字典是无序的,所以字典的顺序与列表顺序不一致。
这种将cookie单独拿出来做参数的结果等同于将cookie合并到headers变量。
获取登录后页面的三种方式
- 实例化session,再用session发送post请求,获取登录后的页面
- headers中添加cookie键,值是cookie字符串
- 在请求方法中添加cookies参数,接收字典形式的cookie,字典的键是cookie的name,值是cookie的value,name和value在浏览器检查Network-Name-Cookies中查看。