python網絡爬蟲系列(三)——cookie的原理、保存與加載

一、什麼是cookie?

在網站中,http請求是無狀態的.也就是說即使第一次和服務器連接後並且登錄成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。
cookie的出現就是爲了解決這個問題,第一次登錄後服務器返回一些數據(cookie)給瀏覽器,然後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB.因此使用cookie 只能存儲一些小量的數據.
cookie的格式:

Set-Cookie:NAME=VALUE:Expires/Max-age=DATE;Path=PATH;Domain=DONAIIN_NAME;SECURE

參數意義:

  • NAME:cookie的名字。
  • VALUE:cookie的值。
  • Expires:cookie的過期時間。
  • Path:cookie作用的路徑。
  • Domain:cookie作用的域名。
  • SECURE:是否只在https協議下起作用。

使用cookielib庫和HTTPCookieProcessor模擬登錄:
Cookie是指網站服務器爲了辨別用戶身份和進行Session跟蹤,而儲存在用戶刻覽器上的文本文件,Cookie可以保持登錄信息到用戶下次與服務器的會話。
這裏以人人網爲例。人人網中,要訪問某個人的主頁,必須先登錄才能訪問,登錄說白了就是要有cookie信息。那麼如果我們想要用代碼的方式訪問,就必須要有正確的cookie信息才能訪問。解決方案有兩種,第一種是使用刻覽器訪問,然後將cookie信息複製下來,放到headers中。示例代碼如下:

from urllib import request


# 1.不使用cookie請求大鵬主頁
# dapeng_url = "http://www.renren.com/880151247/profile"
# headers = {
#     "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
#
# }
#
# req = request.Request(url=dapeng_url,headers=headers)
# resp = request.urlopen(req)
# # print(resp.read().decode('utf-8'))
# with open('renren.html','w') as fp:
#     # write函數必須寫入一個str的數據類型
#     # resp.read()讀出來的是bytes數據類型
#     # bytes -> decode -> str
#     # str -> encode -> bytes
#     fp.write(resp.read().decode('utf-8'))


# 2.使用cookie
dapeng_url = "http://www.renren.com/880151247/profile"
headers = {
    "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36",
    "Cookie":"anonymid=kc8gdto1-vg5rhe; depovince=ZGQT; _r01_=1; taihe_bi_sdk_uid=e248d1662297420b5f06cd39f5473be6; JSESSIONID=abcd7dz_b4rckd6y2ZEmx; taihe_bi_sdk_session=73ccff9edc2442cb1943f51498722d59; ick_login=917cc18b-cda3-4db0-9cfb-da1e66d794ed; t=7e664919cb492b651432f05ae73537fd8; societyguester=7e664919cb492b651432f05ae73537fd8; id=974712998; xnsid=e1262476; jebecookies=cc307376-600f-4a31-8694-23c4c218aecb|||||; ver=7.0; loginfrom=null; XNESSESSIONID=ac057eb05af7; WebOnLineNotice_974712998=1"

}

req = request.Request(url=dapeng_url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('renren1.html','w',encoding='utf-8') as fp:
    # write函數必須寫入一個str的數據類型
    # resp.read()讀出來的是bytes數據類型
    # bytes -> decode -> str
    # str -> encode -> bytes
    fp.write(resp.read().decode('utf-8'))


在這裏插入圖片描述
但是每次在訪問需要cookie的頁面都要從瀏覽器中複製cookiet較麻煩。在Python處理Cookie,一般是通過http.cookiejar模塊和ur11ib慣塊的HTTPCookieProcessor 處理器類一起使用。http.cookiejar模塊主要作用是提供用於存儲cookie的對象。
而HTTPCookieProcessor 處理器主要作用是處理這些cookie對象,並構建handler對象。

http.cookiejar模塊:
該模塊主要的類有CookieJar、FileCookieJar、MozllaCookieJar、LwPCookieJar。這四個類的作用分別如下:

  1. CookieJar:管理HTTP cookie值、存儲HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的對象。整個cookie都存儲在內存中,對CookieJar實例進行垃圾回收後cookie也將丟失。

  2. FileCookieJar(filename.delayload=None,policy=None):從CookieJar派生而來,用來創建FileCookieJar實例,檢素cookie信息並將cookie存儲到文件中。filename是存儲cookie的文件名。delayload爲True時支持延遲訪問訪問文件,即只有在需要時纔讀取文件或在文件中存儲數據。

  3. MozillaCookieJar(filename.delayload=None.policy=None):從FileCookieJar凝生而來,創建與Mozilla/覽器cookies.txt兼容的FileCookieJar實例。

  4. LWPCookieJar(filename,delayload=None,policy=None):從FileCookieJar派生而來,創建與libwww-per標準的 Set-Cookie3文件格式兼容的FileCookieJar實例。

利用http.cookiejar和request.HTTPCookieprocessor登錄人人網。相關示例代碼如下:

from urllib import request
from http.cookiejar import CookieJar
from urllib import parse


# 1、登錄
# 1.1 創建一個cookiejar對象
cookiejar = CookieJar()

# 1.2 使用cookiejar創建一個HTTPCookieProcess對象
handler = request.HTTPCookieProcessor(cookiejar)

# 1.3 使用上一步創建的handler創建一個opener
opener = request.build_opener(handler)

# 1.4 使用opener發送登錄請求(人人網的郵箱和密碼)
headers = {
"User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}
data = {
    'email':"你的用戶郵箱",
    'password':"密碼"
}


login_url = "http://www.renren.com/PLogin.do"
req = request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req)

# 2、訪問個人主頁
dapeng_url = "http://www.renren.com/880151247/profile"
# 獲取個人主頁信息頁面時,不要新建opener
# 應該使用前面創建好的opener,因爲之前的那個opener已經包含了登錄所需要的cookie信息
req = request.Request(dapeng_url,headers=headers)
resp = opener.open(req)
with open('renren2.html','w',encoding='utf-8') as fp :
    fp.write(resp.read().decode('utf-8'))
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse

headers = {
    "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
}

def get_opener():
    # 1、登錄
    # 1.1 創建一個cookiejar對象
    cookiejar = CookieJar()

    # 1.2 使用cookiejar創建一個HTTPCookieProcess對象
    handler = request.HTTPCookieProcessor(cookiejar)

    # 1.3 使用上一步創建的handler創建一個opener
    opener = request.build_opener(handler)
    return opener

def login_renren(opener):
    # 1.4 使用opener發送登錄請求(人人網的郵箱和密碼)
    data = {
        'email': "你的用戶郵箱",
        'password': "密碼"
    }

    login_url = "http://www.renren.com/PLogin.do"
    req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
    opener.open(req)



def visit_profile(opener):
    # 2、訪問個人主頁
    dapeng_url = "http://www.renren.com/880151247/profile"
    # 獲取個人主頁信息頁面時,不要新建opener
    # 應該使用前面創建好的opener,因爲之前的那個opener已經包含了登錄所需要的cookie信息
    req = request.Request(dapeng_url, headers=headers)
    resp = opener.open(req)
    with open('renren3.html', 'w', encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))


if __name__ == '__main__':
    opener = get_opener()
    login_renren(opener)
    visit_profile(opener)

在這裏插入圖片描述

保存cookie到本地:
保存cookie到本地,可以使用cookiejarsave方法,並且需要指定一個文件名:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

resp = opener.open('http://www.baidu.com/')

cookiejar.save()

在這裏插入圖片描述
通過http://httpbin.org/cookies/set?course=abc 來設置cookie:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar('cookie1.txt')
# cookiejar.load()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

# resp = opener.open('http://www.baidu.com/')
resp = opener.open('http://httpbin.org/cookies/set?course=abc')
# resp = opener.open('http://httpbin.org/cookies')
# for cookie in cookiejar:
#     print(cookie)
cookiejar.save(ignore_discard=True)

在這裏插入圖片描述
加載保存在本地的cookie:

from urllib import request
from http.cookiejar import MozillaCookieJar

cookiejar = MozillaCookieJar('cookie1.txt')
cookiejar.load(ignore_discard=True) # 加載保存在本地的cookie
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)

# resp = opener.open('http://www.baidu.com/')
# resp = opener.open('http://httpbin.org/cookies/set?course=abc')
resp = opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:
    print(cookie)
# cookiejar.save(ignore_discard=True)

在這裏插入圖片描述

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