アジョブジ星通信

進捗が出た頃に更新されるブログ。

もっと! urllib2 でリダイレクトを制御する

f:id:azyobuzin:20130408001650p:plain

前回、

次回予告

メソッドを保持したままリダイレクトに従ってみたいです。予定は未定です。

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 って何に使うの?