Richieste HTTP e analisi JSON in Python


202

Voglio interrogare dinamicamente Google Maps tramite l'API di Google Directions. Ad esempio, questa richiesta calcola il percorso da Chicago, IL a Los Angeles, CA tramite due waypoint a Joplin, MO e 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

Restituisce un risultato nel formato JSON .

Come posso farlo in Python? Voglio inviare una tale richiesta, ricevere il risultato e analizzarlo.

Risposte:


348

Consiglio di utilizzare la fantastica libreria di richieste :

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

Contenuto della risposta JSON: https://requests.readthedocs.io/en/master/user/quickstart/#json-response-content


2
Per me, ho dovuto fare json=paramsinvece params=paramso ho ricevuto un errore 500.
demongolem,

140

Il requestsmodulo Python si occupa sia di recuperare i dati JSON sia di decodificarli, grazie al suo decodificatore JSON incorporato. Ecco un esempio tratto dalla documentazione del modulo :

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

Quindi non è necessario dover utilizzare un modulo separato per decodificare JSON.


4
Se devi essere compatibile con le richieste 0.x (Debian wheezy), dovresti usare json.load()o json.loads()invece, come in 0.x, jsonè una proprietà piuttosto che una funzione.
nyuszika7h

2
@nyuszika Se stai usando debian, se in qualche modo possibile, usa pip per ottenere nuove librerie di Python. Non si desidera programmare con vecchie librerie Python, a meno che non vi sia un motivo importante per utilizzare ciò che Debian ha nei repository apt.
SHernandez,

@SHernandez Questo è un punto valido, ma alcuni pacchetti potrebbero dipendere dal python-requests(o python3-requests) pacchetto, quindi sarà necessario installare altrove piuttosto /usr/localche evitare di romperli. D'altra parte, quando la portabilità / compatibilità è banale, secondo me ne vale la pena.
nyuszika7h,

3
Come estrarre solo una particolare coppia nome-valore dalla risposta json 'r'?
3lokh,

1
In r.json()(dalla mia risposta) hai la risposta effettiva, decodificata JSON. Puoi accedervi come un normale list/ dict; print r.json()per vedere come appare. Oppure fai riferimento ai documenti API del servizio per cui hai effettuato la richiesta.
linkyndy,

37

requestsha un .json()metodo integrato

import requests
requests.get(url).json()

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
Grazie per il vostro aiuto, tuttavia è necessario tenere presente quanto segue: La funzione urllib.urlopen () è stata rimossa in Python 3.0 a favore di urllib2.urlopen ().
Arun,

2
Arun, sì ma non si chiama più urllib2
Corey Goldberg il

3
È urllib.requestin Python 3.
nyuszika7h

Non funziona. json.loads dà 'TypeError: l'oggetto JSON deve essere str, non' HTTPResponse '' e json.load dà 'TypeError: l'oggetto JSON deve essere str, non' bytes ''
M Hornbacher,

16

Utilizzare la libreria delle richieste, stampare piuttosto i risultati in modo da poter individuare meglio le chiavi / i valori che si desidera estrarre, quindi utilizzare nidificato per i cicli per analizzare i dati. Nell'esempio estraggo indicazioni stradali passo dopo passo.

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']

Michael, come posso avere un senso da questo una volta che ho ottenuto i dati? Come posso visualizzarlo nel formato "json" visivo classico (come quello visualizzato nel browser)? Ecco cosa ottengo nel mio terminale: [link] s13.postimg.org/3r55jajk7/terminal.png
Alexander Starbuck,

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

7

Prova questo:

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
richieste ha una sua funzione json
LilaQ,

0

Anche per la bella Json su console:

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

possibile usare discariche con rientro. (Si prega di importare JSON )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.