ソースコードで学ぶWebプログラミング

[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