準備寫一些列的 python之web模塊學習,基本上涉及經常使用的的web模塊,包括 urllib、urllib二、httplib、urlparse、requests,如今,開始咱們的第一個模塊的學習吧。html
1 urllib簡介 python
python urllib 模塊提供了一個從指定的URL地址獲取網頁數據,而後對其進行分析處理,獲取咱們想要的數據。web
2 經常使用方法緩存
2.1 urlopen -- 建立一個類文件對象 爲讀取指定的URLbash
help(urllib.urlopen) urlopen(url, data=None, proxies=None) Create a file-like object for the specified URL to read from. 參數: url :表示遠程數據的路徑,通常是http或者ftp路徑。 data :表示以get或者post方式提交到url的數據。 proxies :表示用於代理的設置。
Python 經過urlopen函數來獲取html數據,urlopen返回一個類文件對象,它提供了以下經常使用方法:
服務器
1)read() , readline() , readlines(),fileno()和close():這些方法的使用與文件對象徹底同樣。
2)info():返回一個httplib.HTTPMessage 對象,表示遠程服務器返回的頭信息。
3)getcode():返回Http狀態碼,若是是http請求,200表示請求成功完成;404表示網址未找到。
4)geturl():返回請求的url地址。多線程
附代碼:ide
>>> import urllib >>> response = urllib.urlopen('http://www.51cto.com') >>>res.read() 。。。。。。(一堆網頁代碼) >>>res.readline() '<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n' 。。。。 >>>res.readlines() 。。。(list形式的一堆網頁代碼) >>>res.info() <httplib.HTTPMessage instance at0x1a02638> >>> response.getcode() # 返回Http狀態碼 200 >>> response.geturl() # 返回請求的url地址 'http://www.51cto.com' >>> response.close() # 最後別忘了關閉鏈接
urllib中還提供了一些輔助方法,用於對url進行編碼、解碼。url中是不能出現一些特殊的符號的,有些符號有特殊的用途。咱們知道以get方式提交數據的時候,會在url中添加key=value這樣的字符串,因此在value中是不容許有'=',所以要對其進行編碼;與此同時服務器接收到這些參數的時候,要進行解碼,還原成原始的數據。這個時候,這些輔助方法會頗有用:
函數
附帶的其餘方法:(主要是url編碼解碼)post
- 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': 'wklken', 'pwd':'123'}將被轉換爲"name=wklken&pwd=123" (經常使用) #這裏能夠與urlopen結合以實現post方法和get方法 - urllib.pathname2url(path):將本地路徑轉換成url路徑 - urllib.url2pathname(path):將url路徑轉換成本地路徑
附代碼:
>>> import urllib >>>res = urllib.quote('I am 51cto') >>> res 'I%20am%2051cto' >>>urllib.unquote(res) 'I am 51cto' >>>res = urllib.quote_plus('I am 51cto') >>> res 'I+am+51cto' >>>urllib.unquote_plus(res) 'I am 51cto' >>> params = {'name':'51cto','pwd':'51cto'} >>>urllib.urlencode(params) 'pwd=51cto&name=51cto' >>>l2u=urllib.pathname2url('E:\51cto') 'E%3A%29cto' >>>urllib.url2pathname(l2u) 'E:)cto'
2.2 urlretrieve -- 直接將遠程的數據下載到本地
help(urllib.urlretrieve) urlretrieve(url, filename=None,reporthook=None, data=None) 參數: url :指定下載的URL finename :指定了保存本地路徑(若是參數未指定,urllib會生成一個臨時文件保存數據。 reporthook :是一個回調函數,當鏈接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,咱們能夠利用這個回調函數來顯示當前的下載進度。 data: 表示post到服務器的數據,該方法返回一個包含兩個元素的(filename,headers)元組,
下面是一個 urlretrieve方法下載文件的實例,能夠顯示下載進度:
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib import os def schedule(a,b,c): ''' 回調函數 @a:已經下載的數據 @b:數據塊的大小 @c:遠程文件的大小 ''' per = 100.0 * a * b / c if per > 100: per = 100 print "%.2f%%" % per url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2' local = os.path.join('c:','Python-2.7.5.tar.bz2') urllib.urlretrieve(url,local,schedule)
2.3 urlcleanup -- 清除因爲urllib.urlretrieve()所產生的緩存
經過上面的練習能夠知道,urlopen能夠輕鬆獲取遠端html頁面信息,而後經過python正則對所須要的數據進行分析,匹配出想要用的數據,而後利用urlretrieve將數據下載到本地。對於訪問受限或者對鏈接數有限制的遠程url地址能夠採用proxies(代理的方式)鏈接,若是遠程數據量過大,單線程下載太慢的話能夠採用多線程下載,這個就是傳說中的爬蟲。
上面介紹的前兩個方法是urllib中最經常使用的方法,這些方法在獲取遠程數據的時候,內部會使用URLopener或者 FancyURLOpener類。做爲urllib的使用者,咱們不多會用到這兩個類。若是對urllib的實現感興趣,或者但願urllib支持更多的協議,能夠研究這兩個類。在Python手冊中,urllib的做者還列出了這個模塊的缺陷和不足,感興趣的能夠打開 Python手冊瞭解一下。