Python'da HTTP istekleri ve JSON ayrıştırma


202

Google Haritalar'ı Google Yol Tarifi API'sı aracılığıyla dinamik olarak sorgulamak istiyorum. Örnek olarak, bu istek Chicago, IL'den Los Angeles, CA'ya giden yolu Joplin, MO ve Oklahoma City, OK'deki iki geçiş noktası üzerinden hesaplar:

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

JSON biçiminde bir sonuç döndürür .

Bunu Python'da nasıl yapabilirim? Böyle bir istek göndermek, sonucu almak ve ayrıştırmak istiyorum.

Yanıtlar:


349

Müthiş istek kütüphanesini kullanmanızı tavsiye ederim :

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 Yanıt İçeriği: https://requests.readthedocs.io/en/master/user/quickstart/#json-response-content


2
Benim için json=paramsyerine yapmam gerekiyordu params=paramsya da 500 hatası alıyorum.
demongolem

140

requestsPithon ilgilenir iki JSON veri alma ve nedeniyle yerleşik JSON dekodere, bu dekode edilmesi. Modülün belgelerinden alınan bir örnek :

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

Yani JSON kodunu çözmek için ayrı bir modül kullanmak zorunda değilsiniz.


4
0.x (Debian wheezy) istekleriyle uyumlu olmanız gerekiyorsa, json.load()veya json.loads()0.x gibi jsonbir işlev yerine bir özelliktir.
nyuszika7h

2
@nyuszika Eğer debian kullanıyorsanız, mümkünse daha yeni python kitaplıkları almak için pip kullanın. Apt depolarında debian'ın ne olduğunu kullanmak için önemli bir neden olmadığı sürece, eski python kitaplıklarıyla kodlamak istemezsiniz.
SHernandez

@SHernandez Bu geçerli bir nokta, ancak bazı paketler python-requests(veya python3-requests) pakete bağlı olabilir , bu yüzden bu paketleri kırmamak için başka bir yere kurmanız gerekir /usr/local. Öte yandan, taşınabilirlik / uyumluluk önemsiz olduğunda, bence buna değer.
nyuszika7h

3
Json cevabından sadece belirli bir isim-değer çifti nasıl çıkarılır?
3lokh

1
In r.json()(cevabım) gerçek yanıtı var JSON deşifre. Normal list/ gibi erişebilirsiniz dict; print r.json()nasıl göründüğünü görmek için. Veya istekte bulunduğunuz hizmetin API dokümanlarına bakın.
linkyndy

37

requestsyerleşik .json()yöntemi vardır

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
Yardımınız için teşekkürler, ancak aşağıdakilere dikkat edilmelidir: urllib.urlopen () işlevi urllib2.urlopen () lehine Python 3.0'da kaldırılmıştır.
Arun

2
Arun, evet ama artık urllib2 olarak adlandırılmıyor
Corey Goldberg

3
Bu var urllib.requestPython 3'te
nyuszika7h

İşe yaramıyor. json.loads 'TypeError: JSON nesnesi str olmalı, değil 'verir HTTPResponse'' ve json.load verir 'TypeError: değil' 'bayt' JSON nesnesi str olmalıdır
M Hornbacher

16

İstekler kitaplığını kullanın, ayıklamak istediğiniz anahtarları / değerleri daha iyi bulabilmek için sonuçları güzel yazdırın ve ardından verileri ayrıştırmak için döngüler için iç içe kullanın. Örnekte adım adım yol tariflerini çıkarıyorum.

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, verileri aldıktan sonra bundan nasıl bir anlam çıkarabilirim? Nasıl "klasik" json görsel biçiminde (tarayıcınızda aldığınız gibi) gösterebilirim? Terminalime şu şekilde ulaşabilirsiniz: [link] s13.postimg.org/3r55jajk7/terminal.png
Alexander Starbuck

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

7

Bunu dene:

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
istekleri kendi json işlevi vardır
LilaQ

0

Ayrıca konsoldaki güzel Json için:

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

girintili çöplükleri kullanmak mümkün. (Lütfen json'u içe aktarın )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.