サイトアイコン Python Snippets

HTTPのPOST/GETリクエストをする

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)
関連記事:

モバイルバージョンを終了