APIとRSSを使ってみよう

gusutabopb 執筆者 Gustavo Bezerra

ウェブからデータを取得したい場合、大きく別けて2つの方法があります:

  1. ウェブサイトが提供するAPIやRSS等のサービスを通して、ウェブサイトから情報を入手すること。
  2. 上記以外の方法。例えば、ウェブページ(HTML)を丸ごとダウンロードし、処理する(スクレイピング)

前者は無理やりデータを取得する方法であるのに対し、後者はそのサイトが事前に用意したインターフェイスを使うことでよりデータ構造化した状態で取得する方法です。本節では上記の2つの方法を説明した上で、それを実装したPythonスクリプトの例を示します。

なお、本節のスクリプトを理解するのに、以下のPythonの基礎知識を前提とします。自信がない方は事前にPythonを勉強することをオススメします。

  • Pythonの基本的なデータ構造・オブジェクト(str, list, dict, file等)とそのメソッドの使い方
  • 外部モジュールのインストール・インポートの仕方

目次

ウェブAPI

API(Application Programming Interface)とは一般的にソフトウェア同士が情報をやりとりするインターフェイスのことを指します。ウェブAPIは主にHTTPプロトコル上のリクエストに対して、特定のレスポンスを返すサービスのことを指します。
ウェブAPIには大きくわけてRESTとXML-RPCの2つのプロトコルがあります。RESTプロトコルを利用したウェブAPIではURLに必要なパラメータを入れてアクセスすると、それに応じたデータが返ってきます。しかし、TwitterのAPIのように、認証(OAuth等)が必要なAPIも多く存在し、使い方が本節の例より難しいものがあります。
ウェブAPIで利用されるデータ形式は主にJSONとXMLがあり、どちらも容易にPythonやその他のプログラミング言語で扱うことが出来ます。今回使うAPIはXML形式のレスポンスを返すものです。

RSS

RSS(Rich Site Summary)とは特定のブログ等の記事のタイトルやURL等をまとめたXMLファイルのことです。RSSリーダーに追加することでニュースのヘッドライン等を読むことができます。

クローリング・スクレイピング

HTML上のリンクを追い(クロール)、それらのHTMLをダウンロードし、ほしいデータを抽出(スクレープ)することです。詳しくはこちらを参照してください。

実装例

郵便番号API

今回は任意の郵便番号に対し、住所情報をXML形式で返してくれる、郵便番号検索APIというAPIを使います。使い方は至って簡単で、下記のようなGETリクエストを送るだけで、結果が返ってきます。

http://zip.cgis.biz/xml/zip.php?zn=1700003

例えば、試しに上記のURLをブラウザに入力すると、下記のレスポンスが返ってきます。

<ZIP_result>
<result name="ZipSearchXML"/>
<result version="1.01"/>
<result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1700003"/>
<result request_zip_num="1700003"/>
<result request_zip_version="none"/>
<result result_code="1"/>
<result result_zip_num="1700003"/>
<result result_zip_version="0"/>
<result result_values_count="1"/>
<ADDRESS_value>
    <value state_kana="トウキョウト"/>
    <value city_kana="トシマク"/>
    <value address_kana="コマゴメ"/>
    <value company_kana="none"/>  
    <value state="東京都"/>           
    <value city="豊島区"/>                
    <value address="駒込"/>                   
    <value company="none"/>                       
</ADDRESS_value>                                
</ZIP_result>

以下の実装例は、任意の郵便番号に対し、ウェブAPIからXMLを取得し、<ADDRESS_value>内の情報をPythonの辞書として格納し、都道府県+市町村+町名の形で住所を出力するものです。
使われているモジュールはurllib2,sysxmlの3つですが、いずれも標準ライブラリのものなので、インストールは不要です。

import urllib2, sys
import xml.etree.ElementTree as etree

try: zipcode = sys.argv[1]
except: zipcode = '1700003'    #デフォルト郵便番号
resp = urllib2.urlopen('http://zip.cgis.biz/xml/zip.php?zn=%s'%zipcode).read()

output = {}
tree = etree.fromstring(resp)  #ElementTreeオブジェクトの生成

for e in tree[-1]:
    output[e.attrib.keys()[0]] = e.attrib.values()[0]

print output
print output['state']+output['city']+output['address']

6行目ではレスポンスを取得し、文字列としてrespに格納しています。9行目ではrespElementTreeオブジェクトを生成しています。11-12行目ではtreeの最後の要素である<ADDRESS_value>の中の要素の属性とその値を順番にoutputという辞書に格納しています。14-15行目では結果をシェルに出力しています。

例えば、$ python xmlparse.py 5620032のようにスクリプトを実行すると、以下の出力が得られます。

{'city': u'\u7b95\u9762\u5e02', 'state_kana': u'\uff75\uff75\uff7b\uff76\uff8c', 'address_kana': u'\uff75\uff89\uff8a\uff97\uff86\uff7c', 'company': 'none', 'state': u'\u5927\u962a\u5e9c', 'company_kana': 'none', 'city_kana': u'\uff90\uff89\uff75\uff7c', 'address': u'\u5c0f\u91ce\u539f\u897f'}
大阪府箕面市小野原西

節末課題

課題1

好きなAPIから情報を取得し、処理し、なんらかの形でシェルに出力してください。レスポンスがJSON形式の場合、Python標準ライブリのjsonモジュールを使うといいでしょう。余裕があれば認証が必要なAPIにチャレンジしてください。どんなAPIを使えばいいかわからない場合は下記のサイトから選ぶといいでしょう。

課題2

好きなRSSフィードの内容を処理し、なんらかの形でシェルに出力してください。下記のフィードを使うといいでしょう。

参考文献