课程目标:
为什么要模拟登录
模拟登录原理 - cookie和session
如何识别常用的验证码
通过 selenium模拟登录并使用coodie
滑动验证码+selenium模拟登录哔哩哔哩
1.为什么要模拟登录
因为很多网站是需要登录之后才可以看到一些数据,所以需要用python模拟登录。
2.模拟登录原理 -cookie和session
request模拟登录豆瓣如下
import json
import requests
def login():
username = "xxx@qq.com"
password = "xxx"
url = "https://accounts.douban.com/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("https://www.douban.com/").text
# 8ll是我的豆瓣昵称,登录之后会显示出来
if "8ll" in html:
print("已经登录")
else:
print("未登录")
我们需要用到 requests 的session,
session = requests.session()
然后在请求中,把 request都换成session,如下,就可以正常登陆了
html = session.get("https://www.douban.com/", 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.cookies
else:
print("登录失败")
# 上面已经登录了,下面继续登录首页,看看我们是否登录了
html = session.get("https://www.douban.com/", 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("https://www.douban.com/", 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("https://www.douban.com/", headers=headers, cookies=cookies).text
# 8ll是我的豆瓣昵称,登录之后会显示出来
if "8ll" in html:
print("已经登录")
else:
print("未登录")
完整代码如下:
# +--------------------------
# | User: zq -
# | Version: python3.7 -
# | Time: 2020-03-16 16:21
# +--------------------------
import json
import requests
import pickle
def login():
session = requests.session()
username = "xxxx@qq.com"
password = "xxxxx"
url = "https://accounts.douban.com/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("https://www.douban.com/", headers=headers, cookies=cookies).text
# 8ll是我的豆瓣昵称,登录之后会显示出来
if "8ll" in html:
print("已经登录")
else:
print("未登录")
if __name__ == "__main__":
login()