python之selenium or requests 獲取cookie

原文地址:https://blog.csdn.net/qq_38282706/article/details/80639803

要點:1.selenium的cookies是多個字典組成的list,而且有很多鍵值

         2.selenium 想要添加cookies,得先登錄對應域名的網址,再添加,一旦cookies裏有不同域名(domain)就會報錯!

         3.requests的cookies只需name跟value即可


最近研究用selenuim 登錄純JS加載的網站獲取信息,到後面想用cookies免登錄時,發現selenium跟requests 使用cookies的一些差別

用selenuim登錄網站後,driver.get_cookies()就會得到此時的cookies,注意,這是多個dict組成的list

登錄企名片(http://auth.qimingpian.com/finos.html)後cookies的內容如下:

cookies=\
[
{'domain': '.vip.qimingpian.com',   'path': '/', 'httpOnly': False, 'name': 'userinfo',                                 'expiry': None,       'secure': False, 'value': '{%22nickname%22:%22%E5%81%A5%EB%88%88_%EB%88%88%22%2C%22headimgurl%22:%22http://img1.qimingpian.com/wximg/171351ea5349c8c3723c808b048ba818.jpg%22%2C%22coin%22:%2250%22%2C%22applySubmit%22:%220%22%2C%22team_flag%22:%220%22%2C%22team_uuid%22:%22%22%2C%22vip_out_date%22:%22%22%2C%22usernum%22:%22864636697%22%2C%22team_enterprise%22:%220%22%2C%22enterprise_coin%22:%220%22%2C%22is_admin%22:%220%22%2C%22is_manager%22:%220%22%2C%22first_shenqing%22:%220%22%2C%22phone%22:%2213630499459%22%2C%22apply_phone%22:%2213630499459%22%2C%22scope%22:%22qmp%22%2C%22apply_state%22:3%2C%22liyou%22:%22%22%2C%22is_certify%22:0%2C%22ip%22:%22183.2.90.153%22%2C%22person_role%22:%22%22%2C%22claim_type%22:0%2C%22expireinfo%22:false%2C%22inneruser%22:false}'},
{'domain': '.qimingpian.com',       'path': '/', 'httpOnly': False, 'name': 'time_token',                               'expiry': 1529368822, 'secure': False, 'value': '1528504828414'},
{'domain': '.vip.qimingpian.com',   'path': '/', 'httpOnly': False, 'name': 'Hm_lvt_1e712c5331439bcf163b46f3d208f00b',  'expiry': 1560040822, 'secure': False, 'value': '1528191935,1528192457,1528504823'},
{'domain': '.vip.qimingpian.com',   'path': '/', 'httpOnly': False, 'name': 'Hm_lpvt_1e712c5331439bcf163b46f3d208f00b', 'expiry': None,       'secure': False, 'value': '1528504823'},
{'domain': 'vip.qimingpian.com',    'path': '/', 'httpOnly': False, 'name': '102921|0|0|9|1|1|',                        'expiry': 1528504833, 'secure': False, 'value': '102921%7C0%7C0%7C9%7C1%7C1%7C'},
{'domain': '.qimingpian.com',       'path': '/', 'httpOnly': False, 'name': 'unionid',                                  'expiry': 1529368823, 'secure': False, 'value': 'HYSyhBeZG1C9ydWJCU9/LhfTok2z/lioTdcZ4Td+LyS3oTbOlCL1akRJTwSrhAldeJWqqIs6kiQsM8IbOYgM5A=='},
{'domain': 'vip.qimingpian.com',    'path': '/', 'httpOnly': False, 'name': 'userinfo',                                 'expiry': None,       'secure': False, 'value': '{%22nickname%22:%22%E5%81%A5%EB%88%88_%EB%88%88%22%2C%22headimgurl%22:%22http://img1.qimingpian.com/wximg/171351ea5349c8c3723c808b048ba818.jpg%22%2C%22coin%22:%2250%22%2C%22applySubmit%22:%220%22%2C%22team_flag%22:%220%22%2C%22team_uuid%22:%22%22%2C%22vip_out_date%22:%22%22%2C%22usernum%22:%22864636697%22%2C%22team_enterprise%22:%220%22%2C%22enterprise_coin%22:%220%22%2C%22is_admin%22:%220%22%2C%22is_manager%22:%220%22%2C%22first_shenqing%22:%220%22%2C%22phone%22:%2213630499459%22%2C%22apply_phone%22:%2213630499459%22%2C%22scope%22:%22qmp%22%2C%22apply_state%22:3%2C%22liyou%22:%22%22%2C%22is_certify%22:0%2C%22ip%22:%22113.93.105.10%22%2C%22person_role%22:%22%22%2C%22claim_type%22:0%2C%22expireinfo%22:false%2C%22inneruser%22:false%2C%22apply_pro_state%22:3}'},
]
#可以看到,每個字典有多個鍵,它們的含義是:
name: cookie的名稱
value: cookie對應的值,動態生成的
domain: 服務器域名
expiry: cookie有效終止日期
path: Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的cookie
httpOnly: 防腳本攻擊
secure: 在cookie中標記該變量,表明只有當瀏覽器和Web Server之間的通信協議爲加密認證協議時(當前即https),瀏覽器才向服務器提交相應的cookie

那好,得到了cookies後,再次用selenium登錄,直接用for in循環加driver.add_cookie(cookie)就搞定了吧!
錯錯!!此時會彈出錯誤:

selenium.common.exceptions.InvalidCookieDomainException: Message: Cookies may only be set for the current domain (auth.qimingpian.com)

請看看domain:4個帶vip,2個是不帶vip的,域名不同,所以報錯,琢磨了下,我改爲這樣,

driver.get('http://auth.qimingpian.com/finos.html')
for i in cookies:
    if i['domain'][1:] in driver.current_url:
        driver.add_cookie(i)

driver.get(http://vip.qimingpian.com/#/finos/investment/ishijian)
for i in cookies:
if i[‘domain’][1:] in driver.current_url:
driver.add_cookie(i)

driver.refresh()

ok!此時登錄成功,特別說明下,selenium添加cookies時,得先登錄網址才能添加cookies的


==========
上面是利用之前selenium登錄後的cookies 再次到selenium上免登陸進入網頁的,那麼能用requests登錄嗎?
答案是肯定的,需要注意的是,requests的cookies只需name跟value
寫法如下:

cookies1={}
for cookie in cookies:
cookies1[cookie[‘name’]]=cookie[‘value’]
cookies1={
‘time_token’: ‘1528504828414’,
‘Hm_lpvt_1e712c5331439bcf163b46f3d208f00b’: ‘1528504823’,
‘Hm_lvt_1e712c5331439bcf163b46f3d208f00b’: ‘1528191935,1528192457,1528504823’,
‘unionid’: 'HYSyhBeZG1C9ydWJCU9/LhfTok2z/lioTdcZ4Td+LyS3oTbOlCL1akRJTwSrhAldeJWqqIs6kiQsM8IbOYgM5A’,
‘userinfo’: ‘{%22nickname%22:%22%E5%81%A5%EB%88%88_%EB%88%88%22%2C%22headimgurl%22:%22http://img1.qimingpian.com/wximg/171351ea5349c8c3723c808b048ba818.jpg%22%2C%22coin%22:%2250%22%2C%22applySubmit%22:%220%22%2C%22team_flag%22:%220%22%2C%22team_uuid%22:%22%22%2C%22vip_out_date%22:%22%22%2C%22usernum%22:%22864636697%22%2C%22team_enterprise%22:%220%22%2C%22enterprise_coin%22:%220%22%2C%22is_admin%22:%220%22%2C%22is_manager%22:%220%22%2C%22first_shenqing%22:%220%22%2C%22phone%22:%2213630499459%22%2C%22apply_phone%22:%2213630499459%22%2C%22scope%22:%22qmp%22%2C%22apply_state%22:3%2C%22liyou%22:%22%22%2C%22is_certify%22:0%2C%22ip%22:%22113.93.105.10%22%2C%22person_role%22:%22%22%2C%22claim_type%22:0%2C%22expireinfo%22:false%2C%22inneruser%22:false%2C%22apply_pro_state%22:3}’,
‘102921|0|0|9|1|1|’: ‘102921%7C0%7C0%7C9%7C1%7C1%7C’
}
此時requests.get(url,cookies=cookies1,headers=headers) 即可

不過,如果你想反過來,用request的cookies在selenium上登陸,那是不行的!因爲domain得指定!!


=

在研究selenium登錄百度時,發現很蛋疼的事,原來百度的cookies是不通用的!

百度首頁:https://www.baidu.com/

百度貼吧:https://tieba.baidu.com

百度網盤:https://pan.baidu.com/

如果你用selenium登錄了百度首頁,然後把cookies保存下來,用此cookies是不能直接登錄貼吧跟網盤的!不過網盤跟貼吧的倒可以直接登錄首頁。

原因出自哪裏呢?原來還是domain! 貼吧是’.tieba.baidu.com’  網盤是’.pan.baidu.com’

不同的,所以想要同時能登錄,每個域名都得保持下來



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章