1. 程式人生 > >Python之爬蟲-- cookie & session

Python之爬蟲-- cookie & session

目錄

cookie & session

cookie和session的區別

session的存放位置

使用cookie登入

利用cookiejar訪問人人, 案例3

cookie的儲存-FileCookieJar, 案例5

cookie的讀取, 案例6 

案例1: 

案例2: 

案例3: 

案例4: 

案例5: 

案例6: 


為什麼要使用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
  • 自動)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 
  • 工作原理:建立一個帶有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的儲存-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()