爬虫从入门到精通(3) | 了解cookie,session和token,并进行模拟登录

爬虫从入门到精通(3) | 了解cookie,session和token,并进行模拟登录_第1张图片

文章目录

  • 一、cookie和session
    • 1.cookie和session的产生原因
    • 2.cookie介绍
    • 3.cookie和session的区别和联系
  • 二、token令牌
  • 三、爬虫使用cookie和session进行模拟登录
    • 1.使用cookie模拟登录人人网
    • 2.使用session模拟登录人人网

一、cookie和session

1.cookie和session的产生原因

由于http是一个无状态的协议,请求与请求之间无法相互传递或者记录一些信息,cookie和session正是为了解决这个问题而产生。

2.cookie介绍

  • 定义:指某些网站为例辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据

  • 参数:

    字段 作用
    Name 该cookie的名称。一旦创建, 该名称便不可更改。
    value 该cookie 的值。如果值为Unicode 字符, 需要为字符编码。如果值为二进制数据, 则需要使用BASE64 编码。
    Domain 可以访问该cookie 的域名。例如, 如果设置为.zhihu.com , 则所有以zhihu.com 结尾的域名都可以访问该cookie。
    MaxAge 该cookie 失效的时间, 单位为秒, 也常和Expires— 起使用, 通过它可以计算出其有效时间。Max Age 如果为正数, 则该cookie 在Max Age 秒之后失效。如果为负数, 则关闭浏览器时cookie 即失效, 浏览器也不会以任何形式保存该cookie 。
    Path 该cookie 的使用路径。如果设置为/path/ , 则只有路径为/ path / 的页面可以访问该cookie 。如果设置为/ , 则本域名下的所有页面都可以访问该cookie
    Size 字段 此Cookie 的大小。
    HTTP 字段 cookie 的httponly 属性。若此属性为true , 则只有在HTTP 头中会带有此Cookie 的信息, 而不能通过document.cookie 来访问此Cookie。
    Secure 该cookie 是否仅被使用安全协议传输。安全协议有H TTP s 和SSL 等, 在网络上传输数据之前先将数据加密。默认为false。
  • cookie的种类:会话cookie和持久cookie

    • 会话cookie指存在浏览器内存的cookie,当浏览器关闭,会话cookie会失效。
    • 持久cookie是保存在硬盘上的cookie
    • 这两种cookie的分配标准主要是通过maxAge或者expires这个cookie字段
  • 误区:不是浏览器关闭,cookie就会立刻消失

  • 爬虫使用cookie: 在做爬虫的时候,如果要实现登录,只需要将浏览器中登陆后的cookie信息封装到请求头中就可以登录了
    爬虫从入门到精通(3) | 了解cookie,session和token,并进行模拟登录_第2张图片

3.cookie和session的区别和联系

  • cookie是对某些网站辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据
  • session是在web中用来存储特定的用户会话所需的属性及其配置信息。
  • cookie是在客户端记录状态,session是在服务端记录状态
  • 联系:当客户端发送一个cookie,服务器会从这个cookie中找到sessionID,再查找出相应的session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找session的时候,发现没有session(一般第一次登陆或者清空了浏览器),那么就会创建一个session。

二、token令牌

1.什么是token?

  • token 也称作令牌,由uid+time+sign[+固定参数]
  • token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。

2.token的组成

  • uid: 用户唯一身份标识
  • time: 当前时间的时间戳
  • sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
  • 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库

3.token的存放
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中

4.token的认证流程

token 的认证流程与cookie很相似

  • 用户登录,成功后服务器返回Token给客户端。
  • 客户端收到数据后保存在客户端
  • 客户端再次访问服务器,将token放入headers中
  • 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

5.Token的优点:

  • 支持跨域访问: Cookie是不允许垮域访问的,token支持;
  • 无状态: token无状态,session有状态的;
  • 去耦: 不需要绑定到一个特定的身份验证方案。Token可以在任何地方生成,只要在 你的API被调用的时候, 你可以进行Token生成调用即可;
  • 更适用于移动应用: Cookie不支持手机端访问的;
  • 性能: 在网络传输的过程中,性能更好;
  • 基于标准化: 你的API可以采用标准化的 JSON Web Token (JWT). 这个标准已经存在 多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如: Firebase,Google, Microsoft)。

6.Token的缺点:

  • 占带宽,正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,假如你的网站每月有 10 万次的浏览器,就意味着要多开销几十兆的流量。听起来并不多,但日积月累也是不小一笔开销。实际上,许多人会在 JWT 中存储的信息会更多;
  • 无法在服务端注销,那么久很难解决劫持问题;
  • 性能问题,JWT 的卖点之一就是加密签名,由于这个特性,接收方得以验证 JWT 是否有效且被信任。但是大多数 Web 身份认证应用中,JWT 都会被存储到 Cookie 中,这就是说你有了两个层面的签名。听着似乎很牛逼,但是没有任何优势,为此,你需要花费两倍的 CPU 开销来验证签名。对于有着严格性能要求的 Web 应用,这并不理想,尤其对于单线程环境。

三、爬虫使用cookie和session进行模拟登录

1.使用cookie模拟登录人人网

封装登陆后页面中的cookie在请求头中

import requests

base_url = 'http://www.renren.com/909063513'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Cookie': 'cookie',
}
response=requests.get(base_url,headers=headers)
if '死性不改' in response.text:
    print('登录成功')
else:
    print('登录失败')    

由于我们登录进入人人网在后,人人网首页就会显示登录用户的用户名,因此可以通过用户名是否存在来判断是否登录成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oy8SupyT-1572347824910)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1572316026211.png)]

2.使用session模拟登录人人网

使用requests的session对象,来做到登录

import requests

base_url = 'http://www.renren.com/PLogin.do'
headers= {
    'Host': 'www.renren.com',
    'Referer': 'http://safe.renren.com/security/account',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
}
data = {
    'email':邮箱,
    'password':密码,
}
#创建一个session对象
se = requests.session()
#用session对象来发送post请求进行登录。
se.post(base_url,headers=headers,data=data)
response = se.get('http://www.renren.com/971682585')

if '死性不改' in response.text:
    print('登录成功!')
else:
    print(response.text)
    print('登录失败!')

--------------------------------------------全文完--------------------------------------------
爬虫从入门到精通(3) | 了解cookie,session和token,并进行模拟登录_第3张图片

你可能感兴趣的:(#,--,[Python-网络爬虫入门],爬虫,http,https)