摘要:相當于該用戶的檔案。上述的文字對機制描述的比較簡單也并不一定完全正確。但是默認的并不支持。中供我們使用的是。創建需要闖入一個存放的容器。即過期的也保存。目前博主只知道鏈接后帶的參數需要與相匹配。但是并不知道兩者具體的關系。
很多網站的資源需要用戶登錄之后才能獲取。
我們一旦登錄后再訪問其他被保護的資源的時候,就不再需要再次輸入賬號、密碼。那么網站是怎么辦到的呢?
一般來說,用戶在登錄之后,服務器端會為該用戶創建一個Session。Session相當于該用戶的檔案。該檔案就代表著該用戶。
那么某一次訪問請求是屬于該用戶呢?登錄的時候服務器要求瀏覽器儲存了一個Session ID的Cookie值。每一個訪問都帶上了該Cookie。服務器將Cookie中的Session ID與服務器中的Session ID比對就知道該請求來自哪個用戶了。
上述的文字對Session機制描述的比較簡單也并不一定完全正確。更加詳細的資料可以閱讀:http://blog.csdn.net/fangaoxi...
opener通過閱讀源碼我們可以知道,我們在調用urllib2.urlopen(url)的時候,其實urllib2在open函數內部創建了一個默認的opener對象。然后調用opener.open()函數。
但是默認的opener并不支持cookie。
那么我們先新建一個支持cookie的opener。urllib2中供我們使用的是HTTPCookieProcessor。
創建HTTPCookieProcessor需要闖入一個存放cookie的容器。
Python提供的存放cookie的容器位于cookielib,有以下幾個。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar
示例代碼:
import cookielib import urllib2 cookies = cookielib.CookieJar() cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies) opener = urllib2.build_opener(cookieHandler) urllib2.install_opener(opener) request = urllib2.Request("http://www.baidu.com") urllib2.urlopen(request) for cookie in cookies: print cookie.name, cookie.value
上面的代碼顯示,urllib2的確幫我們把cookie從response中提取出來。但是如何保存在一個文件中呢?
FileCookieJarFileCookieJar 實現了save()、load()、revert()三個函數。
但是通過查看FileCookieJar的源碼我們可以發現,FileCookeJar并沒有實現save()的具體功能,而是直接拋出了NotImplementedError。
def save(self, filename=None, ignore_discard=False, ignore_expires=False): """Save cookies to a file.""" raise NotImplementedError()
而FileCookieJar的子類MozillaCookieJar和LWPCookieJar實現了save()方法。
示例代碼:
# coding=utf-8 import cookielib import urllib2 cookies = cookielib.MozillaCookieJar() cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies) opener = urllib2.build_opener(cookieHandler) urllib2.install_opener(opener) request = urllib2.Request("http://www.baidu.com") urllib2.urlopen(request) # 將cookie存為一個文件 cookies.save(filename="cookie.txt") # 新建一個cookie對象 cookies2 = cookielib.MozillaCookieJar() # 從文件中讀取cookie cookies2.load("cookie.txt") for cookie in cookies2: print cookie.name, cookie.value
save()函數帶有兩個參數,ignore_discard和ignore_expires。
ignore_discard: save even cookies set to be discarded. 即也保存需要被丟棄的cookie。
ignore_expires: save even cookies that have expired. 即過期的cookie也保存。
上面提到了save()、load(),還有一個函數未提到即revert()。revert()函數的作用是Clear all cookies and reload cookies from a saved file.
模擬登錄實際操作我們來試一下模擬登錄SegmentFault。
示例代碼如下:
import urllib import urllib2 import cookielib cookies = cookielib.MozillaCookieJar() cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies) opener = urllib2.build_opener(cookieHandler) urllib2.install_opener(opener) postData = { "remember": 1, "username": "YOUREMAIL", "password": "YOURPASSWORD" } headers = { "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4", "Connection": "keep-alive", "Content-Length": "54", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "_gat=1; PHPSESSID=YOUR_PHPSESSID; _ga=GA1.2.741059584.1485746441; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1485746441; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1485746618", "DNT": "1", "Host": "segmentfault.com", "Origin": "https://segmentfault.com", "Referer": "https://segmentfault.com/", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } request = urllib2.Request("https://segmentfault.com/api/user/login?_=57f36e7f98914cc9a7971aebc264e113", headers=headers) request.add_data(urllib.urlencode(postData)) response = urllib2.urlopen(request) print response.getcode() for cookie in cookies: print cookie.name, cookie.value response = urllib2.urlopen("https://segmentfault.com/u/charliecharlie") print response.read()
但是目前這個模擬登錄并不完美。
實際上瀏覽器在訪問第一個頁面的時候,服務器就在Response中返回了一個cookie,設置了一個PHPSESSID的Cookie。
目前博主只知道login鏈接后帶的_參數需要與PHPSESSID相匹配。但是并不知道兩者具體的關系。
且上述代碼中其實并不需要HTTPCookieProcessor而是直接寫在headers里即可。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38407.html
摘要:申明本系列文章借鑒了慕課網的課程,。慕課網是一個非常贊的學習網站。是下的一個模塊,在中,被拆分成和實現一個最簡單的下載器使用函數可以給服務器發送一個請求。該函數返回一個該返回的對象有三個額外的函數取得服務器返回的。默認沒有的,請求方式為。 申明:本系列文章借鑒了慕課網的課程,http://www.imooc.com/learn/563。慕課網是一個非常贊的學習網站。 urllib2是p...
摘要:設置和處理事實上,并不是所有發起的請求都能得到服務器的回應。例如網絡無鏈接連接不到服務器鏈接不存在請求的方法不對等情況都會造成拋出錯誤。上面說到的出錯就會拋出。用于處理相關的錯誤。 urllib2的timeout timeout參數用于設置超時。我們在爬取一些響應較慢的網站的時候,需要設置一個比較長的超時時間。 response = urllib2.urlopen(request, t...
摘要:發送請求方不希望被跟蹤。主要用來將偽裝成一個正常的瀏覽器。該字典就是說是網絡協議名稱,是代理的。另外一般會明確指定資源存放的位置。意思是將現在提交的數據存放于下第篇。請求刪除某一個資源。向服務器提交數據。 前一個教程我們涉及到了urllib2的一些高級應用。這一片文章我們來比較系統的介紹一下。 該篇教程參考了靜覓的博文:http://cuiqingcai.com/954.html。寫這...
摘要:一的處理出現產生的原因很多,比如網絡沒法連接,連接不到服務器,或者服務器不存在。二的使用,一般是某些網站為了辨別用戶身份,進行跟蹤,從而存儲在客戶端的數據。模塊的主要作用是提供可存儲的對象,以便于與模塊配合使用來訪問資源。 一、urlError的處理 出現urlError產生的原因很多,比如:網絡沒法連接,連接不到服務器,或者服務器不存在。在代碼中,我們需要用try-except的語句...
摘要:趁著春節,希望能寫一個小小的網絡爬蟲框架。網頁下載器接收,將頁面內容下來。可以定義一個表,定義兩個字段和緩存數據庫網頁下載器網頁下載器就是更具下載網頁內容等。常見的網頁下載器有是官方的基礎模塊。 趁著春節,希望能寫一個小小的網絡爬蟲框架。先定一個小目標,希望能比較優雅地將某個網站上的所有圖片爬下來。暫時先將這個爬蟲的名字叫做Squirrel,小松鼠吧。 什么是爬蟲 爬蟲其實是一種從互聯...
閱讀 1240·2021-11-22 13:54
閱讀 1425·2021-11-22 09:34
閱讀 2698·2021-11-22 09:34
閱讀 4009·2021-10-13 09:39
閱讀 3342·2019-08-26 11:52
閱讀 3361·2019-08-26 11:50
閱讀 1529·2019-08-26 10:56
閱讀 1913·2019-08-26 10:44