Pythonのurllib 2モジュールの8つの使用詳細の共有
4845 ワード
Python標準ライブラリには多くの実用的なツールクラスがありますが、urllib 2というHTTPクライアントライブラリのような使用の詳細は、具体的な使用時には、標準ライブラリドキュメントでは説明されていません.ここではurllib 2ライブラリの使用の詳細をまとめます.
1 Proxyの設定
urllib 2のデフォルトでは環境変数http_が使用されます.proxyでHTTP Proxyを設定します.環境変数の影響を受けずにプログラムでProxyを明確に制御したい場合は、次の方法を使用します.
2 Timeout設定
旧バージョンでは、urllib 2のAPIはTimeoutの設定を暴露していません.Timeout値を設定するには、SocketのグローバルTimeout値しか変更できません.
1.User-Agent一部のServerまたはProxyは、ブラウザによって開始されたRequest 2.Content-TypeがRESTインタフェースを使用しているかどうかを判断するためにこの値をチェックし、HTTP Bodyの内容がどのように解析されるかを決定します.
一般的な値は次のとおりです.
1.アプリケーション/xml:RESTful/OAP呼び出しなどのXML RPCで2.アプリケーション/jsonを使用:JSON RPC呼び出しで3.アプリケーション/x-www-form-urlencoded:ブラウザがWebフォームを送信するときに使用...
RPCを使用してサーバが提供するRESTfulまたはSOAPサービスを呼び出すと、Content-Typeの設定エラーによりサーバがサービスを拒否します.
4 Redirect
urllib 2はデフォルトで3 xx HTTPリターンコードに対して自動的にRedirect動作を行い、手動で構成する必要はありません.Redirect動作が発生しているかどうかを検出するには、ResponseのURLとRequestのURLが一致しているかどうかをチェックするだけです.
urllib 2のCookieに対する処理も自動的である.Cookieアイテムの値を取得する必要がある場合は、次のようにします.
7 HTTPの返却コードを得る
200 OKではurlopenが返すresponseオブジェクトのgetcode()メソッドを使えばHTTPの返却コードが得られる.しかし、他の戻りコードではurlopenは異常を放出します.この場合、例外オブジェクトのcodeプロパティをチェックします.
urllib 2を使用すると、以下の方法でDebug Logを開くことができます.これにより、パケットの内容が画面に印刷され、デバッグが容易になり、パケットをつかむ作業をある程度省くことができます.
1 Proxyの設定
urllib 2のデフォルトでは環境変数http_が使用されます.proxyでHTTP Proxyを設定します.環境変数の影響を受けずにプログラムでProxyを明確に制御したい場合は、次の方法を使用します.
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)
ここで注意すべき詳細はurllib 2.install_を使用します.Opener()はurllib 2のグローバルopenerを設定します.このように後の使用は便利ですが、プログラムで2つの異なるProxy設定を使用したいなど、より細かい粒度の制御はできません.良い方法はinstallを使わないことです.Openerは、グローバルurlopenメソッドの代わりにopenerのopenメソッドを直接呼び出すだけで、グローバルの設定を変更します.2 Timeout設定
旧バージョンでは、urllib 2のAPIはTimeoutの設定を暴露していません.Timeout値を設定するには、SocketのグローバルTimeout値しか変更できません.
import urllib2
import socket
socket.setdefaulttimeout(10) # 10
urllib2.socket.setdefaulttimeout(10) #
新しいPython 2.6バージョンでは、タイムアウトはurllib 2.urlopen()のtimeoutパラメータで直接設定できます.
import urllib2
response = urllib2.urlopen('http://www.google.com', timeout=10)
3 HTTP Requestに特定のHeaderを追加Headerを追加するには、Requestオブジェクトを使用する必要があります.
import urllib2
request = urllib2.Request(uri)
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)
サーバ側がこれらのヘッダをチェックすることに注意してください.1.User-Agent一部のServerまたはProxyは、ブラウザによって開始されたRequest 2.Content-TypeがRESTインタフェースを使用しているかどうかを判断するためにこの値をチェックし、HTTP Bodyの内容がどのように解析されるかを決定します.
一般的な値は次のとおりです.
1.アプリケーション/xml:RESTful/OAP呼び出しなどのXML RPCで2.アプリケーション/jsonを使用:JSON RPC呼び出しで3.アプリケーション/x-www-form-urlencoded:ブラウザがWebフォームを送信するときに使用...
RPCを使用してサーバが提供するRESTfulまたはSOAPサービスを呼び出すと、Content-Typeの設定エラーによりサーバがサービスを拒否します.
4 Redirect
urllib 2はデフォルトで3 xx HTTPリターンコードに対して自動的にRedirect動作を行い、手動で構成する必要はありません.Redirect動作が発生しているかどうかを検出するには、ResponseのURLとRequestのURLが一致しているかどうかをチェックするだけです.
import urllib2
response = urllib2.urlopen('http://www.google.cn')
redirected = response.geturl() == 'http://www.google.cn'
自動Redirectを使用しない場合は、より下位レベルのhttplibライブラリのほか、カスタムHTTPRedirectHandlerクラスを使用することもできます.
import urllib2
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(self, req, fp, code, msg, headers):
pass
def http_error_302(self, req, fp, code, msg, headers):
pass
opener = urllib2.build_opener(RedirectHandler)
opener.open('http://www.google.cn')
5 Cookie urllib 2のCookieに対する処理も自動的である.Cookieアイテムの値を取得する必要がある場合は、次のようにします.
import urllib2
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.google.com')
for item in cookie:
if item.name == 'some_cookie_item_name':
print item.value
6 HTTPのPUTとDELETEメソッドurllib 2はHTTPのGETとPOSTメソッドのみをサポートし、HTTPのPUTとDELETEを使用する場合は比較的下位層のhttplibライブラリのみを使用する.それでも、urllib 2がHTTP PUTまたはDELETEのパケットを発行できるようにするには、次のようにします.
import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)
このやり方はHack方式ですが、実際に使っても問題ありません.7 HTTPの返却コードを得る
200 OKではurlopenが返すresponseオブジェクトのgetcode()メソッドを使えばHTTPの返却コードが得られる.しかし、他の戻りコードではurlopenは異常を放出します.この場合、例外オブジェクトのcodeプロパティをチェックします.
import urllib2
try:
response = urllib2.urlopen('http://restrict.web.com')
except urllib2.HTTPError, e:
print e.code
8 Debug Log urllib 2を使用すると、以下の方法でDebug Logを開くことができます.これにより、パケットの内容が画面に印刷され、デバッグが容易になり、パケットをつかむ作業をある程度省くことができます.
import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')