1. 程式人生 > >補充python的urllib和urllib2

補充python的urllib和urllib2

此文由我(54snapple)翻譯自http://www.voidspace.org.uk/python/articles/urllib2.shtml。原文標題:urllib2 - The Missing Manual -副標題:HOWTO Fetch Internet Resources with Python。英文版權歸文章原作者所有。轉載請保留以上資訊。

行文倉促,未作校正,請諒解指正。

-----------------------------------------------------------我是分割線-----------------------------------------------------

容錯: 如果你準備處理HTTP錯誤和URL錯誤這裡有兩種基本的方法,我更傾向於後一種: 1 from urllib2 import Request, urlopen, URLError, HTTPError req = Request(someurl) try:     response = urlopen(req) except HTTPError, e:     print 'The server couldn\'t fulfill the request.'     print 'Error code: ', e.code except URLError, e:     print 'We failed to reach a server.'     print 'Reason: ', e.reason else:     # everything is fine

注意HTTP錯誤異常必須在前面,否則URL錯誤也會捕獲一個HTTP錯誤。 2 from urllib2 import Request, urlopen, URLError req = Request(someurl) try:     response = urlopen(req) except URLError, e:     if hasattr(e, 'reason'):         print 'We failed to reach a server.'         print 'Reason: ', e.reason     elif hasattr(e, 'code'):         print 'The server couldn\'t fulfill the request.'         print 'Error code: ', e.code else:     # everything is fine
注意: URL錯誤是IO錯誤異常的一個子類。這意味著你能避免引入(import)URL錯誤而使用: from urllib2 import Request, urlopen req = Request(someurl) try:     response = urlopen(req) except IOError, e:     if hasattr(e, 'reason'):         print 'We failed to reach a server.'         print 'Reason: ', e.reason     elif hasattr(e, 'code'):         print 'The server couldn\'t fulfill the request.'         print 'Error code: ', e.code else:     # everything is fine 極少數環境下,urllib2能夠丟擲socket.error. INFO and GETURL urlopen返回的response(或者HTTP錯誤例項)有兩個有用的方法:info和geturl。 geturl--它返回被獲取網頁的真正的url。這是很有用的,因為urlopen(或使用的opener物件)也許會伴隨一個重定向。獲取的網頁url也許和要求的網頁url不一樣。 info--它返回一個像字典的物件來描述獲取的網頁,尤其是伺服器傳送的頭。它現在一般是httplib.HTTPMessage的一個例項。典型的頭包含'Content-length', 'Content-type', 等等。看一下Quick Reference to HTTP Headers中,HTTP頭列表,還有關於他們簡單的解釋和使用方法。 Openers 和Handlers 當你獲取一個URL時,你使用一個opener(一個可能以一個比較迷糊名字命名的例項--urllib2.OpenerDirector)。正常情況下我們一直使用預設的opener,通過urlopen,但你也可以建立自定義的openers。opener使用操作器(handlers)。所有的重活都交給這些handlers來做。每一個handler知道怎麼開啟url以一種獨特的url協議(http,ftp等等),或者怎麼處理開啟url的某些方面,如,HTTP重定向,或者HTTP cookie。 你將會建立openers如果你想要用安裝特別的handlers獲取url,例如,獲取一個處理cookie的opener,或者一個不處理重定向的opener。 列舉一個OpenerDirector,然後多次呼叫.add_handler(some_handler_instance)來建立一個opener。或者,你可以用build_opener,這是一個很方便的建立opener物件的函式,它只有一個函式呼叫。build_opener預設會加入許多 handlers,但是提供了一個快速的方法新增更多東西和/或使預設的handler失效。其他你想要的handlers能夠處理代理,authentication和其他平常但是又有些特殊的情況。 install_opener能被用於建立一個opener物件,(全域性)預設的opener。這意味著呼叫urlopen將會用到你剛安裝的opener。 opener物件有一個open方法,它可以被直接呼叫來獲取url以一種和urlopen函式同樣的方式:沒有必要呼叫install_opener,除非是為了方便。 Basic Authentication:(基本驗證) 為了解釋建立和安裝一個handler,我們將會使用 HTTPBasicAuthHandler。更多關於這個東西的內容和詳細討論---包括一個 Basic Authentication如何工作的解說--參見 Basic Authentication Tutorial. 當需要Authentication的時候,伺服器傳送一個頭(同時還有401程式碼)請求Authentication。它詳細指明瞭一個Authentication和一個域。這個頭看起來像: Www-authenticate: SCHEME realm="REALM". e.g. Www-authenticate: Basic realm="cPanel Users" 客戶端然後就會用包含在頭中的正確的帳戶和密碼重新請求這個域。這是“基本驗證”。為了簡化這個過程,我們可以建立一個 HTTPBasicAuthHandler和opener的例項來使用這個handler。 HTTPBasicAuthHandler用一個叫做密碼管理的物件來處理url和使用者名稱和密碼的域的對映。如果你知道域是什麼(從伺服器傳送的authentication 頭中),那你就可以使用一個HTTPPasswordMgr。多數情況下人們不在乎域是什麼。那樣使用HTTPPasswordMgrWithDefaultRealm就很方便。它允許你為一個url具體指定使用者名稱和密碼。這將會在你沒有為一個特殊的域提供一個可供選擇的密碼鎖時提供給你。我們通過提供None作為add_password方法域的引數指出這一點。最高級別的url是需要authentication的第一個url。比你傳遞給.add_password()的url更深的url同樣也會匹配。 # create a password manager password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() # Add the username and password. # If we knew the realm, we could use it instead of ``None``. top_level_url = "http://example.com/foo/" password_mgr.add_password(None, top_level_url, username, password) handler = urllib2.HTTPBasicAuthHandler(password_mgr) # create "opener" (OpenerDirector instance) opener = urllib2.build_opener(handler) # use the opener to fetch a URL opener.open(a_url) # Install the opener. # Now all calls to urllib2.urlopen use our opener. urllib2.install_opener(opener) 注意在以上的示例中我們只給build_opener提供了HTTPBasicAuthHandler。預設opener有對普通情況的操作器(handlers)- ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor. 高級別url實際上是一個完整的url(包括http:協議元件和主機名可選的埠號),如“http://example.com”或者是一個授權(同樣,主機名,可選的埠號)如“"example.com" 或 "example.com:8080”(後一個示例包含了一個埠號)。授權,如果被呈現,一定不能包含使用者資訊-如“[email protected]:example.com” 是不正確的、 代理: urllib2將會自動檢測你的代理設定並使用它們。這是通過 ProxyHandler實現的,它是操作器鏈的一部分。正常情況下,這是個好東西,但是也有它不那麼有用的偶然情況。一個做這些的方法是安裝我們自己的ProxyHandler,不用任何定義任何代理。使用一個和建立Basic Authentication操作器相似的步驟可以實現: >>> proxy_support = urllib2.ProxyHandler({}) >>> opener = urllib2.build_opener(proxy_support) >>> urllib2.install_opener(opener) 注意:目前urllib2不支援通過代理獲取HTTPs位置。這是一個問題。 sockets和layers python支援獲取層疊的網頁的原始碼。urllib2使用httplib library,而httplib library反過來使用socket library。對於python2.3你可以指明一個socket應該在超時之前等待response多久。這在這些不得不獲取網頁的應用中很有用。預設socket模組沒有超時而且能夠掛起。目前,socket超時在urllib2或者httplib水平中不可見。然而,你可以全域性地為所有socket設定預設的超時。 import socket import urllib2 # timeout in seconds timeout = 10 socket.setdefaulttimeout(timeout) # this call to urllib2.urlopen now uses the default timeout # we have set in the socket module req = urllib2.Request('http://www.voidspace.org.uk') response = urllib2.urlopen(req)

相關推薦

補充python的urlliburllib2

此文由我(54snapple)翻譯自http://www.voidspace.org.uk/python/articles/urllib2.shtml。原文標題:urllib2 - The Missing Manual -副標題:HOWTO Fetch Internet Resources with Pyt

爬蟲學習——網頁下載器urllib2模塊

處理器 請求 aid none pro 調用 tps jar header 什麽是網頁下載器? 一、網頁下載器是爬蟲的核心組件 二、常用的python網頁下載器有urlilib2基礎模塊和requests第三方插件兩種 urllib2支持功能:1.支持直接url下載;

python urllib urllib2

tran gecko json XML clas nco 接受 這樣的 val urllib 和 urllib2 都是接受URL請求的相關模塊,但是提供了不同的功能。兩個最顯著的不同如下: urllib 僅可以接受URL,不能創建 設置了headers 的Request

RequestUrllib2使用代理ip的區別

proxies = {'http':'http://XX.XX.XX.XX:XXXX'} Requests:   import requests   response = requ

資料庫學習(四)with as (補充 nvl count 函式)

  with as 的專業解釋我這就不詳細說明了,我這就梳理下我自己的實踐應用,就是根據某個條件查詢出結果集放在一個臨時表裡面,可以建立多個臨時表,然後再從這些臨時表中查詢出要的資料。   參考資料:https://www.cnblogs.com/Niko12230/p/5945133.html 

python的httplib、urlliburllib2的區別及用

慢慢的把它們總結一下,總結就是最好的學習方法 宗述 首先來看一下他們的區別 urllib和urllib2 urllib 和urllib2都是接受URL請求的相關模組,但是urllib2可以接受一個Re

Python模組之urlliburllib2結合使用

簡介: urllib2是python的一個獲取url(Uniform Resource Locators,統一資源定址器)的模組。它用urlopen函式的形式提供了一個非常簡潔的介面。這使得用各種各樣的協議獲取url成為可能。它同時也提供了一個稍微複雜的介面來處理常見的狀

python2.7下的urlliburllib2

python最噁心的地方就在於它的版本和配置了,特別是安裝第三方包的時候經常會出現莫名其妙的錯誤,又不懂。 所以只能不斷的切來切去的。 今天學習python爬蟲,其中Python2.7使用了urllib和urllib2,python3的urllib結合了py2.7的兩部分。

urlliburllib2的區別使用

 Python的urllib和urllib2模組都做與請求URL相關的操作,但他們提供不同的功能。他們兩個最顯著的差異如下: urllib2可以接受一個Request物件,並以此可以來設定一個URL的headers,但是urllib只接收一個URL。這意味著,

叠代器生成器補充

while nbsp clas 終極 就會 class 列表 cnblogs app 初步鋪墊: for i in [1,2,3,4]: pass l = [1,2,3,4] l2 = iter(l) print(l2.__next__()) print(l2.__n

Python urllib2爬蟲豆瓣小說名稱評分

log color .com imp fin com open cor douban #-*- coding:utf-8 -*- import urllib2 import re url = ‘https://book.douban.com/tag/%E5%B0%8F%

Java學習記錄(補充三:面向對象的封裝繼承)

-1 div 方法名 工程師 over println 補充 else time 面向對象的封裝package day7; //面向對象的封裝 public class Employee { String name = "zhangsan"; privat

Java學習記錄(補充八:Date類;Java流(Stream),文件(File)IO)

tac hang set .get com 文件 pac 抽象類 格式化 Date類,Calendar類package Box1; import java.text.ParseException; import java.text.SimpleDateFormat; i

JAVA 面向對象補充[toString方法equals方法]

和equal ring cnblogs 技術分享 tostring 取消 equal ima nbsp 一.toString 方法 這裏的toString 和 C#的To string 是兩回事. JAVA中to string : Object類中都有一個to stri

【安全牛學習筆記】SSL、TLS拒絕服務攻擊補充概念

security+ 信息安全 SSL/TLS拒絕服務攻擊 thc-ssl-doc SSL協商加密對性能開銷增加,大量握手請求

[圖形學][轉載]圓心角圓周角相關問題,補充相關解答

都是 解答 連接 最小 width 情況 details article csdn 轉自:http://blog.csdn.net/silangquan/article/details/18450199 題目:兩圓相交,只有2交點A、B,過A點做線段CAD,CA、AD為兩圓

Traffic-Server配置(待補充更新)

exp onf 存儲 空間 時間 cache 1-1 byte conn Server 5.3.2 測試1.裸盤:remap.configmap http://192.168.227.131 http://192.168.227.131:8080 #traffic_ser

django補充form組件

choice 用戶 初始化 adf 表達式 講師 pwd true () Model常用操作: - 參數:filter - all,values,values_list [obj(id,name,pwd,email),obj(id,name,pwd,email

sql中inexist語句的區別?(補充了left joinright join)

有用 表數 from 部分匹配 exist 循環 targe 從表 exists in和exists(摘錄自百度)in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用

C++工程文件夾中的binobj文件夾有何用處?(補充多文件結構)

binary 實現 頭文件 整合 推斷 pos 兩個 對象 bject 博主在使用Code::Blocks創建一個工程之後,正準備新建一個頭文件,細心的博主發現,在工程文件夾中有兩個子文件夾,分別是bin和obj。好奇心驅使下,想知道這兩個文件夾用來幹嘛的,網上搜了下,整合