PythonでのHTTPリクエストとJSON解析


202

Google Directions APIを使用してGoogleマップを動的にクエリしたい。例として、このリクエストは、ミズーリ州ジョプリンとオクラホマシティーの2つのウェイポイントを経由して、イリノイ州シカゴからカリフォルニア州ロサンゼルスへのルートを計算します。

http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false

結果はJSON形式で返されます。

Pythonでこれを行うにはどうすればよいですか?このようなリクエストを送信し、結果を受信して​​解析したいと思います。

回答:


348

私は素晴らしいリクエストライブラリを使用することをお勧めします:

import requests

url = 'http://maps.googleapis.com/maps/api/directions/json'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)

resp = requests.get(url=url, params=params)
data = resp.json() # Check the JSON Response Content documentation below

JSON応答コンテンツ:https : //requests.readthedocs.io/en/master/user/quickstart/#json-response-content


2
私にとっては、json=params代わりに行う必要があり、そうしないとparams=params500エラーが発生します。
demongolem

140

requestsPythonモジュールは、その組み込みJSONデコーダによる、JSONデータを取得し、それを復号化の両方の世話をします。これはモジュールのドキュメントから取られた例です

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

したがって、JSONのデコードに別のモジュールを使用する必要はありません。


4
リクエスト0.x(Debian wheezy)との互換性が必要な場合は、を使用するjson.load()か、json.loads()代わりに0.xのように、関数でjsonはなくプロパティを使用してください。
nyuszika7h

2
@nyuszika debianを使用している場合、可能であれば、pipを使用して新しいpythonライブラリを取得します。aptリポジトリでdebianが持っているものを使用する重要な理由がない限り、古いpythonライブラリを使用してコーディングしたくありません。
シェルナンデス2014年

@SHernandezこれは妥当な点ですが、一部のパッケージはpython-requests(またはpython3-requests)パッケージに依存している可能性がある/usr/localため、これらのパッケージの破損を避けるために、別の場所にインストールする必要があります。一方、移植性/互換性が取るに足らないものである場合、私の意見ではそれは価値があります。
nyuszika7h 14年

3
json応答 'r'から特定の名前と値のペアのみを抽出する方法
3lokh、2015年

1
r.json()(私の答えから)あなたは実際の応答、JSON-デコードを持っています。通常のlist/のようにアクセスできますdictprint r.json()それがどのように見えるかを確認します。または、リクエストしたサービスのAPIドキュメントを参照してください。
linkyndy 2015年


25
import urllib
import json

url = 'http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false'
result = json.load(urllib.urlopen(url))

3
ご協力ありがとうございます。ただし、次の点に注意してください:Python 3.0では、urllib.urlopen()関数が削除され、urllib2.urlopen()が採用されました。
アルン、2011年

2
アルン、そうですが、もはやurllib2と名付けられていません
Corey Goldberg

3
それはだurllib.requestのPython 3に
nyuszika7h

それは動作しません。json.loadsは 'TypeError:JSONオブジェクトは' HTTPResponse 'ではなくstrでなければならず、json.loadは' TypeError:JSONオブジェクトは 'bytes'ではなくstrでなければなりません
M Hornbacher

16

リクエストライブラリを使用し、結果をきれいに出力して、抽出するキー/値を見つけやすくし、ネストされたforループを使用してデータを解析します。この例では、運転ルートを段階的に抽出します。

import json, requests, pprint

url = 'http://maps.googleapis.com/maps/api/directions/json?'

params = dict(
    origin='Chicago,IL',
    destination='Los+Angeles,CA',
    waypoints='Joplin,MO|Oklahoma+City,OK',
    sensor='false'
)


data = requests.get(url=url, params=params)
binary = data.content
output = json.loads(binary)

# test to see if the request was valid
#print output['status']

# output all of the results
#pprint.pprint(output)

# step-by-step directions
for route in output['routes']:
        for leg in route['legs']:
            for step in leg['steps']:
                print step['html_instructions']

マイケル、データを取得したら、どうすればこれを理解できるでしょうか。「クラシック」jsonビジュアルフォーマット(ブラウザで取得するような)で表示するにはどうすればよいですか?これが私のターミナルで得られるものです:[link] s13.postimg.org/3r55jajk7/terminal.png
Alexander Starbuck

3
@AlexStarbuck then- import pprint>pprint.pprint(step['html_instructions'])
Michael

7

これを試して:

import requests
import json

# Goole Maps API.
link = 'http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false'

# Request data from link as 'str'
data = requests.get(link).text

# convert 'str' to Json
data = json.loads(data)

# Now you can access Json 
for i in data['routes'][0]['legs'][0]['steps']:
    lattitude = i['start_location']['lat']
    longitude = i['start_location']['lng']
    print('{}, {}'.format(lattitude, longitude))

1
リクエストには独自のjson関数があります
LilaQ 2018年

0

また、コンソールのかわいいJsonの場合:

 json.dumps(response.json(), indent=2)

インデント付きのダンプを使用できます。(jsonをインポートしてください)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.