超详细讲解python模拟登录——cookie及session

1.Cookie 和Session区别

  • 1.cookie在客户的浏览器上,session存在服务器上
  • 2.cookie是不安全的,且有失效时间

1.1cookie和session隐患与安全

  • 1.session是在cookie的基础上,服务端设置session时会向浏览器发送设置一个设置cookie的请求,这个cookie包括session的id当访问服务端时带上这个session_id就可以获取到用户保存在服务端对应的session
  • 2.cookie信息是保存在本地浏览器里面的,服务器上并不存储相关的信息。 在发送请求时,cookie的这些内容是放在 Http协议中的header 字段中进行传输的
  • 3.cookie信息是直接放在Http协议的header中进行传输的,看得出来,这是个隐患!一旦别人获取到你的cookie信息(截获请求,或者使用你的电脑),那么他很容易从cookie中分析出你的用户名和密码。为了解决这个隐患,所以有了session机制。
  • 4.session: 服务器根据用户名和密码,生成一个session ID,存储到服务器的数据库中。
    用户登录访问时,服务器会将对应的session ID发送给用户(本地浏览器)。
    浏览器会将这个session ID存储到cookie中,作为一个键值项。
    以后,浏览器每次请求,就会将含有session ID的cookie信息,一起发送给服务器。
    服务器收到请求之后,通过cookie中的session ID,到数据库中去查询,解析出对应的用户名,就知道是哪个用户的请求了。

1.1 弊端

  • 一个cookie和session往往和一个用户对应,访问太快容易被服务器检测出来爬虫
  • 不需要cookie的时候尽量不要用
  • Cookie有不安全机制。 你不能把所有的用户信息都存在本地,一旦被别人窃取,就知道你的用户名和密码,就会很危险。所以引入了session机制。

2.Cookie登录

2.1 直接账号密码post

mf = requests.session()
# 因为原始的session.cookies 没有save()方法,所以需要用到cookielib中的方法LWPCookieJar,
# 这个类实例化的cookie对象,就可以直接调用save方法。
mf.cookies = cookielib.LWPCookieJar(filename = "mfcookies.txt")

post_url = ""
post_data = {
	"passport": account,
    "password": password,
}
header = {
	"Referer": "",
    'User-Agent': userAgent,
}
# 使用session直接post请求
mf.post(post_url, data = post_data, headers = header)
# 登录成功之后,将cookie保存在本地文件中
mf.cookies.save()

# 使用cookies登录
mf.cookies.load()

2.2 通过外部浏览器cookies模拟登录

2.2.1直接放到header里

header={
	"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/64.0",
	"Cookie":"GZTxtCjvgfZ…6246vb2; username=chengyangkj",
}
r=request.get(url,headers=header)

2.2.2发送get请求时加上cookies的字典参数:

接受的参数是字典类型的,
这就需要我们适用字符串分割方法把cookie字符串转为字典形式,见下面代码

cookies={}
for line in raw_cookies.split(';'):
  key,value=line.split('=',1)   # 1代表只分一次,得到两个数据
  cookies[key]=value 
url= ""
header = {
	"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/64.0",
	"Cookie":"GZTxtCjvgfZ…6246vb2; username=chengyangkj",
}
r=request.get(url,headers=header,cookies=cookies)

3.Session登录

将CookieJar转为字典:cookies = requests.utils.dict_from_cookiejar(r.cookies)

  • 基本使用方案1:
session=request.session()  #实例化session对象
session.post(url, data=data, headers=header) # 更新session为有账号密码登录成功的session
response=session.get(url,header) #使用session对象发送get请求 就能获取服务端设置的session对象
  • 基本使用方案2:
# 例,短信测压,里面有图片验证码,然后用那个请求的cookie,进行短信的请求
cookiejar = response.cookies
cookie = requests.utils.dict_from_cookiejar(cookiejar)
requests.post(url=url_message, data=data, headers=headers, cookies=cookie)

3.2<-注意->

将CookieJar转为字典:cookies = requests.utils.dict_from_cookiejar(r.cookies)

在用requests的session方法保持cookie的时候发现requests不能保持手动构建的cookie。
requests只能保持 cookiejar 类型的cookie,而我们手动构建的cookie是dict类型的。所以要把dict转为 cookiejar类型。

#将CookieJar转为字典:
cookies = requests.utils.dict_from_cookiejar(r.cookies)
 
s = requests.Session() 
cookie_dict = {"Cookie":"Pgv_pvi=9603764224; RK=X4sLEAHvEw; tvfe_boss_uuid=eef93c89640aod31;"}
#将字典转为CookieJar: 
# cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) 
#其中cookie_dict是要转换字典 转换完之后就可以把它赋给cookies 并传入到session中了: 
# s.cookies = cookies

s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)


s = requests.session()
cookie_dict = {"PHPSESSID":"et4ol1g7ttb0bnjmbiqjhp43"}
# requests.utils.add_dict_to_cookiejar对session对象设置cookie
requests.utils.add_dict_to_cookiejar(s.cookies, cookie_dict)
s.get(url,cookies = cookie_dict)

单独处理cookie字段,处理为字典格式

# 处理cookie内容为字典
cookie = "SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"
cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}
 

致谢:
https://www.jianshu.com/p/264955856e61,https://blog.csdn.net/zwq912318834/article/details/79571110?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=5cf83136-10f8-4f34-ac04-4b4fdea221be&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

  • 7
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值