読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

urllib, urllib2を使ってGET/POST

注意(追記:2013.03.22)

もうこの情報は古いので、いまはHTTP系の処理はrequestsを使ったほうがいいです。

動機

Web API使ってるとでてくる使い回しをメモ。

方法

まずはオーソドックスに
  • GET
import urllib
url = 'http://d.hatena.ne.jp/ymotongpoo'
params = urllib.urlencode({'hoge':1, 'fuga':2})
f = urllib.urlopen(url + '?' + params) # paramsはhoge=1&fuga=2の形になっている
print f.read()
  • POST
import urllib
url = 'http://d.hatena.ne.jp/ymotongpoo'
params = urllib.urlencode({'hoge':1, 'fuga':2})
f = urllib.urlopen(url, params)
print f.read()

ここでもしProxy越しにやるならこんな具合

proxies = {'http':'http://proxy.host:port'}
f = urllib.urlencode(url, params, proxies) # POSTの場合
f = urllib.urlencode(url=url, proxies=proxies) # GETの場合
BASIC認証

認証が必要になってきたときは別のクラスを使わないといけない。

import urllib
import urllib2

url = 'http://d.hatena.ne.jp/ymotongpoo'
proxies = {'http':'http://proxy.host:port'}

if 'http' in proxies:
    proxy_handler = urllib2.ProxyHandler(proxies)
    auth_handler = urllib2.ProxyBasicAuthHandler()
else:
    auth_handler = urllib2.HTTPBasicAuthHandler()

auth_handler.add_password('Twitter API', 'http://twitter.com/', 'hoge', 'fuga')

if 'http' in proxies:
    opener = urllib2.build_opener(proxy_handler, auth_handler)
else:
    opener = urllib2.build_opener(auth_handler)

urllib2.install_opener(opener)
f = urllib2.urlopen(url)

print f.read()

PythonのマニュアルのProxyBasicAuthHandlerの例が微妙に間違ってるので注意。ここで、add_passwordの第1引数はrealmです。