urllib模塊

urllib模塊提供的上層接口,使我們可以像讀取本地文件一樣讀取www和ftp上的數據。先看一個例子,這個例子把Google首頁的html抓取下來並顯示在控制檯上:

 

# 別驚訝,整個程序確實只用了兩行代碼
import urllib
print urllib.urlopen('http://www.google.com').read()

 

 

urllib方法:
urllib.urlopen(url[, data[, proxies]]):
創建一個表示遠程url的類文件對象,然後像本地文件一樣操作這個類文件對象來獲取遠程數據。參數url表示遠程數據的路徑,一般是網址;參數data表示以post方式提交到url的數據(玩過web的人應該知道提交數據的兩種方式:post與get);參數proxies用於設置代理.urlopen返回一個類文件對象,他提供瞭如下方法:

 

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

 

下面來擴充一下上面的例子:

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文件中,同時顯示下載的進度。
代碼例子:

 

 #!/usr/bin/python
#-*- coding:utf-8 -*-
import urllib
def cbk(a, b, c):
    '''回調函數
    @a: 已經下載的數據塊
    @b: 數據塊的大小
    @c: 遠程文件的大小
    '''
    per = 100.0 * a * b / c
    if per > 100:
        per = 100
    print '%.2f%%' % per,

url = 'http://www.sina.com.cn/'
local = '/root/python/sina.html'
urllib.urlretrieve(url, local, cbk)

 

上面介紹的兩個方法是urllib中最常用的方法,這些方法在獲取遠程數據的時候,內部會使用URLopener或者 FancyURLOpener類。作爲urllib的使用者,我們很少會用到這兩個類,這裏我不想多講.如果對urllib的實現感興趣,或者希望urllib支持更多的協議,可以研究這兩個類.

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路徑轉換成本地路徑;
代碼例子:
data = 'name = ~a+3'  
  
data1 = urllib.quote(data)   
print data1 # result: name%20%3D%20%7Ea%2B3   
print urllib.unquote(data1) # result: name = ~a+3   
  
data2 = urllib.quote_plus(data)   
print data2 # result: name+%3D+%7Ea%2B3   
print urllib.unquote_plus(data2)    # result: name = ~a+3   
  
data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 })   
print data3 # result: age=200&name=dark-bull   
  
data4 = urllib.pathname2url(r'd:/a/b/c/23.php')   
print data4 # result: ///D|/a/b/c/23.php   
print urllib.url2pathname(data4)    # result: D:/a/b/c/23.php 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章