簡介:
Cookie,有時也用其復數形式 Cookies,指某些網站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據。
常見的用途就是保留用戶登陸信息,登陸時的7天免登陸,記住我…………這些都是通過cookie實現的。
一:認識cookie
還是firefox,打開百度,登陸一下,shifit+F9,即可彈出存儲探查器。看到cookie了吧,百度給你留下的東西還真不少。
chrome快捷鍵是ctrl+shifit+i
Cookie由變量名和值組成,類似Javascript變量。其屬性里既有標准的Cookie變量,也有用戶自己創建的變量,屬性中變量是用“變量=值”形式來保存。
根據Netscape公司的規定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
NAME=VALUE
這是每一個Cookie均必須有的部分。NAME是該Cookie的名稱,VALUE是該Cookie的值。在字符串“NAME=VALUE”中,不含分號、逗號和空格等字符。
Expires=DATE:Expires變量是一個只寫變量,它確定了Cookie有效終止日期。該屬性值DATE必須以特定的格式來書寫:星期幾,DD-MM-YY HH:MM:SS GMT,GMT表示這是格林尼治時間。反之,不以這樣的格式來書寫,系統將無法識別。該變量可省,如果缺省時,則Cookie的屬性值不會保存在用戶的硬盤中,而僅僅保存在內存當中,Cookie文件將隨着瀏覽器的關閉而自動消失。
Domain=DOMAIN-NAME:Domain該變量是一個只寫變量,它確定了哪些Internet域中的Web服務器可讀取瀏覽器所存取的Cookie,即只有來自這個域的頁面才可以使用Cookie中的信息。這項設置是可選的,如果缺省時,設置Cookie的屬性值為該Web服務器的域名。
Path=PATH:Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的Cookie。一般如果用戶輸入的URL中的路徑部分從第一個字符開始包含Path屬性所定義的字符串,瀏覽器就認為通過檢查。如果Path屬性的值為“/”,則Web服務器上所有的WWW資源均可讀取該Cookie。同樣該項設置是可選的,如果缺省時,則Path的屬性值為Web服務器傳給瀏覽器的資源的路徑名。
可以看出我們借助對Domain和Path兩個變量的設置,即可有效地控制Cookie文件被訪問的范圍。
Secure:在Cookie中標記該變量,表明只有當瀏覽器和Web Server之間的通信協議為加密認證協議時,瀏覽器才向服務器提交相應的Cookie。當前這種協議只有一種,即為HTTPS。
二:python+selenium 獲取cookie
嘗試運行下面的代碼
from selenium import webdriver driver=webdriver.Firefox() driver.get('http://www.baidu.com') cookie=driver.get_cookies() print(cookie) driver.quit() print('----------') driver=webdriver.Chrome() driver.get('http://www.baidu.com') cookie=driver.get_cookies() print(cookie) driver.quit()
輸出結果大概是這樣的:
firefox
[{'name': 'BAIDUID', 'value': '53****************
chrome
[{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H***********
這是由字典組成的列表,也就是列表的嵌套。
分解看一下:
from selenium import webdriver driver=webdriver.Firefox() driver.get('http://www.baidu.com') cookie=driver.get_cookies() print('firefox') print(cookie) for i in cookie: for k,v in i.items(): print(k,'-->',v) print('-------') driver.quit() print('-------------------') driver=webdriver.Chrome() driver.get('http://www.baidu.com') cookie=driver.get_cookies() print('chrome') print(cookie) for i in cookie: for k,v in i.items(): print(k,'-->',v) print('-------') driver.quit()
結果比較多,firefox chrome各取一組吧
firefox:
name --> BAIDUID value --> 77E48BCEEFBD3936310DDD65BF9B2732:FG=1 path --> / domain --> .baidu.com expiry --> 3665365219 secure --> False httpOnly --> False
chrome:
domain --> .baidu.com expiry --> 1549417579.219434 httpOnly --> False name --> BAIDUID path --> / secure --> False value --> E5F0899A387E3944B0B8F09D255D9A73:FG=1
雖然順序不一樣,但是結構是一樣的。
domain path name value expiry secure httpOnly
三:寫入cookie
首先介紹一個web調試網站:http://httpbin.org/
這個網站就是調試web用的,比如說我們現在操作的cookie,和服務器交互等等的原理不考慮,但是我們和服務器交互的內容怎么看呢?
這個網站就提供了顯示交互內容的功能,不僅有cookie,還有ip user-agent headers …………
現在我們看一下cookies http://httpbin.org/cookies
cookies是空的。
我們嘗試一下寫個cookie進去。
""" Adds a cookie to your current session. :Args: - cookie_dict: A dictionary object, with required keys - "name" and "value"; optional keys - "path", "domain", "secure", "expiry" Usage: driver.add_cookie({'name' : 'foo', 'value' : 'bar'}) driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'}) driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True}) """ from time import sleep from selenium import webdriver driver = webdriver.Firefox() driver.get('http://httpbin.org/cookies') print(driver.get_cookies()) c1 = { 'name':'username', 'value':'jackadam', # 'path':'/', # 'domain':'httpbin.org', # 'secure':False, # 'expiry':None, } driver.add_cookie(c1) print(driver.get_cookies()) sleep(3) driver.refresh() sleep(3) driver.quit()
首先訪問http://httpbin.org/cookies,然后增加一條cookie,等3秒后刷新,再等3秒,關閉瀏覽器。
官方文檔寫的,必選項name value,可選項path domain secure expiry
所以,注釋掉的可選項,你也可以加上去。
注意:要首先打開這個網站,才可以給這個網站增加cookie。或許可以通過profile方式,先加載cookie再打開網站(研究中)