一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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

 imelee 2017-03-14

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


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

1、urllib2可以接受一個(gè)Request類的實(shí)例來設(shè)置URL請求的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ì)給予客戶端訪問一些頁面的權(quán)限。所以我們需要保存cookie,之后附帶cookie再來訪問網(wǎng)站,才能夠達(dá)到效果。這里就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請求網(wǎng)頁的時(shí)候附帶cookie。在構(gòu)造req請求之前可以獲取一個(gè)保存cookies的對象,并把該對象和http處理器、http的handler資源以及urllib2的對象綁定在一起:

[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對象板頂在一起  
  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請求的具體細(xì)節(jié),其中:

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

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

(3)cookies和cookiejar會(huì)處理cookie,cookie可以在請求中存儲(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的高層庫,它有以下三個(gè)主要功能:

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

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

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

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

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. 1、最簡單  
  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)  

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

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

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

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

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

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

  • 國際化域名和 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
  • 線程安全

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

其中快速上手頁面寫的非常棒,我就不贅述了,請看:傳送門

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





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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    正在播放国产又粗又长| 国产精品香蕉一级免费| 国产欧美一区二区久久| 亚洲av日韩av高潮无打码| 夫妻性生活黄色录像视频| 中文字幕亚洲精品人妻| 五月天六月激情联盟网| 欧美日韩国产二三四区| 国产免费一区二区三区不卡| 扒开腿狂躁女人爽出白浆av| 手机在线不卡国产视频| 中日韩美女黄色一级片 | 精品视频一区二区不卡| 99热在线精品视频观看| 一区二区三区精品人妻| 97人妻精品一区二区三区免| 欧美日韩国产一级91| 五月天综合网五月天综合网| 亚洲五月婷婷中文字幕| 国产精品欧美一区二区三区不卡 | 亚洲一区二区亚洲日本| 亚洲熟女乱色一区二区三区| 亚洲精品伦理熟女国产一区二区| 91亚洲精品综合久久| 国产内射一级一片内射高清视频 | 真实偷拍一区二区免费视频| 99国产一区在线播放| 在线观看视频成人午夜| 五月激情五月天综合网| 亚洲欧美日韩精品永久| 五月天丁香婷婷一区二区| 尤物天堂av一区二区| 老鸭窝精彩从这里蔓延| 亚洲一区二区三区在线中文字幕| 欧美熟妇一区二区在线| 中文字幕欧美视频二区| 视频在线免费观看你懂的| 日本午夜免费啪视频在线| 久久婷婷综合色拍亚洲| 日韩一级一片内射视频4k| 五月婷婷六月丁香在线观看 |