1. 程式人生 > >python爬蟲學習5_cookie的獲取、儲存和使用

python爬蟲學習5_cookie的獲取、儲存和使用

python爬蟲學習5_cookie的獲取、儲存和使用

Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。 比如說有些網站需要登入後才能訪問某個頁面,在登入之前,你想抓取某個頁面內容,登陸前與登陸後是不同的,或者不允許的。

在python中它為我們提供了cookiejar模組,它位於http包中,用於對Cookie的支援。通過它我們能捕獲cookie並在後續連線請求時重新發送,比如可以實現模擬登入功能。該模組主要的物件有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

## cookie的獲取

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
​
if __name__ == '__main__':
    #宣告一個CookieJar物件例項來儲存cookie
    cookie = cookiejar.CookieJar()
    #利用urllib.request庫的HTTPCookieProcessor物件來建立cookie處理器,也就CookieHandler
    handler=request.HTTPCookieProcessor(cookie)
    #通過CookieHandler建立opener
    opener = request.build_opener(handler)
    #此處的open方法開啟網頁
    response = opener.open('http://www.baidu.com')
    #列印cookie資訊
    for item in cookie:
        print('Name = %s' % item.name)
        print('Value = %s' % item.value)
​

cookie的檔案儲存

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
​
if __name__ == '__main__':
​
    #設定儲存cookie的檔案,同級目錄下的cookie.txt
    filename = 'cookie.txt'
    #宣告一個MozillaCookieJar物件例項來儲存cookie,之後寫入檔案
    cookie = cookiejar.MozillaCookieJar(filename)
    #利用urllib.request庫的HTTPCookieProcessor物件來建立cookie處理器,也就CookieHandler
    handler=request.HTTPCookieProcessor(cookie)
    #通過CookieHandler建立opener
    opener = request.build_opener(handler)
    #此處的open方法開啟網頁
    response = opener.open('http://www.baidu.com')
    #儲存cookie到檔案
    cookie.save(ignore_discard=True, ignore_expires=True)
​

載入儲存的cookie,並進行網頁訪問

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
​
if __name__ == '__main__':
    #設定儲存cookie的檔案的檔名,相對路徑,也就是同級目錄下
    filename = 'cookie.txt'
    #建立MozillaCookieJar例項物件
    cookie = cookiejar.MozillaCookieJar()
    #從檔案中讀取cookie內容到變數
    cookie.load(filename, ignore_discard=True, ignore_expires=True)
    #利用urllib.request庫的HTTPCookieProcessor物件來建立cookie處理器,也就CookieHandler
    handler=request.HTTPCookieProcessor(cookie)
    #通過CookieHandler建立opener
    opener = request.build_opener(handler)
    #此用opener的open方法開啟網頁
    response = opener.open('http://www.baidu.com')
    #列印資訊
    print(response.read().decode('utf-8'))

這裡對cookie的使用類似於,之前我們用到的對代理的使用。

載入cookie,實現網站的登入

# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
from urllib import parse
from http import cookiejar
​
if __name__ == '__main__':
    #登陸地址
    login_url = 'http://www.jobbole.com/wp-admin/admin-ajax.php'    
    #User-Agent資訊                   
    user_agent = r'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
    #Headers資訊
    head = {'User-Agnet': user_agent, 'Connection': 'keep-alive'}
    #登陸Form_Data資訊
    Login_Data = {}
    Login_Data['action'] = 'user_login'
    Login_Data['redirect_url'] = 'http://www.jobbole.com/'
    Login_Data['remember_me'] = '0'         #是否一個月內自動登陸
    Login_Data['user_login'] = '********'       #改成你自己的使用者名稱
    Login_Data['user_pass'] = '********'        #改成你自己的密碼
    #使用urlencode方法轉換標準格式
    logingpostdata = parse.urlencode(Login_Data).encode('utf-8')
    #宣告一個CookieJar物件例項來儲存cookie
    cookie = cookiejar.CookieJar()
    #利用urllib.request庫的HTTPCookieProcessor物件來建立cookie處理器,也就CookieHandler
    cookie_support = request.HTTPCookieProcessor(cookie)
    #通過CookieHandler建立opener
    opener = request.build_opener(cookie_support)
    #建立Request物件
    req1 = request.Request(url=login_url, data=logingpostdata, headers=head)
​
    #面向物件地址
    date_url = 'http://date.jobbole.com/wp-admin/admin-ajax.php'
    #面向物件
    Date_Data = {}
    Date_Data['action'] = 'get_date_contact'
    Date_Data['postId'] = '4128'
    #使用urlencode方法轉換標準格式
    datepostdata = parse.urlencode(Date_Data).encode('utf-8')
    req2 = request.Request(url=date_url, data=datepostdata, headers=head)
    try:
        #使用自己建立的opener的open方法
        response1 = opener.open(req1)
        response2 = opener.open(req2)
        html = response2.read().decode('utf-8')
        index = html.find('jb_contact_email')
        #列印查詢結果
        print('聯絡郵箱:%s' % html[index+19:-2])
​
    except error.URLError as e:
        if hasattr(e, 'code'):
            print("HTTPError:%d" % e.code)
        elif hasattr(e, 'reason'):
            print("URLError:%s" % e.reason)
​