執筆者 Gustavo Bezerra
ウェブからデータを取得したい場合、大きく別けて2つの方法があります:
前者は無理やりデータを取得する方法であるのに対し、後者はそのサイトが事前に用意したインターフェイスを使うことでよりデータ構造化した状態で取得する方法です。本節では上記の2つの方法を説明した上で、それを実装したPythonスクリプトの例を示します。
なお、本節のスクリプトを理解するのに、以下のPythonの基礎知識を前提とします。自信がない方は事前にPythonを勉強することをオススメします。
目次
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(Rich Site Summary)とは特定のブログ等の記事のタイトルやURL等をまとめたXMLファイルのことです。RSSリーダーに追加することでニュースのヘッドライン等を読むことができます。
HTML上のリンクを追い(クロール)、それらのHTMLをダウンロードし、ほしいデータを抽出(スクレープ)することです。詳しくはこちらを参照してください。
今回は任意の郵便番号に対し、住所情報を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
,sys
とxml
の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行目ではresp
でElementTree
オブジェクトを生成しています。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'} 大阪府箕面市小野原西
好きなAPIから情報を取得し、処理し、なんらかの形でシェルに出力してください。レスポンスがJSON形式の場合、Python標準ライブリのjson
モジュールを使うといいでしょう。余裕があれば認証が必要なAPIにチャレンジしてください。どんなAPIを使えばいいかわからない場合は下記のサイトから選ぶといいでしょう。
好きなRSSフィードの内容を処理し、なんらかの形でシェルに出力してください。下記のフィードを使うといいでしょう。