python urllib模組詳解及執行個體

來源:互聯網
上載者:User
python urllib模組詳解及執行個體先看一個例子,這個例子把Google首頁的html抓取下來並顯示在控制台上: 
  1. import urllib  
  2. print urllib.urlopen('http://www.google.com').read()  
# 別驚訝,整個程式確實只用了兩行代碼import urllibprint urllib.urlopen('http://www.google.com').read()
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的印象:

  1. google = urllib.urlopen('http://www.google.com')  
  2. print 'http header:\n', google.info()  
  3. print 'http status:', google.getcode()  
  4. print 'url:', google.geturl()  
  5. for line in google: # 就像在操作本地檔案  
  6.     print line,  
  7. google.close()  
google = urllib.urlopen('http://www.google.com')print 'http header:\n', google.info()print 'http status:', google.getcode()print 'url:', google.geturl()for line in google: # 就像在操作本地檔案    print line,google.close()
urllib.urlretrieve(url[, filename[, reporthook[, data]]]):

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

  1. def cbk(a, b, c):  
  2.     '''''回呼函數 
  3.     @a: 已經下載的資料區塊 
  4.     @b: 資料區塊的大小 
  5.     @c: 遠程檔案的大小 
  6.     '''  
  7.     per = 100.0 * a * b / c  
  8.     if per > 100:  
  9.         per = 100  
  10.     print '%.2f%%' % per  
  11.   
  12. url = 'http://www.sina.com.cn'  
  13. local = 'd:\\sina.html'  
  14. urllib.urlretrieve(url, local, cbk)  
def cbk(a, b, c):    '''回呼函數    @a: 已經下載的資料區塊    @b: 資料區塊的大小    @c: 遠程檔案的大小    '''    per = 100.0 * a * b / c    if per > 100:        per = 100    print '%.2f%%' % perurl = 'http://www.sina.com.cn'local = 'd:\\sina.html'urllib.urlretrieve(url, local, cbk)

    上面介紹的兩個方法是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用' '來代替' '
  • urllib.unquote_plus(string ) :對字串進行解碼;
  • urllib.urlencode(query[, doseq]):將dict或者包含兩個元素的元組列錶轉換成url參數。例如 字典{'name': 'dark-bull', 'age': 200}將被轉換為"name=dark-bull&age=200"
  • urllib.pathname2url(path):將本地路徑轉換成url路徑;
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.