見出し画像

OMDb APIとwikipedia APIを使ってウェブからデータをインポートする

DataCampIntermediate Importing Data in Pythonを学習中です。

今回は②Interacting with APIs to import data from the webの内容を復習します。Open Movie Database (OMDb) APIwikipedia APIを使用します。

APIとは

APIApplication Programming Interfaceの略で、ソフトウェアアプリケーションを構築して相互作用するためのプロトコルとルーティーンのセット。

2つのソフトウェアプログラムが相互にコミュニケートすることを許す。APIを通じてデータを転送する基本形はJSON。


JSONとは

JSONJavaScript Object Notationの頭文字。notationは表記法の意味。

必ずしもFlashやJavaに頼る必要のない、リアルタイムのサーバーとブラウザーコミュニケーション。人が読める形式。

コンマで区切られた、名前と値のペアで構成される。→JSONをPythonにロードする場合、辞書に格納する。JSONのキーは常に引用符で囲まれた文字列。


ローカルディレクトリからJSONをロードする

APIを使ってウェブからダウンロードする前に、ローカルディレクトリからJSONをロードする方法を学びます。

DataCampと同じデータを用意するために、まず、'snake.json'ファイルを作成します。OMDb APIのサイトに行き、Title:snakes on a planeで検索。ちなみに邦題は『スネーク・フライト』といい、飛行機の中で毒蛇が暴れる映画のようです。なぜこの映画をDataCampは選んだんでしょう?

画像1

Responseをコピーしてテキストファイルに貼り付け、'snake.json'で保存。


画像2

jsonモジュールをインポートし、ファイルへの接続を開き、json.load()関数でJSONをロードします。typeはdictです。

画像3

キーと値を出力。


PythonでAPIに接続する

いよいよAPIに接続します。例通りに実行すると…

画像5

あれ?API keyが与えられていません??

DataCampでは書かれていませんでしたが、APIを利用するには、API Keyが必要なようです。API Keyは1000日限定で無料で利用できるみたいです。1000日…3年弱。無料期間ではかなり太っ腹。

画像6

Twitter APIとは異なり、Useは短くても大丈夫です。そしてSubmit押してすぐメールが来たので、機械処理している模様。API Keyはメールで送られてきます。

クエリ文字列は ?apikey=*******&t=hackers とします。

画像7

できました!

the social networkもこの通り!

画像8


wikipedia API

wikipedia APIを使って、pizzaのページからextractのHTMLを出力します。

画像8

pizza_extract = json_data['query']['pages']['24768']['extract']
print(pizza_extract)

wikipedia APIはAPI Keyなどなくてもできました。nested JSONなので分かりにくいですが。

URLは英語だと'https://en.wikipedia.org/w/api.php'から始まります。
action=query:操作
prop=extracts:記事の各構成要素を取得。解説(サマリー)
format=json:出力フォーマット
titles=pizza:記事のタイトル


print(type(pizza_extract))

<class 'str'>

ちなみに、どんな構造になっているのか調べてみました。

print(json_data.keys())

dict_keys(['batchcomplete', 'warnings', 'query'])

print(json_data['query'].keys())

dict_keys(['normalized', 'pages'])

print(json_data['query']['pages'].keys())

dict_keys(['24768'])

json_data['query']['pages']のキーは'24768'だけなんですね。30,000ページくらいあるのかと思った…

print(json_data['query']['pages']['24768'].keys())

dict_keys(['pageid', 'ns', 'title', 'extract'])

Python (programming language)のページでは、同じコードを実行すると、
['batchcomplete', 'warnings', 'query']
['pages']
['23862']
['pageid', 'ns', 'title', 'extract']
となりました。少しずつ違いますね。

['pages']のキーがページによって異なるので、自動化できないか試しました。json_data['query']['pages'].keys()はdict_keysで、そのままでは使いづらいのでリスト化しました。

page=list(json_data['query']['pages'].keys())[0]
pizza_extract = json_data['query']['pages'][page]['extract']
print(pizza_extract)

で抽出できました!!


ところで、pizzaのページからextractのHTMLを出力しましたが、読みづらいのでBeautifulSoupを使ってみましょう。

画像9

できました!

get_text()でテキストだけ抽出します。

画像10

かなり読みやすくなりました!


まとめると、extractのテキストを抽出する方法は

from bs4 import BeautifulSoup
import requests
title="Python (programming language)"
url='https://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles='+title
r=requests.get(url)
json_data=r.json()
page=list(json_data['query']['pages'].keys())[0]
extract = json_data['query']['pages'][page]['extract']
soup=BeautifulSoup(extract)
print(soup.get_text())

titleの部分を変えると、他のページのextractも抽出できます。


いいなと思ったら応援しよう!