目前学习到的一种登录方法:
- 首先使用selenuim创建的浏览器对象打开京东的登录页面
- 在登录页面之后设置等待,我们手动扫码登录
- 扫码登录之后,就产生了含有本用户信息的cookie,保存这个cookie
- 保存cookie到本地,下次登录的使用可以直接读取,但是cookie是有有效期的
- 登录的时候读取本地cookie,使用drive.add_cookies()添加cookie,之后刷新页面,可以发现确实登录了。
代码:
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json
class CookieLogin():
def __init__(self):
self.drive = webdriver.Chrome()
self.url = 'https://passport.jd.com/new/login.aspx?/'
#先手动登录,让程序获取到cookie,保存下来
def getcookie(self):
#首先直接访问登录的页面 passport.jd.com
self.drive.get(self.url)
#扫码登录
#登录之后的页面会跳转到这里,让浏览器等待,直到url完全匹配
url='https://www.jd.com/'
WebDriverWait(self.drive,20).until(EC.url_to_be(url))
#登录之后停2秒
time.sleep(2)
#获取到的cookies是列表
cookieList = self.drive.get_cookies()
#转成字符串
cookieStr = json.dumps(cookieList)
# print(cookieStr)
with open('data/Jdcookie.txt', 'w') as f:
f.write(cookieStr)
print('cookie已写入')
print(self.drive.current_url)
self.drive.close()
#读取cookie
def readcookie(self):
self.drive.get('https://www.jd.com/')
with open('data/Jdcookie.txt',mode='r',encoding='utf-8') as f:
cookie = f.read()
#读取到的是字符串类型,loads之后就变成了python中的字典类型
cookie = json.loads(cookie)
#先把所有的cookie全部删掉
self.drive.delete_all_cookies()
for item in cookie:
print(type(item))
print(item)
self.drive.add_cookie(item)
#是一个列表内套字典的形式
self.drive.refresh()
time.sleep(5)
self.drive.close()
if __name__ == '__main__':
login = CookieLogin()
# login.getcookie()
login.readcookie()
注意的点:
cookieList = self.drive.get_cookies()
获取到的是cookies是python中的列表格式<class ‘list’>,然后使用json.dumps()
转为字符串,然后把这个字符串保存到文件中。(直接使用json.dump()
可以直接存到文件中),所以:
#转成字符串
cookieList = self.drive.get_cookies()
cookieStr = json.dumps(cookieList)
# print(cookieStr)
with open('data/Jdcookie.txt', 'w') as f:
f.write(cookieStr)
可以替换为
#转成字符串
cookieList = self.drive.get_cookies()
# print(cookieStr)
with open('data/Jdcookie.txt', 'w') as f:
json.dump(cookieList,f)
实现的效果是一样的。
这个时候,cookie就已经写到文件中了:
data/Jdcookie.txt
很长的一段。可以使用网页的json格式化输出:
这时候,有了cookie就可以直接登录京东了。
readcookie
函数从文件中读取刚才的cookie,文件中存储的是json字符串,读取之后的类型还是json字符串类型,需要使用json.loads()把它转为为python中的对象。转换之后是 列表内嵌套字典的形式,循环遍历列表,取出每一个字典,每一个字典就是一条cookie,一条条的添加到浏览器的cookies中。
add_cookie(self, cookie_dict)
接收的参数就是字典类型。