もっと! urllib2 でリダイレクトを制御する
前回、
次回予告
メソッドを保持したままリダイレクトに従ってみたいです。予定は未定です。
urllib2 でリダイレクトを制御する - アジョブジ星通信
と言いましたが、 15 時間後に達成してしまいました。未定じゃなかった…。
本日 2 回目のお題
今回は、例えば HEAD でリクエストしたら、リダイレクトの最終地点のデータを HEAD で取得する、みたいに、メソッドを保持してリダイレクトを辿るようにしてみました。
早速コードを
長いように見えますが、メソッドを自由に指定できる Request と、 1 行だけを変えた HTTPRedirectHandler です。ほとんどコピペでできてます。
何をしているかというと、 GET を使うべきな 303 以外のステータスコードでは、元のリクエストのメソッドをそのまま使うようになってます。ハッピーじゃん?
使い方
>>> import urllib2 >>> from module2 import * >>> urllib2.install_opener(urllib2.build_opener(HTTPRedirectHandler2)) >>> request = Request2("http://j.mp/Z1AkTI", method="HEAD") >>> response = urllib2.urlopen(request) >>> response.code 200 >>> response.url 'http://www.google.co.jp/' >>> dict(response.headers) {'x-xss-protection': '1; mode=block', 'set-cookie': 'PREF=ID=1f438876b5cac006:FF=0:TM=1365400382:LM=1365400382:S=FwgBYMGahnizKJq-; expires=Wed, 08-Apr-2015 05:53:02 GMT; path=/; domain=.google.co.jp, NID=67=YjChh_zDs4mbiMj0gOkKtsy7aV9xz3hvn0uB9vq2flxWewUgFAUcPoNWDg0prLsZcWOUqIP_DCzJFIcXR-wQVFh6stcLEKdc4-LVhqUPr08DldShsMZ_SbGLv7P5lE1c; expires=Tue, 08-Oct-2013 05:53:02 GMT; path=/; domain=.google.co.jp; HttpOnly', 'expires': '-1', 'server': 'gws', 'connection': 'close', 'cache-control': 'private, max-age=0', 'date': 'Mon, 08 Apr 2013 05:53:02 GMT', 'p3p': 'CP="This is not a P3P policy! See ttp://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."', 'content-type': 'text/html; charset=Shift_JIS', 'x-frame-options': 'SAMEORIGIN'} >>> response.read() ''
これで多重リダイレクトさせられても response.url みるだけですぐにわかりますね。素敵。
ついでに install_opener してみましたけど、やっぱりするほどの価値ないですよね…。
まとめ
- urllib2 でのエラー処理、リダイレクト処理は Handler をつくることで簡単に変えられる
- デフォルトの Request は柔軟性が悪い
- install_opener って何に使うの?