파이썬에서 HTTP 요청과 JSON 파싱


202

Google Directions API를 통해 Google지도를 동적으로 쿼리하고 싶습니다. 예를 들어,이 요청은 MO, Joplin, 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

JSON 형식으로 결과 반환 합니다 .

파이썬에서 어떻게 할 수 있습니까? 그런 요청을 보내고 결과를 받아 파싱하고 싶습니다.

답변:


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=params하거나 500 오류가 발생합니다.
demongolem

140

requests파이썬 모듈을 담당 모두 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 (데비안 위지)와 호환해야 할 경우 사용한다 json.load()또는 json.loads()대신 0.x 같이 json속성보다는 기능입니다.
nyuszika7h

2
@nyuszika 만약 데비안을 사용한다면 가능하다면 pip를 사용하여 최신 파이썬 라이브러리를 얻으십시오. apt 저장소에 데비안이 가지고있는 것을 사용해야하는 중요한 이유가 없다면 오래된 파이썬 라이브러리로 코딩하고 싶지 않습니다.
셰넌 데즈

@SHernandez 이것은 유효하지만 일부 패키지는 python-requests(또는 python3-requests) 패키지 에 의존 할 수 있으므로 /usr/local해당 패키지가 손상되지 않도록 다른 곳에 설치해야 합니다. 다른 한편으로, 이식성 / 호환성이 사소한 경우, 제 생각에는 그만한 가치가 있습니다.
nyuszika7 시간

3
json 응답 'r'에서 특정 이름 값 쌍만 추출하는 방법은 무엇입니까?
3lokh

1
에서 r.json()(내 대답에서) 당신이 실제 응답이, JSON은-디코딩. 당신은 일반적인 list/ 처럼 접근 할 수 있습니다 dict; print r.json()어떻게 생겼는지 볼 수 있습니다. 또는 요청한 서비스의 API 문서를 참조하십시오.
linkyndy


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
도움을 주셔서 감사하지만 다음 사항에 유의하십시오. urllib.urlopen () 함수는 urllib2.urlopen ()을 위해 Python 3.0에서 제거되었습니다.
Arun

2
아룬은, 그래 있지만 더 이상 urllib2가 이름이없는 것
코리 골드버그를

3
그것은 urllib.request파이썬 3에 있습니다.
nyuszika7h

작동하지 않습니다. json.loads는 'TypeError : JSON 객체는'HTTPResponse '가 아닌 str이어야하고 json.load는'TypeError : JSON 객체는 '바이트'가 아닌 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 비주얼 형식 (브라우저에있는 것과 같은)으로 어떻게 표시합니까? [링크] : 여기가 내 터미널에서 무엇을 얻을 s13.postimg.org/3r55jajk7/terminal.png
알렉산더 스타 벅스를

3
@AlexStarbuck 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

0

또한 콘솔의 예쁜 Json의 경우 :

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

들여 쓰기로 덤프를 사용할 수 있습니다. ( json을 가져 오십시오 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.