Data Collection and Processing with Python: week3 API!!

 

The Internet: Behind the Scenes

RESTとは、REPRESENTATIONAL STATE TRANSFERの略である。もともとはもっと抽象的な意味だったが、現在では、pythonの関数のように、特定のパラメータの値を入力として受け取り、長いテキスト文字列の形で出力を生成するWebサイトの略語として使われるようになっている。

APIとは、Application Programming Interface(アプリケーション・プログラミング・インターフェース)の略です。APIは、外部のプログラム(アプリケーション・プログラム)が、あるプログラムに特定の計算を実行するよう要求する方法を規定するものである。

REST APIは、この2つを組み合わせたもので、外部プログラムがWebサイトに対してHTTPリクエストを行い、計算の実行と出力データの取得を要求するためのものである。Webサイトが他のコンピュータプログラムからの要求を受け入れ、他のプログラムが消費するための出力を生成するように設計されている場合、Webブラウザで人間が消費するための出力を生成するWebサイトとは対照的に、それはWebサービスと呼ばれることがあります。

 

Domain nameはサーバーのIPアドレスを文字列にするDomain Name Systemによって与えられたサーバーの名前。アドレスの数字表現と文字表現を翻訳するのがDNS
https://mxtoolbox.com/DNSLookup.aspx

データは適度な大きさのパケット(最大65,535バイト、通常はもっと小さい)に切り分けられる。Data is chopped up into reasonable sized packets (up to 65,535 bytes, but usually much smaller).

serverに辿り着くまでに、いくつもの(それぞれのIPアドレスを持つ)routerをhopしていく。
各パケットは独立してルーティングされ、宛先に到達するまで、あるコンピューティングデバイスから別のコンピューティングデバイスに渡されます。そのパケット転送を行うコンピューティングデバイスは、ルーターと呼ばれます。各ルーターは、ある宛先アドレス宛のパケットを受け取ったとき、そのパケットをどの隣人に渡すべきかを示すアドレステーブルを保持しています。ルーターは常に互いに、どのようにルーティングテーブルを更新すべきかについて情報を交換し合っている。このシステムは、局所的なダメージに強いように設計されています。一部のルーターが停止しても、残りのルーターが互いに連絡を取り合い、パケットを別の方法でルーティングし始めるので、パケットが目的地に到達するための経路がある場合は、その経路に到達することができます。この技術的能力が、ジョン・ギルモアの次のような比喩を生んだのです。「ネットは検閲をダメージと解釈し、それを回避する。

developertool のnetwork から、何が起きているのかわかる。

URL とargument内のpath?query parameter

../_images/internet_requests.png

URLは、ブラウザやその他のプログラムが、どのサーバーに接続し、どのページを要求するかを指定するために使用されます。A URL is used by a browser or other program to specify what server to connect to and what page to ask for.
ここでは、REST APIでよく使われる、「エンドポイント」を定義するベースURLがあり、そこにクエリパラメータとして追加情報を付加し、HTMLではなくJSONという形式でレスポンスを返すというパターンを見ていきます。その過程で、URLの構築やJSON形式のレスポンスの処理に役立つPythonモジュールの関数をいくつか見ていきます。

requestsモジュールのget(URL)メソッドでresponse objectをもらう

そしてjson.dumps()でPython Objectにして構造を見る。

 

json.dumps()できない???

よくわかりません。

 

parametersの?は辞書の開始、&は別のkey-value pairを指定する。

URL内のparametersの%20はスペースを表す?

For example, in the following, the base url is https://google.com/search. A dictionary with two parameters is passed. Thus, the whole url is that base url, plus a question mark, “?”, plus a “q=…” and a “tbm=…” separated by an “&”. In other words, the final url that is visited is https://www.google.com/search?q=%22violins+and+guitars%22&tbm=isch

 

../_images/urlexamples.png

paramsはdictionaryでなくては読み込まない。

import requests

print(“   こっちでもいける?”)
#page = requests.get(“https://api.datamuse.com/words?rel_rhy=funny”)

print(”   けどこっちもいいよ。”)
kval_pairs = {‘rel_rhy’: ‘funny’}
page = requests.get(“https://api.datamuse.com/words”,
params=kval_pairs)
print(page.text[:150]) # print the first 150 characters
print(page.url) # print the url that was fetched

#辞書の作り方の一つに dict = (k1 = v1, k2 = v2, k3 = v3)があることを思い出せ。

 

getしようとして、成功しなかったときのメッセージ HTCPCP

よくわからなんだ。

https://www.datamuse.com/api/

requestURL() function

正しい場所にアクセスできているか?

websiteの情報はCacheされたものか、それともoriginalか

そしてもうひとつ、このrequest.cachingモジュールには2つのキャッシュを実装しています。教科書の一部として提供したものと、恒久的なキャッシュ・ファイルに入れるものがあります。そして、一時的なキャッシュがあります。永久キャッシュと一時キャッシュの2つのキャッシュがあり、これは2番目の小さなデータベースと考えることができます。 これは、現在のページでコードを実行している間に保存されるもので、ページを再読み込みすると消えてしまいます。
.txtとして一時的に保管される。

casheされたデータを扱う利点

REST APIを使用したソフトウェア開発において、キャッシュが有効な理由は少なくとも4つあります。

データを提供するウェブサイトの負荷を軽減する。データを提供してくれるウェブサイトの負荷を減らすことができます。他の人のリソースを使用するときは、常に礼儀正しくありたいものです。たとえば、15分間に15回のリクエストを行うと、エラー・レスポンスが送信されるようになる場合があります。それはあなたにとって混乱であり、迷惑なことでしょう。

プログラムの実行速度が速くなる インターネット上の接続は、多くのデータを要求する場合、数秒、あるいは数十秒かかることがあります。大したことではないと思われるかもしれませんが、プログラムに変更を加えて実行し、ほとんど即座に応答が得られると、デバッグはずっと楽になります。

複雑なデータを処理するコードでは、実行するたびに戻ってくる内容が変わってしまうと、デバッグが難しくなります。iTunesのPodcastやTwitterの最新ツイートなど、リアルタイムのデータを取得するプログラムを書けるのは素晴らしいことです。しかし、特定のツイート(外国語のツイートなど)でのみ発生する問題がある場合、そのコードをデバッグするのは難しいでしょう。問題のあるデータに遭遇したときは、そのコピーを保存しておき、保存した静的なデータのコピーでプログラムのデバッグを行えるようにしておくと便利です。

データを取得するコードの自動テストも、データが絶対に変化しない方が実行しやすく、デバッグに役立つのと同じ理由です。実際、演習であなたのコードをチェックする自動テストでは、キャッシュされたデータを使用することにしています。

例えば、データがいつ変更されたかを常に知りたい場合、デフォルトではすでにキャッシュされたデータに頼ることになりますが、これは問題があります。しかし、動作するコードの開発に取り組んでいる場合、キャッシュはトレードオフの価値があります。

コメント