Python中urllib與urllib2模塊的變化與使用詳解
什么是urllib
urllib是python提供的一個(gè)用于操作URL的模塊,在python2.x中有URllib庫,也有Urllib2庫,在python3.x中Urllib2合并到了Urllib中,我們爬取網(wǎng)頁的時(shí)候需要經(jīng)常使用到這個(gè)庫。
升級(jí)合并之后,模塊中包的位置變化的地方比較多。在此,我們總結(jié)并為大家列舉一些常見的位置變動(dòng),方便之前用python2.x的朋友在使用python3.x的時(shí)候可以快速的掌握,其他的在用到的時(shí)候再具體為大家講解。
常見的變化有:
- python2.x中使用import urllib2——————對(duì)應(yīng)的,在python3.x中會(huì)使用import urllib.request,urllib.error。
- 在python2.x中使用import urllib——————對(duì)應(yīng)的,在python3.x中會(huì)使用import urlli.request,urllib.error
- 在python2.x中使用import urlparse—————對(duì)應(yīng)的,在python3.x中會(huì)使用import urllib.parse
- 在python2.x中使用import urllib2——————對(duì)應(yīng)的,在python3.x中會(huì)使用import urllib.request,urllib.error
- 在python2.x中使用urllib2.urlopen——————對(duì)應(yīng)的,在python3.x中會(huì)使用import urllib.request.urlopen
- 在python2.x中使用urllib.quote——————對(duì)應(yīng)的,在python3.x中會(huì)使用import urllib.request.quote
- 在python2.x中使用cookielib.CoolieJar——————對(duì)應(yīng)的,在python3.x中會(huì)使用Http.CookieJar
- 在python2.x中使用urllib2.Request————對(duì)應(yīng)的,在python3.x中會(huì)使用urllib.request.Request。
以上是對(duì)urllib相關(guān)模塊中從python2.x到python3.x的常見的一些變動(dòng),如果之前使用的是python2.x版本或者在網(wǎng)上閱讀關(guān)于python2.x的代碼,可以根據(jù)以上對(duì)應(yīng)關(guān)系寫出python3.x程序
urllib與urllib2函數(shù)庫使用說明
(1)def urlopen(url,data=None,proxies=None)
參數(shù)說明:
- url:需要打開的網(wǎng)址(必須符合URL規(guī)范)
- data:向指定的URL發(fā)送的數(shù)據(jù)字符串,Get或者POST都可以,但是必須符合標(biāo)準(zhǔn)格式,格式為:
- key1=value1&key2=value2.................
- proxies:代理服務(wù)器地址字典,如果未指定,在window平臺(tái)上則根據(jù)IE的設(shè)置不支持需要驗(yàn)證的代理服務(wù)器。
返回值說明: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表示資源不存在或未找到。
代碼實(shí)例:
#encoding:utf-8 import urllib baidu=urllib.urlopen('http://www.baidu.com') print "http header:\n",baidu.info() print 'http status:\n',baidu.getcode() print 'url:\n',baidu.geturl() for i in baidu: print(i) baidu.close()
運(yùn)行結(jié)果:
(2)def urlretrieve(url, filename=None, reporthook=None, data=None)
參數(shù)說明:
- url:符合URL規(guī)范的字符串
- filename:本地文件路徑的字符串,從URL返回的數(shù)據(jù)將保存在該文件中,如果設(shè)置為None則生成一個(gè)臨時(shí)文件。
- reporthook:一個(gè)函數(shù)引用,當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)庫傳輸完畢的時(shí)候會(huì)觸發(fā)該函數(shù),我們可以利用這個(gè)函數(shù)來顯示當(dāng)前的下載進(jìn)度等等。
我們可以任意定義該函數(shù)的行為,只需要保證函數(shù)有三個(gè)參數(shù):
- 第一個(gè)參數(shù):為目前為止傳遞的數(shù)據(jù)塊數(shù)量
- 第二個(gè)參數(shù):為每個(gè)數(shù)據(jù)塊的大小,單位為byte
- 第三個(gè)參數(shù):為文件總的大?。承r(shí)候可能為-1)
data:向指定的URL發(fā)送的數(shù)據(jù)字符串,Get和Post都可以,但是必須符合標(biāo)準(zhǔn)格式:
key1=value1&key2=value2..........
函數(shù)返回值:返回一個(gè)元組(filename,headers),filename為參數(shù)總的filename,header為從服務(wù)器傳回來的MIME的類型。
實(shí)例:
#encoding:utf-8 import urllib def do(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.baidu.com' local="I:\python\StoreData\hello.html" urllib.urlretrieve(url,local,do)
運(yùn)行結(jié)果顯示:
(3)其他函數(shù)
- 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', 'age': 200}將被轉(zhuǎn)換為"name=dark-bull&age=200"
- urllib.pathname2url(path):將本地路徑轉(zhuǎn)換成url路徑;
- urllib.url2pathname(path):將url路徑轉(zhuǎn)換成本地路徑;
import urllib 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
運(yùn)行結(jié)果:
urllib、urllib2代碼實(shí)戰(zhàn)測(cè)試
(1)簡(jiǎn)單讀取網(wǎng)頁信息
#coding:utf-8 import urllib response=urllib.urlopen('http://www.baidu.com') print response.read()
運(yùn)行結(jié)果:
到此這篇關(guān)于Python中urllib與urllib2模塊的變化與使用詳解的文章就介紹到這了,更多相關(guān)Python的urllib與urllib2模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Mac時(shí)psycopg2導(dǎo)入PyCharm失敗的解決
這篇文章主要介紹了使用Mac時(shí)psycopg2導(dǎo)入PyCharm失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器)
在?Python?中,字典(dict)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),這篇文章給大家介紹Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器),感興趣的朋友一起看看吧2025-04-04Python標(biāo)準(zhǔn)庫使用OrderedDict類的實(shí)例講解
今天小編就為大家分享一篇關(guān)于Python標(biāo)準(zhǔn)庫使用OrderedDict類的實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02python上下文管理器協(xié)議的實(shí)現(xiàn)
這篇文章主要介紹了python上下文管理器協(xié)議的實(shí)現(xiàn),在python中所有實(shí)現(xiàn)了上下文管理器協(xié)議的對(duì)象 都可以用使用with操作,with啟動(dòng)了對(duì)象的上下文管理器2022-06-06使用python實(shí)現(xiàn)多維數(shù)據(jù)降維操作
今天小編就為大家分享一篇使用python實(shí)現(xiàn)多維數(shù)據(jù)降維操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python中海象運(yùn)算符:=的實(shí)現(xiàn)
海象運(yùn)算符(:=)是Python3.8引入的新特性,用于在表達(dá)式中同時(shí)完成賦值和返回值操作,本文就來介紹一下Python中海象運(yùn)算符:=的實(shí)現(xiàn),感興趣的可以了解一下2025-02-02如何使用 Python 中的功能和庫創(chuàng)建 n-gram
在計(jì)算語言學(xué)中,n-gram 對(duì)于語言處理、上下文和語義分析非常重要,它們是從令牌字符串中相鄰的連續(xù)單詞序列,本文將討論如何使用 Python 中的功能和庫創(chuàng)建 n-gram,感興趣的朋友一起看看吧2023-09-09