2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

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

 imelee 2017-03-14

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


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

1、urllib2可以接受一個Request類的實例來設置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é)議,但是客戶端和服務器端需要保持一些相互信息,比如cookie,有了cookie,服務器才能知道剛才是這個用戶登錄了網(wǎng)站,才會給予客戶端訪問一些頁面的權(quán)限。所以我們需要保存cookie,之后附帶cookie再來訪問網(wǎng)站,才能夠達到效果。這里就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請求網(wǎng)頁的時候附帶cookie。在構(gòu)造req請求之前可以獲取一個保存cookies的對象,并把該對象和http處理器、http的handler資源以及urllib2的對象綁定在一起:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. cj = cookielib.LWPCookieJar()  
  2. cookie_support = urllib2.HTTPCookieProcessor(cj)  
  3. # 創(chuàng)建一個opener,將保存了cookie的http處理器,還有設置一個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中酷虎的和服務器模塊結(jié)構(gòu)散亂,Python3中把這些打包成為了2個包,就是http與urllib,詳解如下:

http會處理所有客戶端--服務器http請求的具體細節(jié),其中:

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

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

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

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

(2)response處理服務端的響應

(3)parse會解析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 錯誤  
  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 認證  
  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、超時  
  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)  

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

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

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

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

2、除了使用官方標準庫的urllib,我們可以使用更好用的第三方模塊,如requests

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

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

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

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

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





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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多