Python中的urllib模塊使用詳解
urllib模塊提供的上層接口,使我們可以像讀取本地文件一樣讀取www和ftp上的數(shù)據(jù)。每當(dāng)使用這個(gè)模塊的時(shí)候,老是會(huì)想起公司產(chǎn)品的客戶端,同事用C++下載Web上的圖片,那種“痛苦”的表情。我以前翻譯過libcurl教程,這是在C/C++環(huán)境下比較方便實(shí)用的網(wǎng)絡(luò)操作庫,相比起libcurl,Python的urllib模塊的使用門檻則低多了??赡苡行┤擞謺?huì)用效率來批評(píng)Python,其實(shí)在操作網(wǎng)絡(luò),或者在集群交互的時(shí)候, 語言的執(zhí)行效率絕不是瓶頸。這種情況下,一個(gè)比較好的方法是,將python嵌入到C/C++中,讓Python來完成一些不是核心的邏輯處理。又扯遠(yuǎn)了,廢話少說,開始urllib之旅吧~~ (前幾天我用這個(gè)模塊寫了個(gè)蜘蛛,感興趣的同學(xué)可以在以前的博客中找到代碼)
先看一個(gè)例子,這個(gè)例子把Google首頁的html抓取下來并顯示在控制臺(tái)上:
# 別驚訝,整個(gè)程序確實(shí)只用了兩行代碼 import urllib print urllib.urlopen('http://www.google.com').read() urllib.urlopen(url[, data[, proxies]]) :
創(chuàng)建一個(gè)表示遠(yuǎn)程url的類文件對(duì)象,然后像本地文件一樣操作這個(gè)類文件對(duì)象來獲取遠(yuǎn)程數(shù)據(jù)。參數(shù)url表示遠(yuǎn)程數(shù)據(jù)的路徑,一般是網(wǎng)址;參數(shù)data表示以post方式提交到url的數(shù)據(jù)(玩過web的人應(yīng)該知道提交數(shù)據(jù)的兩種方式:post與get。如果你不清楚,也不必太在意,一般情況下很少用到這個(gè)參數(shù));參數(shù)proxies用于設(shè)置代理(這里不詳細(xì)講怎么使用代理,感興趣的看客可以去翻閱Python手冊(cè)u(píng)rllib模塊)。urlopen返回 一個(gè)類文件對(duì)象,他提供了如下方法:
- read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對(duì)象完全一樣;
- info():返回一個(gè)httplib.HTTPMessage 對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息;
- getcode():返回Http狀態(tài)碼。如果是http請(qǐng)求,200表示請(qǐng)求成功完成;404表示網(wǎng)址未找到;
- geturl():返回請(qǐng)求的url;
下面來擴(kuò)充一下上面的例子,看官可以運(yùn)行一下這個(gè)例子,加深對(duì)urllib的印象:
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方法直接將遠(yuǎn)程數(shù)據(jù)下載到本地。參數(shù)filename指定了保存到本地的路徑(如果未指定該參數(shù),urllib會(huì)生成一個(gè)臨時(shí)文件來保存數(shù)據(jù));參數(shù)reporthook是一個(gè)回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢的時(shí)候會(huì)觸發(fā)該回調(diào)。我們可以利用這個(gè)回調(diào)函 數(shù)來顯示當(dāng)前的下載進(jìn)度,下面的例子會(huì)展示。參數(shù)data指post到服務(wù)器的數(shù)據(jù)。該方法返回一個(gè)包含兩個(gè)元素的元組(filename, headers),filename表示保存到本地的路徑,header表示服務(wù)器的響應(yīng)頭。下面通過例子來演示一下這個(gè)方法的使用,這個(gè)例子將新浪首頁的html抓取到本地,保存在D:/sina.html文件中,同時(shí)顯示下載的進(jìn)度。
def cbk(a, b, c): '''回調(diào)函數(shù) @a: 已經(jīng)下載的數(shù)據(jù)塊 @b: 數(shù)據(jù)塊的大小 @c: 遠(yuǎn)程文件的大小 ''' per = 100.0 * a * b / c if per > 100: per = 100 print '%.2f%%' % per url = 'http://www.sina.com.cn' local = 'd://sina.html' urllib.urlretrieve(url, local, cbk)
上面介紹的兩個(gè)方法是urllib中最常用的方法,這些方法在獲取遠(yuǎn)程數(shù)據(jù)的時(shí)候,內(nèi)部會(huì)使用URLopener或者 FancyURLOpener類。作為urllib的使用者,我們很少會(huì)用到這兩個(gè)類,這里我不想多講。如果對(duì)urllib的實(shí)現(xiàn)感興趣, 或者希望urllib支持更多的協(xié)議,可以研究這兩個(gè)類。在Python手冊(cè)中,urllib的作者還列出了這個(gè)模塊的缺陷和不足,感興趣的同學(xué)可以打開 Python手冊(cè)了解一下。
urllib中還提供了一些輔助方法,用于對(duì)url進(jìn)行編碼、解碼。url中是不能出現(xiàn)一些特殊的符號(hào)的,有些符號(hào)有特殊的用途。我們知道以get方式提交數(shù)據(jù)的時(shí)候,會(huì)在url中添加key=value這樣的字符串,所以在value中是不允許有'=',因此要對(duì)其進(jìn)行編碼;與此同時(shí)服務(wù)器接收到這些參數(shù)的時(shí)候,要進(jìn)行解碼,還原成原始的數(shù)據(jù)。這個(gè)時(shí)候,這些輔助方法會(huì)很有用:
- urllib.quote(string[, safe]):對(duì)字符串進(jìn)行編碼。參數(shù)safe指定了不需要編碼的字符;
- urllib.unquote(string) :對(duì)字符串進(jìn)行解碼;
- urllib.quote_plus(string [ , safe ] ) :與urllib.quote類似,但這個(gè)方法用'+'來替換' ‘,而quote用'%20′來代替' ‘
- urllib.unquote_plus(string ) :對(duì)字符串進(jìn)行解碼;
- urllib.urlencode(query[, doseq]):將dict或者包含兩個(gè)元素的元組列表轉(zhuǎn)換成url參數(shù)。例如 字典{‘name': ‘dark-bull', ‘a(chǎn)ge': 200}將被轉(zhuǎn)換為”name=dark-bull&age=200″
- urllib.pathname2url(path):將本地路徑轉(zhuǎn)換成url路徑;
urllib.url2pathname(path):將url路徑轉(zhuǎn)換成本地路徑;
用一個(gè)例子來體驗(yàn)一下這些方法吧~~:
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
urllib模塊的基本使用,就這么簡(jiǎn)單。oh~~yeah~~又一個(gè)模塊寫完了,想想,我已經(jīng)寫了將近30個(gè)模塊了,有時(shí)間我要好好整理一下@@@@
相關(guān)文章
基于OpenCV實(shí)現(xiàn)小型的圖像數(shù)據(jù)庫檢索功能
下面就使用VLAD表示圖像,實(shí)現(xiàn)一個(gè)小型的圖像數(shù)據(jù)庫的檢索程序。下面實(shí)現(xiàn)需要的功能模塊,分步驟給大家介紹的非常詳細(xì),對(duì)OpenCV圖像數(shù)據(jù)庫檢索功能感興趣的朋友跟隨小編一起看看吧2021-12-12python 利用百度API進(jìn)行淘寶評(píng)論關(guān)鍵詞提取
這篇文章主要介紹了python 利用百度API進(jìn)行淘寶評(píng)論關(guān)鍵詞提取,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03python+numpy實(shí)現(xiàn)的基本矩陣操作示例
這篇文章主要介紹了python+numpy實(shí)現(xiàn)的基本矩陣操作,結(jié)合實(shí)例形式分析了Python使用numpy模塊針對(duì)矩陣進(jìn)行創(chuàng)建、增刪查改、索引、運(yùn)算相關(guān)操作實(shí)現(xiàn)技巧,注釋中包含有詳細(xì)的說明,需要的朋友可以參考下2019-07-07基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本(測(cè)試用例)
這篇文章主要介紹了基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07解決Python中字符串和數(shù)字拼接報(bào)錯(cuò)的方法
相信很多的新手朋友都會(huì)碰到python連接字符串和數(shù)字的問題,因?yàn)閜ython是強(qiáng)類型的語言,如果你把一個(gè)字符串和數(shù)字直接做連接的操作的話,就會(huì)直接報(bào)錯(cuò)的,今天就給大家說下字符串和數(shù)字拼接的問題,有需要的朋友們可以參考借鑒。2016-10-10Python數(shù)據(jù)結(jié)構(gòu)之鏈表詳解
在順序存儲(chǔ)方式中,根據(jù)數(shù)據(jù)元素的序號(hào)就可隨機(jī)存取表中任何一個(gè)元素,但同時(shí)在插入和刪除運(yùn)算需要移動(dòng)大量的元素,造成算法效率較低。解決此缺陷的一個(gè)辦法是:對(duì)線性表采用鏈?zhǔn)酱鎯?chǔ)方式。本文將介紹鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn)以及各種基本操作的實(shí)現(xiàn)。需要的可以參考一下2022-01-01用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例
大家好,本篇文章主要講的是用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02遠(yuǎn)程部署工具Fabric詳解(支持Python3)
這篇文章主要介紹了遠(yuǎn)程部署神器 Fabric,支持Python3 ,Fabric 出場(chǎng)了。Fabric 是一個(gè)遠(yuǎn)程部署神器,它可以在本地執(zhí)行遠(yuǎn)程服務(wù)器的命令。,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)地圖可視化folium完整過程
Folium是一個(gè)基于leaflet.js的Python地圖庫,其中,Leaflet是一個(gè)非常輕的前端地圖可視化庫,本文重點(diǎn)給大家介紹Python實(shí)現(xiàn)地圖可視化folium完整過程,感興趣的朋友跟隨小編一起看看吧2021-05-05