Cookies與會話物件

tycoon1988發表於2014-10-28

第一次訪問頁面後,Server可將Cookie資訊加入HTTP Header返回給瀏覽器,瀏覽器會自動將這些資訊儲存在本地;
當再次訪問相同域名時,瀏覽器將對應Cookie資訊隨請求一起傳送,Server端可讀取這些資訊進行處理。
Cookie可設定過期時間,到期後由瀏覽器自動刪除;


當我們要返回頁面時,首先輸出如下:

  1. print "Content-type: text/plain\n" 
print "Content-type: text/plain\n"


它其實是一個HTTP Header, 連續碰到兩個換行表示HTTP Header部分結束,剩餘部分將被做為資料處理;
包含了Cookie後輸出大致如下:

  1. print "Content-Type: text/html" 
  2. print "Set-Cookie: session=12345" 
  3. print   # 多加一個換行表示HTTP Header部分結束 
print "Content-Type: text/html"
print "Set-Cookie: session=12345"
print   # 多加一個換行表示HTTP Header部分結束


程式碼:

setcookie.py

  1. #!/usr/bin/env python 
  2.  
  3. import Cookie 
  4. import datetime 
  5. import random 
  6.  
  7. expiration = datetime.datetime.now() + datetime.timedelta(days=30
  8. cookie = Cookie.SimpleCookie() 
  9. cookie["session"] = random.randint(0,1000000000
  10. cookie["session"]["domain"] = "localhost" 
  11. cookie["session"]["path"] = "/" 
  12. cookie["session"]["expires"] = \ 
  13.   expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST"
  14.  
  15. print "Content-type: text/plain" 
  16. print cookie.output() 
  17. print 
  18. print "Cookie set with: " + cookie.output() 
#!/usr/bin/env python

import Cookie
import datetime
import random

expiration = datetime.datetime.now() + datetime.timedelta(days=30)
cookie = Cookie.SimpleCookie()
cookie["session"] = random.randint(0,1000000000)
cookie["session"]["domain"] = "localhost"
cookie["session"]["path"] = "/"
cookie["session"]["expires"] = \
  expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")

print "Content-type: text/plain"
print cookie.output()
print
print "Cookie set with: " + cookie.output()

getcookie.py
  1. #!/usr/bin/env python 
  2.  
  3. import Cookie 
  4. import os 
  5.  
  6. print "Content-type: text/plain\n" 
  7.  
  8. try
  9.     cookie = Cookie.SimpleCookie(os.environ["HTTP_COOKIE"]) 
  10.     print "session = " + cookie["session"].value 
  11. except (Cookie.CookieError, KeyError): 
  12.     print "session cookie not set!" 

 

六、Cookies與會話物件

如果某個響應中包含一些Cookie,你可以快速訪問它們:

Code example:
1
2
3
4
5
import requests
r = requests.get('http://www.google.com.hk/')
print(r.cookies['NID'])
print(tuple(r.cookies))

要想傳送你的cookies到伺服器,可以使用 cookies 引數:

Code example:
1
2
3
4
5
6
7
import requests
url = 'http://httpbin.org/cookies'
cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
# 在Cookie Version 0中規定空格、方括號、圓括號、等於號、逗號、雙引號、斜槓、問號、@,冒號,分號等特殊符號都不能作為Cookie的內容。
r = requests.get(url, cookies=cookies)
print(r.json())

會話物件讓你能夠跨請求保持某些引數,最方便的是在同一個Session例項發出的所有請求之間保持cookies,且這些都是自動處理的,甚是方便。
下面就來一個真正的例項,如下是快盤簽到指令碼:

Code example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'Accept-Encoding': 'gzip, deflate, compress',
           'Accept-Language': 'en-us;q=0.5,en;q=0.3',
           'Cache-Control': 'max-age=0',
           'Connection': 'keep-alive',
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
s = requests.Session()
s.headers.update(headers)
# s.auth = ('superuser', '123')
s.get('https://www.kuaipan.cn/account_login.htm')
_URL = 'http://www.kuaipan.cn/index.php'
s.post(_URL, params={'ac':'account', 'op':'login'},
       data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})
r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})
print(r.json())
s.get(_URL, params={'ac':'common', 'op':'usersign'})

相關文章