课程目标:
为什么要模拟登录模拟登录原理 - cookie和session如何识别常用的验证码通过 selenium模拟登录并使用coodie滑动验证码+selenium模拟登录哔哩哔哩1.为什么要模拟登录
因为很多网站是需要登录之后才可以看到一些数据,所以需要用python模拟登录。
2.模拟登录原理 -cookie和session
request模拟登录豆瓣如下
import jsonimport requestsdef login():username = "xxx@"password = "xxx"url = "/j/mobile/login/basic"headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}post_data = {"ck": "","name": username,"password": password,"remember": "true","ticket": ""}res = requests.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")else:print("登录失败")if __name__ == "__main__":login()
将 cookie 保存到文件中并从文件中读取 cookie
我们在上面已经登录之后,再登录首页,看看我们是否已经登录了。登录之后,右上角会显示我们的用户名,所以用用户名来做下识别。如下
# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = requests.get("/").text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")
我们需要用到 requests 的session,
session = requests.session()
然后在请求中,把 request都换成session,如下,就可以正常登陆了
html = session.get("/", headers=headers).text
但是这样的话,程序退出了,就要重新获取一次,有没有方法可以把cookie保存下来呢?当然有,有2中方法
1. 第一种,利用res的cookies,然后给到下一次请求的cookies参数中,如下
res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")cookie_jar = res.cookieselse:print("登录失败")# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookie_jar).text
上面用的是 cookie_jar 对象,也可以换位 dict对象,如下
res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")cookie_dict = res.cookies.get_dict()else:print("登录失败")# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookie_dict).text
如上,我们只要把 cookie保存到文件中,下次需要的时候再打开即可。要用到python的一个包import pickle,可以让我们很简单的把一个对象写到一个文件中。
1. 用pickle 把对象写入到文件,这里是把 cookie_jar文件写到文件中,及上面的 res.cookies, 不是 .get_dict()
ps: wb, w=write写入,b代表二进制
if res_json['status'] == "success":print("登录成功")f = open("douban.cookie", "wb")pickle.dump(res.cookies, f)f.close()else:print("登录失败")
代码可以用 with 优化如下,自动调动close。
with open("douban.cookie", "wb") as f:pickle.dump(res.cookies, f)
2. 怎么用pickle 读数据, rb 是 read读,b是二进制的方式
with open("douban.cookie", "rb") as f:cookies = pickle.load(f)# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookies).text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")
完整代码如下:
# +--------------------------# | User: zq-# | Version: python3.7-# | Time: -03-16 16:21# +--------------------------import jsonimport requestsimport pickledef login():session = requests.session()username = "xxxx@"password = "xxxxx"url = "/j/mobile/login/basic"headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}post_data = {"ck": "","name": username,"password": password,"remember": "true","ticket": ""}res = session.post(url, data=post_data, headers=headers)res_json = json.loads(res.text)if res_json['status'] == "success":print("登录成功")with open("douban.cookie", "wb") as f:pickle.dump(res.cookies, f)else:print("登录失败")with open("douban.cookie", "rb") as f:cookies = pickle.load(f)# 上面已经登录了,下面继续登录首页,看看我们是否登录了html = session.get("/", headers=headers, cookies=cookies).text# 8ll是我的豆瓣昵称,登录之后会显示出来if "8ll" in html:print("已经登录")else:print("未登录")if __name__ == "__main__":login()