Python之爬蟲-- cookie & session
阿新 • • 發佈:2018-11-02
目錄
為什麼要使用Cookie
Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。 比如說有些網站需要登入後才能訪問某個頁面,在登入之前,你想抓取某個頁面內容,登陸前與登陸後是不同的,或者不允許的。 使用Cookie和使用代理IP一樣,也需要建立一個自己的opener。在HTTP包中,提供了cookiejar模組,用於提供對Cookie的支援。
cookie & session
- 由於http協議的無記憶性,人們為了彌補這個缺憾,所採用的一個補充協議
- cookie是發放給使用者(即http瀏覽器)的一段資訊,session是儲存在伺服器上的對應的另一半資訊,用來記錄使用者資訊,可以用F12檢視Network中點選name中的資訊然後可以檢視cookie資訊
cookie和session的區別
- 存放位置不同
- cookie不安全
- session會儲存在伺服器上一定時間,會過期
- 單個cookie儲存資料不超過4k, 很多瀏覽器限制一個站點最多儲存20個
session的存放位置
- 存在伺服器端
- 一般情況,session是放在記憶體中或者資料庫中
- 沒有cookie登入 ,可以看到,沒使用cookie則反饋網頁為未登入狀態
- 案例1
使用cookie登入
- http.cookiejar功能強大,我們可以利用本模組的CookieJar類的物件來捕獲cookie並在後續連線請求時重新發送,比如可以實現模擬登入功能。該模組主要的物件有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
- (手動)直接把cookie複製下來,然後手動放入請求頭
- 案例 2
- 案例 2
- (自動)http模組包含一些關於cookie的模組,通過他們我們可以自動使用cookie
- CookieJar
- 管理儲存cookie,向傳出的http請求新增cookie,
- cookie儲存在記憶體中,CookieJar例項回收後cookie將消失
- FileCookieJar(filename, delayload=None, policy=None):
- 使用檔案管理cookie
- filename是儲存cookie的檔案
- MozillaCookieJar(filename, delayload=None, policy=None):
- 建立與mocilla瀏覽器cookie.txt相容的FileCookieJar例項
- LwpCookieJar(filename, delayload=None, policy=None):
- 建立與libwww-perl標準相容的Set-Cookie3格式的FileCookieJar例項
- 他們的關係是: CookieJar(派生出)-->FileCookieJar-->MozillaCookieJar & LwpCookieJar
- CookieJar
- 工作原理:建立一個帶有cookie的opener,在訪問登入的URL時,將登入後的cookie儲存下來,然後利用這個cookie來訪問其他網址。檢視登入之後才能看到的資訊。
-
利用cookiejar訪問人人, 案例3
- 自動使用cookie登入,大致流程是:
- 開啟登入頁面後自動通過使用者名稱密碼登入
- 自動提取反饋回來的cookie
- 利用提取的cookie登入隱私頁面
- handler是Handler的例項,用來處理複雜請求,常用參看案例程式碼
- # 生成 cookie的管理器
- cookie_handler = request.HTTPCookieProcessor(cookie)
- # 建立http請求管理器
- http_handler = request.HTTPHandler()
- # 生成https管理器
- https_handler = request.HTTPSHandler()
- 創立handler後,使用opener開啟,開啟後相應的業務由相應的hanlder處理
- cookie作為一個變數,打印出來, 案例4
- cookie的屬性
- name: 名稱
- value: 值
- domain:可以訪問此cookie的域名
- path: 可以訪問此cookie的頁面路徑
- expires:過期時間
- size: 大小
- Http欄位
- cookie的屬性
-
cookie的儲存-FileCookieJar, 案例5
-
cookie的讀取, 案例6
案例1:
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/965187997/profile"
rsp = request.urlopen(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
案例2:
from urllib import request
if __name__ == '__main__':
url = "http://www.renren.com/965187997/profile"
headers = {
#Cookie寫的是網頁中F12開啟,然後看Cookie資訊
"Cookie": ""
}
req = request.Request(url, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
案例3:
from urllib import request, parse
from http import cookiejar
# 建立cookiejar的例項
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 建立http請求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 建立請求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
負責初次登入
需要輸入使用者名稱密碼,用來獲取登入cookie憑證
:return:
'''
# 傳送登入資訊的地址,此url需要從登入form的action屬性中提取
url = "http://www.renren.com/PLogin.do"
# 此鍵值需要從登入form的兩個對應input中提取name屬性
data = {
"email": "13119144223",
"password": "123456"
}
# 把資料進行編碼
data = parse.urlencode(data)
# 建立一個請求物件
req = request.Request(url, data=data.encode())
# 使用opener發起請求
rsp = opener.open(req)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已經執行了login函式,則opener自動已經包含相應的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
if __name__ == '__main__':
login()
getHomePage()
案例4:
from urllib import request, parse
from http import cookiejar
# 建立cookiejar的例項
cookie = cookiejar.CookieJar()
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 建立http請求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 建立請求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
負責初次登入
需要輸入使用者名稱密碼,用來獲取登入cookie憑證
:return:
'''
# 此url需要從登入form的action屬性中提取
url = "http://www.renren.com/PLogin.do"
# 此鍵值需要從登入form的兩個對應input中提取name屬性
data = {
"email": "13119144223",
"password": "123456"
}
# 把資料進行編碼
data = parse.urlencode(data)
# 建立一個請求物件
req = request.Request(url, data=data.encode())
# 使用opener發起請求
rsp = opener.open(req)
if __name__ == '__main__':
'''
執行完login之後,會得到授權之後的cookie
我們嘗試把cookie打印出來
'''
login()
print(cookie)
for item in cookie:
print(type(item))
print(item)
for i in dir(item):
print(i)
案例5:
from urllib import request, parse
from http import cookiejar
# 建立filecookiejar的例項
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 建立http請求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 建立請求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def login():
'''
負責初次登入
需要輸入使用者名稱密碼,用來獲取登入cookie憑證
:return:
'''
# 此url需要從登入form的action屬性中提取
url = "http://www.renren.com/PLogin.do"
# 此鍵值需要從登入form的兩個對應input中提取name屬性
data = {
"email": "13119144223",
"password": "123456"
}
# 把資料進行編碼
data = parse.urlencode(data)
# 建立一個請求物件
req = request.Request(url, data=data.encode())
# 使用opener發起請求
rsp = opener.open(req)
# 儲存cookie到檔案
# ignor_discard表示及時cookie將要被丟棄也要儲存下來
# ignore_expire表示如果該檔案中cookie即使已經過期,儲存
cookie.save(ignore_discard=True, ignore_expires=True)
if __name__ == '__main__':
login()
案例6:
from urllib import request, parse
from http import cookiejar
# 建立cookiejar的例項
cookie = cookiejar.MozillaCookieJar()
#直接讀取上一個案例得到的cookie
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
# 生成 cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)
# 建立http請求管理器
http_handler = request.HTTPHandler()
# 生成https管理器
https_handler = request.HTTPSHandler()
# 建立請求管理器
opener = request.build_opener(http_handler, https_handler, cookie_handler)
def getHomePage():
url = "http://www.renren.com/965187997/profile"
# 如果已經執行了login函式,則opener自動已經包含相應的cookie值
rsp = opener.open(url)
html = rsp.read().decode()
with open("rsp.html", "w") as f:
f.write(html)
if __name__ == '__main__':
getHomePage()