日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

詳解:Python2中的urllib、urllib2與Python3中的urllib以及第三方模塊requests

 imelee 2017-03-14

先說說Python2中的url與urllib2(參考此處):


在python2中,urlliburllib2都是接受URL請(qǐng)求的相關(guān)模塊,但是提供了不同的功能。兩個(gè)最顯著的不同如下:

1、urllib2可以接受一個(gè)Request類的實(shí)例來設(shè)置URL請(qǐng)求的headers,例如:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. req = urllib2.Request(  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1.         url=url,  
  2.         data=postdata,  
  3.         headers=headers  
  4. )  
  5. result = urllib2.urlopen(req)  


我們知道,HTTP是無連接的狀態(tài)協(xié)議,但是客戶端和服務(wù)器端需要保持一些相互信息,比如cookie,有了cookie,服務(wù)器才能知道剛才是這個(gè)用戶登錄了網(wǎng)站,才會(huì)給予客戶端訪問一些頁(yè)面的權(quán)限。所以我們需要保存cookie,之后附帶cookie再來訪問網(wǎng)站,才能夠達(dá)到效果。這里就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請(qǐng)求網(wǎng)頁(yè)的時(shí)候附帶cookie。在構(gòu)造req請(qǐng)求之前可以獲取一個(gè)保存cookies的對(duì)象,并把該對(duì)象和http處理器、http的handler資源以及urllib2的對(duì)象綁定在一起:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. cj = cookielib.LWPCookieJar()  
  2. cookie_support = urllib2.HTTPCookieProcessor(cj)  
  3. # 創(chuàng)建一個(gè)opener,將保存了cookie的http處理器,還有設(shè)置一個(gè)handler用于處理http的URL的打開  
  4. opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
  5. # 將包含了cookie、http處理器、http的handler的資源和urllib2對(duì)象板頂在一起  
  6. urllib2.install_opener(opener)  


2、urllib僅可以接受URL。這意味著,你不可以偽裝你的User Agent字符串等。

但是urllib提供urlencode方法用來GET查詢字符串的產(chǎn)生,而urllib2沒有。這是就是為何urllib常和urllib2一起使用的原因,如下:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. postdata = urllib.urlencode(postdata)  


(把字典形式的postdata編碼一下)
Tip: if you are planning to do HTTP stuff only, check out httplib2, it is much better than httplib or urllib or urllib2.


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

下面說說Python3x中的urllib包、http包以及其他比較好使的第三方包

1、Python3 urllib、http

Python3不像2x中酷虎的和服務(wù)器模塊結(jié)構(gòu)散亂,Python3中把這些打包成為了2個(gè)包,就是http與urllib,詳解如下:

http會(huì)處理所有客戶端--服務(wù)器http請(qǐng)求的具體細(xì)節(jié),其中:

(1)client會(huì)處理客戶端的部分

(2)server會(huì)協(xié)助你編寫Python web服務(wù)器程序

(3)cookies和cookiejar會(huì)處理cookie,cookie可以在請(qǐng)求中存儲(chǔ)數(shù)據(jù)

使用cookiejar示例可以在前幾篇博客中基于Python3的爬蟲中找到示例,如下:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. import http.cookiejar  
  2. import urllib.request  
  3. import urllib.parse</span></span>  
  4. def getOpener(head):  
  5.     # deal with the Cookies  
  6.     cj = http.cookiejar.CookieJar()  
  7.     pro = urllib.request.HTTPCookieProcessor(cj)  
  8.     opener = urllib.request.build_opener(pro)  
  9.     header = []  
  10.     for key, value in head.items():  
  11.         elem = (key, value)  
  12.         header.append(elem)  
  13.     opener.addheaders = header  
  14.     return opener  




urllib是基于http的高層庫(kù),它有以下三個(gè)主要功能:

(1)request處理客戶端的請(qǐng)求

(2)response處理服務(wù)端的響應(yīng)

(3)parse會(huì)解析url

下面是使用Python3中urllib來獲取資源的一些示例:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 1、最簡(jiǎn)單  
  2. import urllib.request  
  3. response = urllib.request.urlopen('http:///')  
  4. html = response.read()  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 2、使用 Request  
  2. import urllib.request  
  3. req = urllib.request.Request('http:///')  
  4. response = urllib.request.urlopen(req)  
  5. the_page = response.read()  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 3、發(fā)送數(shù)據(jù)  
  2. import urllib.parse  
  3. import urllib.request  
  4. url = '"  
  5. values = {  
  6. 'act' : 'login',  
  7. 'login[email]' : '',  
  8. 'login[password]' : ''  
  9. }  
  10. data = urllib.parse.urlencode(values)  
  11. req = urllib.request.Request(url, data)  
  12. req.add_header('Referer', 'http://www./')  
  13. response = urllib.request.urlopen(req)  
  14. the_page = response.read()  
  15. print(the_page.decode("utf8"))  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 4、發(fā)送數(shù)據(jù)和header  
  2. import urllib.parse  
  3. import urllib.request  
  4. url = ''  
  5. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
  6. values = {  
  7. 'act' : 'login',  
  8. 'login[email]' : '',  
  9. 'login[password]' : ''  
  10. }  
  11. headers = { 'User-Agent' : user_agent }  
  12. data = urllib.parse.urlencode(values)  
  13. req = urllib.request.Request(url, data, headers)  
  14. response = urllib.request.urlopen(req)  
  15. the_page = response.read()  
  16. print(the_page.decode("utf8"))  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 5、http 錯(cuò)誤  
  2. import urllib.request  
  3. req = urllib.request.Request(' ')  
  4. try:  
  5. urllib.request.urlopen(req)  
  6. except urllib.error.HTTPError as e:  
  7. print(e.code)  
  8. print(e.read().decode("utf8"))  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 6、異常處理1  
  2. from urllib.request import Request, urlopen  
  3. from urllib.error import URLError, HTTPError  
  4. req = Request("http://www..net /")  
  5. try:  
  6. response = urlopen(req)  
  7. except HTTPError as e:  
  8. print('The server couldn't fulfill the request.')  
  9. print('Error code: ', e.code)  
  10. except URLError as e:  
  11. print('We failed to reach a server.')  
  12. print('Reason: ', e.reason)  
  13. else:  
  14. print("good!")  
  15. print(response.read().decode("utf8"))  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 7、異常處理2  
  2. from urllib.request import Request, urlopen  
  3. from urllib.error import  URLError  
  4. req = Request("http://www.Python.org/")  
  5. try:  
  6. response = urlopen(req)  
  7. except URLError as e:  
  8. if hasattr(e, 'reason'):  
  9. print('We failed to reach a server.')  
  10. print('Reason: ', e.reason)  
  11. elif hasattr(e, 'code'):  
  12. print('The server couldn't fulfill the request.')  
  13. print('Error code: ', e.code)  
  14. else:  
  15. print("good!")  
  16. print(response.read().decode("utf8"))  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1.   
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 8、HTTP 認(rèn)證  
  2. import urllib.request  
  3. # create a password manager  
  4. password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()  
  5. # Add the username and password.  
  6. # If we knew the realm, we could use it instead of None.  
  7. top_level_url = ""  
  8. password_mgr.add_password(None, top_level_url, 'rekfan', 'xxxxxx')  
  9. handler = urllib.request.HTTPBasicAuthHandler(password_mgr)  
  10. # create "opener" (OpenerDirector instance)  
  11. opener = urllib.request.build_opener(handler)  
  12. # use the opener to fetch a URL  
  13. a_url = ""  
  14. x = opener.open(a_url)  
  15. print(x.read())  
  16. # Install the opener.  
  17. # Now all calls to urllib.request.urlopen use our opener.  
  18. urllib.request.install_opener(opener)  
  19. a = urllib.request.urlopen(a_url).read().decode('utf8')  
  20. print(a)  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1.   
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 9、使用代理  
  2. import urllib.request  
  3. proxy_support = urllib.request.ProxyHandler({'sock5': 'localhost:1080'})  
  4. opener = urllib.request.build_opener(proxy_support)  
  5. urllib.request.install_opener(opener)  
  6. a = urllib.request.urlopen("").read().decode("utf8")  
  7. print(a)  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 10、超時(shí)  
  2. import socket  
  3. import urllib.request  
  4. # timeout in seconds  
  5. timeout = 2  
  6. socket.setdefaulttimeout(timeout)  
  7. # this call to urllib.request.urlopen now uses the default timeout  
  8. # we have set in the socket module  
  9. req = urllib.request.Request('')  
  10. a = urllib.request.urlopen(req).read()  
  11. print(a)  

上面例子大概把常用的一些情況都羅列出來了,其中對(duì)異常的處理要嚴(yán)格按照:

try...exceptA...exceptB...except...else...finally...

的語(yǔ)法格式來寫,詳情請(qǐng)參考我的另一篇相關(guān)博文

》》》》》》》》》》》》》》》》》》》》》》》》

2、除了使用官方標(biāo)準(zhǔn)庫(kù)的urllib,我們可以使用更好用的第三方模塊,如requests

Requests 完全滿足如今網(wǎng)絡(luò)的需求,其功能有以下:

  • 國(guó)際化域名和 URLs
  • Keep-Alive & 連接池
  • 持久的 Cookie 會(huì)話
  • 類瀏覽器式的 SSL 加密認(rèn)證
  • 基本/摘要式的身份認(rèn)證
  • 優(yōu)雅的鍵/值 Cookies
  • 自動(dòng)解壓
  • Unicode 編碼的響應(yīng)體
  • 多段文件上傳
  • 連接超時(shí)
  • 支持 .netrc
  • 適用于 Python 2.6—3.4
  • 線程安全

請(qǐng)參考中文官方文檔,寫的非常詳細(xì):傳送門     

其中快速上手頁(yè)面寫的非常棒,我就不贅述了,請(qǐng)看:傳送門

正如介紹所說:Requests 是使用 Apache2 Licensed 許可證的 HTTP 庫(kù)。用 Python 編寫,真正的為人類著想。





    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多