兩個方法:
1、常用的方法: 第一種方法是登錄后查看網站的 cookie,請求 url 的時候把 cookie 帶上(缺點是:cookie有時間限制。優點:簡單,方便)
2、添加cookies的方式:思路是:先對比登錄前和登錄后的cookies區別,查看登錄后cookies里那些值是多出來的,然后通過添加cookies的方式,將值添加進去;這樣就可以達到跳過登錄的效果。(缺點:邏輯性比較復雜,代碼量多。優點:可以保證每次cookies都是有效的)
具體操作步驟:
1、通過抓包工具,分享登錄前與登錄后的cookies信息


2、通過不同的方式,需要添加到cookies里的值(重點:怎么去動態獲取這些值)
class DictJson:
@staticmethod
def case_ins_dict_json(username, password):
# CaseInsensitiveDict 也是一種字典抽象類。轉字典
# 獲取時間
h_data = UserLogin().pc_user_login(username=username, password=password)[0]
headers_data = dict(h_data)
set_cookie = headers_data['Set-Cookie']
c = set_cookie.split(';')[2]
expires = c.split('=')[1]
ans_time = int(time.mktime(time.strptime(expires, '%a, %d-%b-%Y %H:%M:%S %Z')))
# 獲取user_ticket
c_data = UserLogin().pc_user_login(username=username, password=password)[1]
a = dict(c_data)['cookies']
user_ticket = a.split('\"')[11]
return ans_time, user_ticket
CaseInsensitiveDict:
可知,CaseInsensitiveDict是從MutableMapping派生的,即其父類是MutableMapping,中文名叫“可變映射”,那么這個MutableMapping到底是何方神聖?
從Python3的官方文檔中可以找到它,具體在 8.4. collections.abc — Abstract Base Classes for Containers中可以找到它的定義
| ABC | Inherits from | Abstract Methods | Mixin Methods | | -------------- | ------------- | -------------------------------------------------------- | ------------------------------------------------------------ | | MutableMapping | Mapping | getitem, setitem, delitem, iter, len | Inherited Mapping methods and pop, popitem, clear, update, and setdefault |
我們可以簡單的認為,這是一個字典抽象類,你只要自己實現了其中的getitem, setitem, delitem, iter, len方法即可實現一個自己的字典,而CaseInsensitiveDict正是基於此構造了自己的數據結構。
split(): Python split() 通過指定分隔符對字符串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字符串 ---------https://www.runoob.com/python/att-string-split.html
time.strptime() : Python time strptime() 函數根據指定的格式把一個時間字符串解析為時間元組。------------------https://www.runoob.com/python/att-time-strptime.html
3、將獲取到的值,添加到cookies里
class GetLogin:
def __init__(self, driver):
self.dr = driver
# 讀取url
def cookie_login(self, url, username, password):
"""帶cookie登錄繞過驗證碼"""
# 獲取user_ticket
user_ticket = DictJson().case_ins_dict_json(username=username, password=password)[1]
# 獲取時間戳
expiry_time = DictJson().case_ins_dict_json(username=username, password=password)[0]
time.sleep(2)
# 打開瀏覽器
GetBrowser(driver=self.dr).open_browser(url=url)
# 添加cookie
c_ticket = {
'domain': '.veryeast.cn',
'expiry': expiry_time,
'httpOnly': False,
'path': '/',
'secure': False,
'name': 'ticket',
'value': user_ticket
}
c_name = {
'domain': '.veryeast.cn',
'expiry': expiry_time,
'httpOnly': False,
'path': '/',
'secure': False,
'name': 'username',
'value': username
}
c_user_type = {
'domain': '.veryeast.cn',
'expiry': expiry_time,
'httpOnly': False,
'path': '/',
'secure': False,
'name': 'user_type',
'value': '2'
}
GetBrowser(driver=self.dr).add_cookies(cookie=c_ticket)
GetBrowser(driver=self.dr).add_cookies(cookie=c_name)
GetBrowser(driver=self.dr).add_cookies(cookie=c_user_type)
# 等待3S
time.sleep(3)
# 刷新頁面
GetBrowser(driver=self.dr).refresh_browser()
4、刷新頁面,即可實現登錄
