HTTP-forespørgsler og JSON-parsing i Python

Jeg ønsker at forespørge dynamisk på Google Maps via Google Directions API. Som eksempel beregner denne anmodning ruten fra Chicago, IL til Los Angeles, CA via to waypoints i Joplin, MO og Oklahoma City, OK:

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

Det returnerer et resultat i JSON-format.

Hvordan kan jeg gøre dette i Python? Jeg vil sende en sådan anmodning, modtage resultatet og analysere det.

Løsning

Jeg anbefaler, at du bruger det fantastiske requests bibliotek:

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 Response Content: http://docs.python-requests.org/en/latest/user/quickstart/#json-response-content

Kommentarer (1)
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))
Kommentarer (4)

Brug requests-biblioteket, udskriv resultaterne ret fint, så du bedre kan finde de nøgler/værdier, du ønsker at udtrække, og brug derefter indlejrede for-løkker til at analysere dataene. I eksemplet udtrækker jeg trin for trin kørselsvejledning.

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']
Kommentarer (2)