requestsモジュールを使う(Python2系, 3系共通)
pythonの標準ライブラリでもHTTPリクエストを送ることはできるが、煩雑で使いにくいためrequestsというサードパーティ製のライブラリが使われることが多い。
requestsモジュールを使った場合は直感的で簡単なコードでHTTPリクエストができる。
requestsモジュールのインストール。
$ pip install requests
GETリクエスト(requests版)
getメソッドでURLを指定してリクエスト。
import requests
response = requests.get('http://www.example.com')
print(response.status_code) # HTTPのステータスコード取得
print(response.text) # レスポンスのHTMLを文字列で取得
JSONを返すようなWebAPIのようなリクエストではjson()メソッドでjsonをパースしてdictやlistで返してくれる。
response = requests.get('https://httpbin.org/get')
print(response.json()) # レスポンスのjsonをdict化して返す
POSTリクエスト(requests版)
POSTの場合はpostメソッドでリクエストしてdata属性にdictを渡す。
このときは data属性で渡したときはHTMLのフォームからのリクエストのように application/x-www-form-urlencoded
で送信される。
import requests
response = requests.post('http://www.example.com', data={'foo': 'bar'})
print(response.status_code) # HTTPのステータスコード取得
print(response.text) # レスポンスのHTMLを文字列で取得
application/json
でリクエストしたいときは、dataではなくjson属性でdictを渡す。
response = requests.post('https://httpbin.org/post', json={'foo': 'bar'})
python3系の標準ライブラリ urllibを使う
python3とpython2では標準ライブラリのパッケージが異なるので注意(使い方はほぼ同じ)
requestsモジュールと違って、送信データ受信データをバイナリで送って、バイナリから読み込むという操作が必要になる。
GETリクエスト(python3 urllib版)
得られるレスポンスはbyte文字列なので、適切なエンコーディングでデコードする必要がある。(正確につくるならレスポンスヘッダContent-Typeを確認してどのようにdecodeするかを決定する)
import urllib.request
response = urllib.request.urlopen('http://www.example.com')
print(response.getcode())
html = response.read()
print(html.decode('utf-8'))
POSTリクエスト(python3 urllib版)
POSTリクエストする場合はRequestオブジェクトを作ってdataを渡す必要がある。
dataはURLエンコードをしなければならないし、送信データ文字コードを指定してバイト文字列を作る必要がある。
import urllib.request
import urllib.parse
data = urllib.parse.urlencode({'foo': 'bar'}).encode('utf-8')
request = urllib.request.Request('http://www.example.com', data)
response = urllib.request.urlopen(request)
print(response.getcode())
html = response.read()
print(html.decode('utf-8'))
python2系の標準ライブラリ urllib2を使う
python2の場合はpython3のurllibとほぼ同じだが、パッケージ構成が異なるので注意。
python2の時はurllibが複数あったが、python3で整理されている。
python2では文字列リテラルはバイト文字列になるため、エンコードが不要なようにみえるがユニコード文字列を扱いたい場合にはやはりエンコード・デコードが必要にある。
GETリクエスト(python2 urllib2版)
import urllib2
response = urllib2.urlopen('http://www.example.com')
print(response.getcode())
html = response.read()
print(html)
POSTリクエスト(python2 urllib2版)
import urllib
import urllib2
data = urllib.urlencode({'foo': 'bar'})
request = urllib2.Request('http://www.example.com', data)
response = urllib2.urlopen(request)
print(response.getcode())
html = response.read()
print(html)