乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       imelee 2017-03-14

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


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

      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,服務器才能知道剛才是這個用戶登錄了網站,才會給予客戶端訪問一些頁面的權限。所以我們需要保存cookie,之后附帶cookie再來訪問網站,才能夠達到效果。這里就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請求網頁的時候附帶cookie。在構造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查詢字符串的產生,而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中酷虎的和服務器模塊結構散亂,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...

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

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

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

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

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

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

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

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





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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多