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.