官方文檔: https://docs.python.org/2/library/urllib.htmlhtml
某博客對官方文檔較全的翻譯: http://h2byte.com/post/tech/relation-bewteen-usllib-and-urllib2?action=show_rawpython
提供用於獲取互聯網上數據的高級接口緩存
打開https URL時不會嘗試驗證服務器證書服務器
1.接口:網絡
1)urllib.
urlopen
(url[, data[, proxies[, context]]])函數
相似於內建函數open(),但接收的不是文件名而是URL;post
若沒法鏈接,將引起IOError異常;編碼
若完成鏈接將返回一個類文件對象,該對象支持如下操做:url
read() , readline() , readlines() , fileno() , close() : 這些函數與文件對象的同名函數有着相同的接口,使用方式與文件對象徹底同樣spa
info() : 返回一個包含與該URL相關聯的元信息的mimetools.Message對象,若是是HTTP,則表明從服務器接收到的html文件中的header信息,若是是FTP,則會返回一個內容長度header(?),若是是本地文件,則包含文件最後一次修改時間、文件大小、文件類型等信息
geturl() : 返回頁面的真實URL,一些服務器會將請求重定向到其餘的URL,urlopen()會自動處理重定向,geturl()函數能獲取到重定向後的URL
getcode() : 若URL是HTTP類型的則獲取響應中的HTTP狀態碼,不然返回None
代理.......不懂,待補充
2)urllib.
urlretrieve
(url[, filename[, reporthook[, data]]])
在必要時將該URL表示的網絡對象保存到本地文件,若url指向本地文件或有效緩存,則不進行保存
返回一個tuple (filename, headers),filename是保存的文件名,headers是urlopen().info()返回的信息
Exceptions與urlopen()的相同
若是沒有指定保存的路徑,則保存爲臨時文件
reporthook是一個回掉函數,接受三個參數(已接收數據塊數,數據塊大小(bytes),文件大小)
在FTP連接中當header不存在Content-Type鍵時第三個參數文件大小可能爲-1
3)urllib.
_urlopener ?
4) urllib.
urlcleanup
()
清除以前調用urllib.urlretrieve()所留下的緩存
2. 實用功能
1)urllib.
quote
(string[, safe])
用%xx替換string中的特殊字符,但字母、數字和一些字符('_.-')不會被替換
一般這個函數針對URL中的路徑部分進行替換
可選參數safe指定不用被替換的字符,默認值是'/'
2)urllib.
quote_plus
(string[, safe])
相似於urllib.quote(),但會用加號'+'替換空格,若加號不包括在safe參數中,string中的加號將會被轉義,產生相似HTML表單的數據
3)urllib.
unquote
(string)
urllib.quote()的反函數,將%xx轉換成相應的單字符
4)urllib.
unquote_plus
(string)
urllib.quote_plus()的反函數,相似於urllib.unquote(),但會把加號替換成空格
5)urllib.
urlencode
(query[, doseq])
將字典或包含兩個元素的元組序列轉換成"percent-encoded"(百分比編碼?)字符串,使其能被用於urlopen()的可選變量data,主要用於POST請求中傳遞表單
轉換後的字符串是一系列用'&'分隔開的key=value對,key 和 value 都是用quote_plus()轉換過的
6)urllib.
pathname2url
(path)
將本地路徑轉換爲url,過程當中使用了quote()
7)urllib.
url2pathname
(path)
將url轉換爲本地路徑,過程當中使用了unquote()
8)urllib.
getproxies
() ?
3. URL Opener 對象
1)class urllib.
URLopener
([proxies[, context[, **x509]]])
打開和讀取URLs的基類;
URLopener類默認狀況下發送urllib/VVV(VVV表明urllib的版本號)的User-Agent header,應用程序能夠經過URLopener和FancyURLopener的子類和設置類屬性version來定義User-Agent header
可選參數proxies應該是字典類型描述的proxy URLs, 空字典會將proxy關閉, 默認值爲None
context是一個ssl.SSLContext實例,定義opener打開https連接時的SSL
附加關鍵字參數用於創建https連接中傳送SSL key 和 certificate
當服務器返回錯誤碼時會引起IOError異常
open
(fullurl[, data])
用適當的協議打開fullurl
該方法設置緩存和代理信息後調用合適的open方法,若是方案未能識別,則調用open_unknown()
data參數的意義與urlopen()中的data參數意義相同
open_unknown
(fullurl[, data])
重寫接口,打開未知類型的URL
retrieve
(url[, filename[, reporthook[, data]]])
version
該變量爲opoener對象指定一個user agent,在子類中做爲類變量設置或者在構造函數中設置
2)class urllib.
FancyURLopener
(...)
FancyURLopener是URLopener的子類,定義了處理http狀態碼301, 302, 303, 307 和 401的方法
4. urllib的侷限
當前僅支持HTTP,FTP和本地文件
urlretrieve的caching特性被禁用了(until I find the time to hack proper processing of Expiration time headers.))
可能會反覆等待一個鏈接創建而引發長延時
對待ftp的文件和目錄,採用了不一樣的策略,可能會引發一些問題.做者建議使用ftplib模塊,或者繼承FancyOpener來改寫.
不支持須要認證的代理
URL的處理建議使用urlparser模塊