20.6. urllib2 — URLを開くための拡張可能なライブラリ—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/urllib2
移動先:案内検索

20.6。 urllib2 —URLを開くための拡張可能なライブラリ

ノート

urllib2 モジュールは、urllib.requestおよびurllib.errorという名前のPython3のいくつかのモジュールに分割されています。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。


urllib2 モジュールは、基本認証とダイジェスト認証、リダイレクト、Cookieなどの複雑な世界でURL(主にHTTP)を開くのに役立つ関数とクラスを定義します。

も参照してください

Requestsパッケージは、高レベルのHTTPクライアントインターフェイスに推奨されます。


urllib2 モジュールは、次の関数を定義します。

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

URL url を開きます。これは、文字列または Request オブジェクトのいずれかです。

data は、サーバーに送信する追加データを指定する文字列、またはそのようなデータが必要ない場合はNoneの場合があります。 現在、 data を使用するのはHTTPリクエストだけです。 data パラメーターが指定されている場合、HTTP要求はGETではなくPOSTになります。 data は、標準の application / x-www-form-urlencoded 形式のバッファーである必要があります。 urllib.urlencode()関数は、2タプルのマッピングまたはシーケンスを受け取り、この形式の文字列を返します。 urllib2モジュールは、Connection:closeヘッダーを含むHTTP / 1.1リクエストを送信します。

オプションの timeout パラメーターは、接続試行などのブロック操作のタイムアウトを秒単位で指定します(指定されていない場合は、グローバルなデフォルトのタイムアウト設定が使用されます)。 これは実際にはHTTP、HTTPS、FTP接続でのみ機能します。

context を指定する場合は、さまざまなSSLオプションを記述する ssl.SSLContext インスタンスである必要があります。 詳細については、 HTTPSConnection を参照してください。

オプションの cafile および capath パラメーターは、HTTPS要求の信頼できるCA証明書のセットを指定します。 cafile は、CA証明書のバンドルを含む単一のファイルを指す必要がありますが、 capath は、ハッシュされた証明書ファイルのディレクトリを指す必要があります。 詳細については、 ssl.SSLContext.load_verify_locations()を参照してください。

cadefault パラメーターは無視されます。

この関数は、次の3つの追加メソッドを持つファイルのようなオブジェクトを返します。

  • geturl() —取得したリソースのURLを返します。これは、リダイレクトが実行されたかどうかを判断するために一般的に使用されます。

  • info() —ヘッダーなどのページのメタ情報を mimetools.Message インスタンスの形式で返します( HTTPヘッダーのクイックリファレンスを参照)

  • getcode() —応答のHTTPステータスコードを返します。

エラー時に URLError を発生させます。

ハンドラーが要求を処理しない場合、Noneが返される場合があることに注意してください(ただし、デフォルトでインストールされているグローバル OpenerDirector は、 UnknownHandler を使用して、これが発生しないようにします)。

また、プロキシ設定が検出された場合(たとえば、 http_proxyなどの*_proxy環境変数が設定されている場合)、 ProxyHandler がデフォルトでインストールされ、リクエストがプロキシを介して処理されることを確認します。

バージョン2.6で変更: timeout が追加されました。

バージョン2.7.9で変更: cafilecapathcadefault 、および context が追加されました。

urllib2.install_opener(opener)
OpenerDirector インスタンスをデフォルトのグローバルオープナーとしてインストールします。 オープナーのインストールは、urlopenでそのオープナーを使用する場合にのみ必要です。 それ以外の場合は、 urlopen()の代わりに OpenerDirector.open()を呼び出すだけです。 コードは実際の OpenerDirector をチェックせず、適切なインターフェイスを持つ任意のクラスが機能します。
urllib2.build_opener([handler, ...])

OpenerDirector インスタンスを返します。これは、指定された順序でハンドラーをチェーンします。 handler は、 BaseHandler のインスタンス、または BaseHandler のサブクラスのいずれかです(この場合、パラメーターなしでコンストラクターを呼び出すことができる必要があります)。 次のクラスのインスタンスは、ハンドラーに含まれていない限り、ハンドラーの前にあります。ただし、それらのインスタンスまたはサブクラス: ProxyHandler (ifプロキシ設定が検出されました)、 UnknownHandlerHTTPHandlerHTTPDefaultErrorHandlerHTTPRedirectHandlerFTPHandlerFileHandlerHTTPErrorProcessor

PythonインストールでSSLがサポートされている場合(つまり、 ssl モジュールをインポートできる場合)、 HTTPSHandler も追加されます。

Python 2.3以降、 BaseHandler サブクラスは、handler_order属性を変更して、ハンドラーリスト内の位置を変更することもできます。

必要に応じて、次の例外が発生します。

exception urllib2.URLError
ハンドラーは、問題が発生したときにこの例外(または派生例外)を発生させます。 IOErrorのサブクラスです。
reason
このエラーの理由。 メッセージ文字列または別の例外インスタンス(リモートURLの場合は socket.error 、ローカルURLの場合はOSError)にすることができます。
exception urllib2.HTTPError

例外( URLError のサブクラス)ですが、 HTTPError は、例外ではないファイルのような戻り値として機能することもできます( urlopen()[ X179X]が戻ります)。 これは、認証要求などのエキゾチックなHTTPエラーを処理するときに役立ちます。

code

RFC 2616 で定義されているHTTPステータスコード。 この数値は、 BaseHTTPServer.BaseHTTPRequestHandler.responses にあるコードのディクショナリにある値に対応します。

reason

このエラーの理由。 メッセージ文字列または別の例外インスタンスにすることができます。

次のクラスが提供されています。

class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

このクラスは、URLリクエストを抽象化したものです。

url は、有効なURLを含む文字列である必要があります。

data は、サーバーに送信する追加データを指定する文字列、またはそのようなデータが必要ない場合はNoneの場合があります。 現在、 data を使用するのはHTTPリクエストだけです。 data パラメーターが指定されている場合、HTTP要求はGETではなくPOSTになります。 data は、標準の application / x-www-form-urlencoded 形式のバッファーである必要があります。 urllib.urlencode()関数は、2タプルのマッピングまたはシーケンスを受け取り、この形式の文字列を返します。

headers は辞書である必要があり、 add_header()が各キーと値を引数として呼び出されたかのように扱われます。 これは、ブラウザが自身を識別するために使用するUser-Agentヘッダー値を「スプーフィング」するためによく使用されます。一部のHTTPサーバーは、スクリプトではなく、一般的なブラウザからのリクエストのみを許可します。 たとえば、MozillaFirefoxは自分自身を"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"として識別しますが、 urllib2 のデフォルトのユーザーエージェント文字列は"Python-urllib/2.6"(Python 2.6の場合)です。

最後の2つの引数は、サードパーティのHTTPCookieを正しく処理するためにのみ重要です。

origin_req_host は、 RFC 2965 で定義されているように、オリジントランザクションのリクエストホストである必要があります。 デフォルトはcookielib.request_host(self)です。 これは、ユーザーによって開始された元の要求のホスト名またはIPアドレスです。 たとえば、リクエストがHTMLドキュメント内の画像に対するものである場合、これは画像を含むページに対するリクエストのリクエストホストである必要があります。

unverizable は、RFC 2965で定義されているように、要求が検証不可能かどうかを示す必要があります。 デフォルトはFalseです。 検証不可能なリクエストとは、ユーザーが承認するオプションがなかったURLのリクエストです。 たとえば、リクエストがHTMLドキュメント内の画像に対するものであり、ユーザーが画像の自動フェッチを承認するオプションがなかった場合、これは当てはまるはずです。

class urllib2.OpenerDirector
OpenerDirector クラスは、チェーンされた BaseHandler を介してURLを開きます。 ハンドラーのチェーンとエラーからの回復を管理します。
class urllib2.BaseHandler
これは、登録されているすべてのハンドラーの基本クラスであり、登録の単純なメカニズムのみを処理します。
class urllib2.HTTPDefaultErrorHandler
HTTPエラー応答のデフォルトハンドラーを定義するクラス。 すべての応答は HTTPError 例外に変換されます。
class urllib2.HTTPRedirectHandler
リダイレクトを処理するクラス。
class urllib2.HTTPCookieProcessor([cookiejar])
HTTPCookieを処理するクラス。
class urllib2.ProxyHandler([proxies])

リクエストにプロキシを経由させます。 プロキシを指定する場合は、プロトコル名をプロキシのURLにマッピングする辞書である必要があります。 デフォルトでは、環境変数 <protocol>_proxyからプロキシのリストを読み取ります。 プロキシ環境変数が設定されていない場合、Windows環境では、プロキシ設定はレジストリの[インターネット設定]セクションから取得され、Mac OS X環境では、プロキシ情報はOSXシステム構成フレームワークから取得されます。

自動検出されたプロキシを無効にするには、空の辞書を渡します。

ノート

変数REQUEST_METHODが設定されている場合、HTTP_PROXYは無視されます。 getproxies()のドキュメントを参照してください。

class urllib2.HTTPPasswordMgr
(realm, uri) -> (user, password)マッピングのデータベースを保持します。
class urllib2.HTTPPasswordMgrWithDefaultRealm
(realm, uri) -> (user, password)マッピングのデータベースを保持します。 Noneのレルムは、キャッチオールレルムと見なされ、他のレルムが適合しない場合に検索されます。
class urllib2.AbstractBasicAuthHandler([password_mgr])
これは、リモートホストとプロキシの両方に対するHTTP認証を支援するミックスインクラスです。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.HTTPBasicAuthHandler([password_mgr])
リモートホストで認証を処理します。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.ProxyBasicAuthHandler([password_mgr])
プロキシで認証を処理します。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.AbstractDigestAuthHandler([password_mgr])
これは、リモートホストとプロキシの両方に対するHTTP認証を支援するミックスインクラスです。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.HTTPDigestAuthHandler([password_mgr])
リモートホストで認証を処理します。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.ProxyDigestAuthHandler([password_mgr])
プロキシで認証を処理します。 password_mgr は、指定されている場合、 HTTPPasswordMgr と互換性のあるものである必要があります。 サポートする必要のあるインターフェイスについては、セクション HTTPPasswordMgrオブジェクトを参照してください。
class urllib2.HTTPHandler
HTTPURLのオープンを処理するクラス。
class urllib2.HTTPSHandler([debuglevel[, context]])

HTTPSURLのオープンを処理するクラス。 context は、 httplib.HTTPSConnection と同じ意味です。

バージョン2.7.9で変更: コンテキストが追加されました。

class urllib2.FileHandler
ローカルファイルを開きます。
class urllib2.FTPHandler
FTPURLを開きます。
class urllib2.CacheFTPHandler
FTP URLを開き、開いているFTP接続のキャッシュを保持して、遅延を最小限に抑えます。
class urllib2.UnknownHandler
不明なURLを処理するためのキャッチオールクラス。
class urllib2.HTTPErrorProcessor
HTTPエラー応答を処理します。

20.6.1。 リクエストオブジェクト

次のメソッドは、 Request のすべてのパブリックインターフェイスを記述しているため、すべてをサブクラスでオーバーライドする必要があります。

Request.add_data(data)
Request データを data に設定します。 これは、HTTPハンドラーを除くすべてのハンドラーによって無視されます。バイト文字列が必要であり、要求がGETではなくPOSTに変更されます。
Request.get_method()
HTTPリクエストメソッドを示す文字列を返します。 これはHTTPリクエストに対してのみ意味があり、現在は常に'GET'または'POST'を返します。
Request.has_data()
インスタンスにNone以外のデータがあるかどうかを返します。
Request.get_data()
インスタンスのデータを返します。
Request.add_header(key, val)
リクエストに別のヘッダーを追加します。 ヘッダーは現在、サーバーに送信されるヘッダーのリストに追加されるHTTPハンドラーを除くすべてのハンドラーによって無視されます。 同じ名前のヘッダーが複数存在することはできません。キーが衝突した場合、後の呼び出しで前の呼び出しが上書きされることに注意してください。 現在、これはHTTP機能の損失ではありません。これは、複数回使用されたときに意味を持つすべてのヘッダーには、1つのヘッダーのみを使用して同じ機能を取得する(ヘッダー固有の)方法があるためです。
Request.add_unredirected_header(key, header)

リダイレクトされたリクエストに追加されないヘッダーを追加します。

バージョン2.4の新機能。

Request.has_header(header)

インスタンスに名前付きヘッダーがあるかどうかを返します(通常とリダイレクトなしの両方をチェックします)。

バージョン2.4の新機能。

Request.get_full_url()
コンストラクターで指定されたURLを返します。
Request.get_type()
URLのタイプを返します—スキームとも呼ばれます。
Request.get_host()
接続が確立されるホストを返します。
Request.get_selector()
セレクターを返します—サーバーに送信されるURLの一部。
Request.get_header(header_name, default=None)
指定されたヘッダーの値を返します。 ヘッダーが存在しない場合は、デフォルト値を返します。
Request.header_items()
リクエストヘッダーのタプル(header_name、header_value)のリストを返します。
Request.set_proxy(host, type)
プロキシサーバーに接続してリクエストを準備します。 hosttype はインスタンスのものを置き換え、インスタンスのセレクターはコンストラクターで指定された元のURLになります。
Request.get_origin_req_host()
RFC 2965 で定義されているように、オリジントランザクションのリクエストホストを返します。 Request コンストラクターのドキュメントを参照してください。
Request.is_unverifiable()
RFC 2965で定義されているように、要求が検証不可能かどうかを返します。 Request コンストラクターのドキュメントを参照してください。


20.6.2。 OpenerDirectorオブジェクト

OpenerDirector インスタンスには次のメソッドがあります。

OpenerDirector.add_handler(handler)
handlerBaseHandler のインスタンスである必要があります。 次のメソッドが検索され、可能なチェーンに追加されます(HTTPエラーは特殊なケースであることに注意してください)。
  • protocol_open —ハンドラーがプロトコル URLを開く方法を知っていることを通知します。
  • http_error_type —ハンドラーがHTTPエラーコード type でHTTPエラーを処理する方法を知っていることを通知します。
  • protocol_error —ハンドラーが(http以外)プロトコルからのエラーを処理する方法を知っていることを通知します。
  • protocol_request —ハンドラーがプロトコル要求を前処理する方法を知っていることを通知します。
  • protocol_response —ハンドラーがプロトコル応答を後処理する方法を知っていることを通知します。
OpenerDirector.open(url[, data][, timeout])

指定された url (リクエストオブジェクトまたは文字列の場合があります)を開き、オプションで指定された data を渡します。 発生する引数、戻り値、および例外は、 urlopen()(現在インストールされているグローバル OpenerDirectoropen()メソッドを呼び出すだけです)と同じです。 。 オプションの timeout パラメーターは、接続試行などのブロック操作のタイムアウトを秒単位で指定します(指定されていない場合は、グローバルなデフォルトのタイムアウト設定が使用されます)。 タイムアウト機能は、実際にはHTTP、HTTPS、およびFTP接続でのみ機能します)。

バージョン2.6で変更: timeout が追加されました。

OpenerDirector.error(proto[, arg[, ...]])

指定されたプロトコルのエラーを処理します。 これにより、指定された引数(プロトコル固有)を使用して、指定されたプロトコルの登録済みエラーハンドラーが呼び出されます。 HTTPプロトコルは、HTTP応答コードを使用して特定のエラーハンドラーを判別する特殊なケースです。 ハンドラークラスのhttp_error_*()メソッドを参照してください。

発生する戻り値と例外は、 urlopen()と同じです。

OpenerDirectorオブジェクトは、次の3つの段階でURLを開きます。

これらのメソッドが各ステージ内で呼び出される順序は、ハンドラーインスタンスを並べ替えることによって決定されます。

  1. protocol_requestのような名前のメソッドを持つすべてのハンドラーには、リクエストを前処理するために呼び出されるそのメソッドがあります。

  2. protocol_openのような名前のメソッドを持つハンドラーは、要求を処理するために呼び出されます。 この段階は、ハンドラーが None 以外の値を返すと終了します(つまり、 応答)、または例外を発生させます(通常は URLError )。 例外は伝播できます。

    実際、上記のアルゴリズムは、default_open()という名前のメソッドに対して最初に試行されます。 そのようなすべてのメソッドが None を返す場合、protocol_openのような名前のメソッドに対してアルゴリズムが繰り返されます。 そのようなすべてのメソッドが None を返す場合、unknown_open()という名前のメソッドに対してアルゴリズムが繰り返されます。

    これらのメソッドの実装には、親 OpenerDirector インスタンスの open()および error()メソッドの呼び出しが含まれる場合があることに注意してください。

  3. protocol_responseのような名前のメソッドを持つすべてのハンドラーには、応答を後処理するために呼び出されるそのメソッドがあります。


20.6.3。 BaseHandlerオブジェクト

BaseHandler オブジェクトは、直接役立つメソッドと、派生クラスで使用されることを意図したメソッドをいくつか提供します。 これらは直接使用することを目的としています。

BaseHandler.add_parent(director)
親としてディレクターを追加します。
BaseHandler.close()
親を削除します。

次の属性とメソッドは、 BaseHandler から派生したクラスでのみ使用する必要があります。

ノート

protocol_request()またはprotocol_response()メソッドを定義するサブクラスには*Processorという名前が付けられるという規則が採用されています。 他のすべての名前は*Handlerです。


BaseHandler.parent
有効な OpenerDirector 。これを使用して、別のプロトコルを使用して開いたり、エラーを処理したりできます。
BaseHandler.default_open(req)

このメソッドは BaseHandler で定義されているではなくですが、すべてのURLをキャッチする場合は、サブクラスで定義する必要があります。

このメソッドが実装されている場合、親 OpenerDirector によって呼び出されます。 OpenerDirector またはNoneopen()の戻り値で説明されているように、ファイルのようなオブジェクトを返す必要があります。 本当に例外的なことが起こらない限り、 URLError を発生させる必要があります(たとえば、MemoryErrorURLError にマップしないでください)。

このメソッドは、プロトコル固有のopenメソッドの前に呼び出されます。

BaseHandler.protocol_open(req)

(「プロトコル」はプロトコル名に置き換えられます。)

このメソッドは BaseHandler で定義されたではなくですが、指定されたプロトコルでURLを処理する場合は、サブクラスで定義する必要があります。

このメソッドは、定義されている場合、親 OpenerDirector によって呼び出されます。 戻り値は、 default_open()の場合と同じである必要があります。

BaseHandler.unknown_open(req)

このメソッドは BaseHandler で定義されている not ですが、特定の登録済みハンドラーがないすべてのURLをキャッチして開く場合は、サブクラスで定義する必要があります。

このメソッドが実装されている場合、 OpenerDirector によって呼び出されます。 戻り値は、 default_open()の場合と同じである必要があります。

BaseHandler.http_error_default(req, fp, code, msg, hdrs)

このメソッドは BaseHandler で定義されている not ですが、サブクラスは、他の方法で処理されないHTTPエラーのキャッチオールを提供する場合は、このメソッドをオーバーライドする必要があります。 OpenerDirector がエラーを取得すると自動的に呼び出されますが、他の状況では通常は呼び出されません。

reqRequest オブジェクト、 fp はHTTPエラー本体を持つファイルのようなオブジェクト、 code は3つになります-エラーの数字コード。 msg はユーザーに表示されるコードの説明であり、 hdrs はエラーのヘッダーを持つマッピングオブジェクトです。

発生する戻り値と例外は、 urlopen()のものと同じである必要があります。

BaseHandler.http_error_nnn(req, fp, code, msg, hdrs)

nnn は3桁のHTTPエラーコードである必要があります。 このメソッドも BaseHandler で定義されていませんが、存在する場合は、コード nnn のHTTPエラーが発生すると、サブクラスのインスタンスで呼び出されます。

サブクラスは、特定のHTTPエラーを処理するために、このメソッドをオーバーライドする必要があります。

発生する引数、戻り値、および例外は、 http_error_default()の場合と同じである必要があります。

BaseHandler.protocol_request(req)

(「プロトコル」はプロトコル名に置き換えられます。)

このメソッドは BaseHandler で定義されたではなくですが、指定されたプロトコルのリクエストを前処理する場合は、サブクラスで定義する必要があります。

このメソッドは、定義されている場合、親 OpenerDirector によって呼び出されます。 reqRequest オブジェクトになります。 戻り値は Request オブジェクトである必要があります。

BaseHandler.protocol_response(req, response)

(「プロトコル」はプロトコル名に置き換えられます。)

このメソッドは、 BaseHandler で定義されたではなくですが、指定されたプロトコルの応答を後処理する場合は、サブクラスで定義する必要があります。

このメソッドは、定義されている場合、親 OpenerDirector によって呼び出されます。 reqRequest オブジェクトになります。 response は、 urlopen()の戻り値と同じインターフェイスを実装するオブジェクトになります。 戻り値は、 urlopen()の戻り値と同じインターフェイスを実装する必要があります。


20.6.4。 HTTPRedirectHandlerオブジェクト

ノート

一部のHTTPリダイレクトでは、このモジュールのクライアントコードからのアクションが必要です。 この場合、 HTTPError が発生します。 さまざまなリダイレクトコードの正確な意味の詳細については、 RFC 2616 を参照してください。


HTTPRedirectHandler.redirect_request(req, fp, code, msg, hdrs, newurl)

リダイレクトに応答して、 Request またはNoneを返します。 これは、サーバーからリダイレクトを受信したときに、http_error_30*()メソッドのデフォルトの実装によって呼び出されます。 リダイレクトが必要な場合は、新しい Request を返して、http_error_30*()newurl へのリダイレクトを実行できるようにします。 それ以外の場合、他のハンドラーがこのURLを処理しようとしない場合は、 HTTPError を発生させ、他のハンドラーが処理できない場合はNoneを返します。

ノート

このメソッドのデフォルトの実装は、 RFC 2616 に厳密には準拠していません。つまり、POST要求に対する301および302応答は、ユーザーの確認なしに自動的にリダイレクトされてはなりません。 。 実際には、ブラウザはこれらの応答の自動リダイレクトを許可し、POSTをGETに変更し、デフォルトの実装はこの動作を再現します。

HTTPRedirectHandler.http_error_301(req, fp, code, msg, hdrs)
Location:またはURI:のURLにリダイレクトします。 このメソッドは、HTTPの「永続的に移動」応答を取得するときに親 OpenerDirector によって呼び出されます。
HTTPRedirectHandler.http_error_302(req, fp, code, msg, hdrs)
http_error_301()と同じですが、「見つかった」応答が必要です。
HTTPRedirectHandler.http_error_303(req, fp, code, msg, hdrs)
http_error_301()と同じですが、「他を参照」応答が必要です。
HTTPRedirectHandler.http_error_307(req, fp, code, msg, hdrs)
http_error_301()と同じですが、「一時的なリダイレクト」応答が必要です。


20.6.5。 HTTPCookieProcessorオブジェクト

バージョン2.4の新機能。


HTTPCookieProcessor インスタンスには次の1つの属性があります。

HTTPCookieProcessor.cookiejar
Cookieが保存されている cookielib.CookieJar


20.6.6。 ProxyHandlerオブジェクト

ProxyHandler.protocol_open(request)

(「プロトコル」はプロトコル名に置き換えられます。)

ProxyHandler には、コンストラクターで指定された proxys ディクショナリにプロキシがあるすべての protocol に対してメソッドprotocol_openがあります。 このメソッドは、request.set_proxy()を呼び出すことによってプロキシを通過するように要求を変更し、チェーン内の次のハンドラーを呼び出して実際にプロトコルを実行します。


20.6.7。 HTTPPasswordMgrオブジェクト

これらのメソッドは、 HTTPPasswordMgr および HTTPPasswordMgrWithDefaultRealm オブジェクトで使用できます。

HTTPPasswordMgr.add_password(realm, uri, user, passwd)
uri は、単一のURIまたは一連のURIのいずれかです。 realmuser 、および passwd は文字列である必要があります。 これにより、レルムの認証および指定されたURIのいずれかのスーパーURIが指定されたときに、(user, passwd)が認証トークンとして使用されます。
HTTPPasswordMgr.find_user_password(realm, authuri)

指定されたレルムとURIがある場合は、そのユーザー/パスワードを取得します。 一致するユーザー/パスワードがない場合、このメソッドは(None, None)を返します。

HTTPPasswordMgrWithDefaultRealm オブジェクトの場合、指定されたレルムに一致するユーザー/パスワードがない場合、レルムNoneが検索されます。


20.6.8。 AbstractBasicAuthHandlerオブジェクト

AbstractBasicAuthHandler.http_error_auth_reqed(authreq, host, req, headers)

ユーザーとパスワードのペアを取得し、要求を再試行することにより、認証要求を処理します。 authreq は、レルムに関する情報がリクエストに含まれているヘッダーの名前である必要があります。 host は、認証するURLとパスを指定し、 req は認証する必要があります。 (失敗した) Request オブジェクトであり、 headers はエラーヘッダーである必要があります。

host はいずれかの機関です(例: "python.org")または権限コンポーネントを含むURL(例: "http://python.org/%22)。 いずれの場合も、権限にuserinfoコンポーネントを含めることはできません(したがって、"python.org"および"python.org:80"は問題ありませんが、"joe:[email protected]"は問題ありません)。


20.6.9。 HTTPBasicAuthHandlerオブジェクト

HTTPBasicAuthHandler.http_error_401(req, fp, code, msg, hdrs)
可能な場合は、認証情報を使用して要求を再試行してください。


20.6.10。 ProxyBasicAuthHandlerオブジェクト

ProxyBasicAuthHandler.http_error_407(req, fp, code, msg, hdrs)
可能な場合は、認証情報を使用して要求を再試行してください。


20.6.11。 AbstractDigestAuthHandlerオブジェクト

AbstractDigestAuthHandler.http_error_auth_reqed(authreq, host, req, headers)
authreq は、レルムに関する情報がリクエストに含まれているヘッダーの名前である必要があります。 host は、認証先のホストである必要があります。 req は、 (失敗した) Request オブジェクト、および headers はエラーヘッダーである必要があります。


20.6.12。 HTTPDigestAuthHandlerオブジェクト

HTTPDigestAuthHandler.http_error_401(req, fp, code, msg, hdrs)
可能な場合は、認証情報を使用して要求を再試行してください。


20.6.13。 ProxyDigestAuthHandlerオブジェクト

ProxyDigestAuthHandler.http_error_407(req, fp, code, msg, hdrs)
可能な場合は、認証情報を使用して要求を再試行してください。


20.6.14。 HTTPHandlerオブジェクト

HTTPHandler.http_open(req)
req.has_data()に応じて、GETまたはPOSTのいずれかのHTTPリクエストを送信します。


20.6.15。 HTTPSHandlerオブジェクト

HTTPSHandler.https_open(req)
req.has_data()に応じて、GETまたはPOSTのいずれかのHTTPSリクエストを送信します。


20.6.16。 FileHandlerオブジェクト

FileHandler.file_open(req)
ホスト名がない場合、またはホスト名が'localhost'の場合は、ファイルをローカルで開きます。 それ以外の場合はプロトコルをftpに変更し、parentを使用してプロトコルを開いてみてください。


20.6.17。 FTPHandlerオブジェクト

FTPHandler.ftp_open(req)
req で示されるFTPファイルを開きます。 ログインは常に空のユーザー名とパスワードで行われます。


20.6.18。 CacheFTPHandlerオブジェクト

CacheFTPHandler オブジェクトは、次の追加メソッドを持つ FTPHandler オブジェクトです。

CacheFTPHandler.setTimeout(t)
接続のタイムアウトを t 秒に設定します。
CacheFTPHandler.setMaxConns(m)
キャッシュ接続の最大数を m に設定します。


20.6.19。 UnknownHandlerオブジェクト

UnknownHandler.unknown_open()
URLError 例外を発生させます。


20.6.20。 HTTPErrorProcessorオブジェクト

バージョン2.4の新機能。


HTTPErrorProcessor.http_response()

HTTPエラー応答を処理します。

200のエラーコードの場合、応答オブジェクトはすぐに返されます。

200以外のエラーコードの場合、これは OpenerDirector.error()を介してprotocol_error_codeハンドラーメソッドにジョブを渡すだけです。 最終的に、他のハンドラーがエラーを処理しない場合、 urllib2.HTTPDefaultErrorHandlerHTTPError を発生させます。

HTTPErrorProcessor.https_response()

HTTPSエラー応答を処理します。

動作は http_response()と同じです。


20.6.21。 例

以下の例に加えて、 HOWTO Fetch Internet Resources Using urllib2 にさらに多くの例が示されています。

この例では、python.orgのメインページを取得し、その最初の100バイトを表示します。

>>> import urllib2
>>> f = urllib2.urlopen('http://www.python.org/')
>>> print f.read(100)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?xml-stylesheet href="./css/ht2html

ここでは、CGIのstdinにデータストリームを送信し、それが返すデータを読み取ります。 この例は、PythonインストールがSSLをサポートしている場合にのみ機能することに注意してください。

>>> import urllib2
>>> req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',
...                       data='This data is passed to stdin of the CGI')
>>> f = urllib2.urlopen(req)
>>> print f.read()
Got Data: "This data is passed to stdin of the CGI"

上記の例で使用されているサンプルCGIのコードは次のとおりです。

#!/usr/bin/env python
import sys
data = sys.stdin.read()
print 'Content-type: text-plain\n\nGot Data: "%s"' % data

基本HTTP認証の使用:

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)
urllib2.urlopen('http://www.example.com/login.html')

build_opener()は、 ProxyHandler を含む、多くのハンドラーをデフォルトで提供します。 デフォルトでは、 ProxyHandler<scheme>_proxyという名前の環境変数を使用します。ここで、<scheme>は関連するURLスキームです。 たとえば、 http_proxy環境変数が読み取られ、HTTPプロキシのURLが取得されます。

この例では、デフォルトの ProxyHandler を、プログラムで提供されたプロキシURLを使用するものに置き換え、 ProxyBasicAuthHandler でプロキシ認証サポートを追加します。

proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')

HTTPヘッダーの追加:

headers 引数を Request コンストラクターに使用するか、次のようにします。

import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib2.urlopen(req)

OpenerDirector は、すべての RequestUser-Agent ヘッダーを自動的に追加します。 これを変更するには:

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')

また、 Request が渡されると、いくつかの標準ヘッダー( Content-LengthContent-TypeHost )が追加されることに注意してください。 urlopen()(または OpenerDirector.open())へ。