[Python]API接続の基本を確認する[外部サーバ通信]
Web APIとはWebサイトの機能を外部から利用できるようにしたものです。提供された機能で外部の開発者が自発的に新しいサービスを展開するなどの相乗効果が期待されます。このページではPythonでAPI接続をする際の基本となる概念、コーディングのポイントを説明しています。
PythonでGET送信する方法
Pythonでurlへアクセスするには、Python2とPython3で違いがあるので、まず違う点を整理します。python2では、標準ライブラリのurllib2とurllibを使用します。python3では、urllibのみを使用します。
# | pytyon2 | python3 |
---|---|---|
リクエスト生成 | urllib2.Request() | urllib.request.Request() |
urlアクセス | urlib2.urlopen() | urllib.request.urlopen() |
urlエンコード | urllib.urlencode() | urllib.parse.urlencode() |
今回はPython2とPython3の両方で動作するようにコーディングしてみます。Pythonのバージョンは、標準ライブラリsysのversion_infoで確認することが出来ます。
#!/usr/bin/python
# coding: utf-8
import sys
URL = 'http://example.com/'
# バージョンにより読み込むライブラリを変更
if sys.version_info[0]==2:
import urllib2 as ulib
from urllib import urlencode
else:
import urllib.request as ulib
from urllib.parse import urlencode
# リクエストのヘッダー設定
hds = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
}
# 送信するデータ
data = {
'name':'名前'
}
# リクエストの生成
req = ulib.Request("{}?{}".format(URL,urlencode(data)),headers=hds)
# 例外用処理
try:
res = ulib.urlopen(req)
head = res.info()
body = res.read().decode('utf-8')
except ulib.URLError as e:
body = e.reason
送信するデータは、urlencode()でエンコードしてからURLに繋げて渡します。渡すデータは連想配列(辞書)または配列内にキーと値のタプルを指定します。レスポンスのヘッダーは、info()で取得できます。
PythonでPOST送信する方法
データをPOSTで送信するには、urlopen()の第二引数でデータを渡します。データはurlencode()でエンコードしてから、encode()でバイト列にして渡します。
#!/usr/bin/python
# coding: utf-8
import sys
URL = 'http://example.com/'
# バージョンにより読み込むライブラリを変更
if sys.version_info[0]==2:
import urllib2 as ulib
from urllib import urlencode
else:
import urllib.request as ulib
from urllib.parse import urlencode
# リクエストのヘッダー設定
hds = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
}
# 送信するデータ
data = {
'name':'名前'
}
# リクエストの生成
req = ulib.Request(URL,headers=hds)
# 例外用処理
try:
res = ulib.urlopen(req,urlencode(data).encode('utf-8'))
head = res.info()
body = res.read().decode('utf-8')
except ulib.URLError as e:
body = e.reason
PythonでCOOKIE送信する方法
Webサイトでログインが必要な画面などでは、クッキーと呼ばれるブラウザの管理データを送受信する必要があります。一般的に必要となるクッキーデータは、ログイン時のレスポンスヘッダーにあります。
#!/usr/bin/python
# coding: utf-8
import sys
URL = 'http://example.com/'
if sys.version_info[0]==2:
import urllib2 as ulib
from urllib import urlencode
else:
import urllib.request as ulib
from urllib.parse import urlencode
hds = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
}
data = {
'id':'value',
'pass':'value'
}
req = ulib.Request(URL,headers=hds)
# ログインとレスポンス取得
try:
res = ulib.urlopen(req,urlencode(data).encode('utf-8'))
head = res.info()
body = res.read().decode('utf-8')
except ulib.URLError as e:
body = e.reason
# リクエストのヘッダーにクッキーを設定
hds = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)',
'Cookie': head.get('Set-Cookie').replace(', ','; ')
}
req = ulib.Request(URL,headers=hds)
try:
res = ulib.urlopen(req)
head = res.info()
body = res.read().decode('utf-8')
except ulib.URLError as e:
body = e.reason
PythonでBASIC認証する方法
BASIC認証とは、Webサーバで行われるアクセス制限で、一般的に.htaccessと.htpasswdで設定を行います。ヘッダーのAuthorizationに認証情報を設定することでアクセス可能です。
認証情報のIDとパスワードは、:で繋げてBase64エンコードします。Python2では、encode('base64')でエンコード可能です。Python3では、標準ライブラリのbase64をインポートする必要があります。
#!/usr/bin/python
# coding: utf-8
import sys
# BASIC認証のURL
URL = 'http://example.com/'
# BASIC認証 ID
BASIC_ID = '***'
# BASIC認証 パスワード
BASIC_PW = '***'
auth = BASIC_ID+':'+BASIC_PW
if sys.version_info[0]==2:
import urllib2 as ulib
from urllib import urlencode
auth = auth.encode('base64')[:-1]
else:
import urllib.request as ulib
from urllib.parse import urlencode
from base64 import b64encode
auth = b64encode(auth.encode('utf-8')).decode('utf-8')
# リクエストのヘッダー設定
hds = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)',
'Authorization':'Basic ' + auth
}
req = ulib.Request(URL,headers=hds)
# 例外用処理
try:
res = ulib.urlopen(req)
head = res.info()
body = res.read().decode('utf-8')
except ulib.URLError as e:
body = e.reason