Python模組學習:urllib

發表於2015-05-22

urllib模組提供的上層介面,使我們可以像讀取本地檔案一樣讀取www和ftp上的資料。每當使用這個模組的時候,老是會想起公司產品的客戶端,同事用C++下載Web上的圖片,那種“痛苦”的表情。我以前翻譯過libcurl教程,這是在C/C++環境下比較方便實用的網路操作庫,相比起libcurl,Python的urllib模組的使用門檻則低多了。可能有些人又會用效率來批評Python,其實在操作網路,或者在叢集互動的時候, 語言的執行效率絕不是瓶頸。這種情況下,一個比較好的方法是,將python嵌入到C/C++中,讓Python來完成一些不是核心的邏輯處理。又扯遠了,廢話少說,開始urllib之旅吧~~ (前幾天我用這個模組寫了個蜘蛛,感興趣的同學可以在以前的部落格中找到程式碼)

先看一個例子,這個例子把Google首頁的html抓取下來並顯示在控制檯上:

urllib.urlopen(url[, data[, proxies]]) :

建立一個表示遠端url的類檔案物件,然後像本地檔案一樣操作這個類檔案物件來獲取遠端資料。引數url表示遠端資料的路徑,一般是網址;引數data表示以post方式提交到url的資料(玩過web的人應該知道提交資料的兩種方式:post與get。如果你不清楚,也不必太在意,一般情況下很少用到這個引數);引數proxies用於設定代理(這裡不詳細講怎麼使用代理,感興趣的看客可以去翻閱Python手冊urllib模組)。urlopen返回 一個類檔案物件,他提供瞭如下方法:

  •     read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與檔案物件完全一樣;
  •     info():返回一個httplib.HTTPMessage 物件,表示遠端伺服器返回的頭資訊;
  •     getcode():返回Http狀態碼。如果是http請求,200表示請求成功完成;404表示網址未找到;
  •     geturl():返回請求的url;

下面來擴充一下上面的例子,看官可以執行一下這個例子,加深對urllib的印象:

urllib.urlretrieve(url[, filename[, reporthook[, data]]]):

urlretrieve方法直接將遠端資料下載到本地。引數filename指定了儲存到本地的路徑(如果未指定該引數,urllib會生成一個臨時檔案來儲存資料);引數reporthook是一個回撥函式,當連線上伺服器、以及相應的資料塊傳輸完畢的時候會觸發該回撥。我們可以利用這個回撥函 數來顯示當前的下載進度,下面的例子會展示。引數data指post到伺服器的資料。該方法返回一個包含兩個元素的元組(filename, headers),filename表示儲存到本地的路徑,header表示伺服器的響應頭。下面通過例子來演示一下這個方法的使用,這個例子將新浪首頁的html抓取到本地,儲存在D:/sina.html檔案中,同時顯示下載的進度。

上面介紹的兩個方法是urllib中最常用的方法,這些方法在獲取遠端資料的時候,內部會使用URLopener或者 FancyURLOpener類。作為urllib的使用者,我們很少會用到這兩個類,這裡我不想多講。如果對urllib的實現感興趣, 或者希望urllib支援更多的協議,可以研究這兩個類。在Python手冊中,urllib的作者還列出了這個模組的缺陷和不足,感興趣的同學可以開啟 Python手冊瞭解一下。

urllib中還提供了一些輔助方法,用於對url進行編碼、解碼。url中是不能出現一些特殊的符號的,有些符號有特殊的用途。我們知道以get方式提交資料的時候,會在url中新增key=value這樣的字串,所以在value中是不允許有’=’,因此要對其進行編碼;與此同時伺服器接收到這些引數的時候,要進行解碼,還原成原始的資料。這個時候,這些輔助方法會很有用:

  • urllib.quote(string[, safe]):對字串進行編碼。引數safe指定了不需要編碼的字元;
  • urllib.unquote(string) :對字串進行解碼;
  • urllib.quote_plus(string [ , safe ] ) :與urllib.quote類似,但這個方法用’+’來替換’ ‘,而quote用’%20’來代替’ ‘
  • urllib.unquote_plus(string ) :對字串進行解碼;
  • urllib.urlencode(query[, doseq]):將dict或者包含兩個元素的元組列表轉換成url引數。例如 字典{‘name’: ‘dark-bull’, ‘age’: 200}將被轉換為”name=dark-bull&age=200″
  • urllib.pathname2url(path):將本地路徑轉換成url路徑;
  • urllib.url2pathname(path):將url路徑轉換成本地路徑;

用一個例子來體驗一下這些方法吧~~:

urllib模組的基本使用,就這麼簡單。oh~~yeah~~又一個模組寫完了,想想,我已經寫了將近30個模組了,有時間我要好好整理一下@@@@

相關文章