পাইথনে HTTP অনুরোধ এবং JSON পার্সিং


202

আমি Google দিকনির্দেশনা API এর মাধ্যমে Google মানচিত্রকে গতিশীলভাবে জিজ্ঞাসা করতে চাই। উদাহরণস্বরূপ, এই অনুরোধটি শিকাগো, আইএল থেকে লস অ্যাঞ্জেলেস, সিটি জোপলিন, এমও এবং ওকলাহোমা সিটির দুটি ওয়ে পয়েন্টগুলির মাধ্যমে গণনা করে ঠিক আছে:

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

জেএসওএন প্রতিক্রিয়া সামগ্রী: https://requosts.readthedocs.io/en/master/user/quickstart/#json-response- কনটেন্ট


2
আমার জন্য, এর json=paramsপরিবর্তে আমাকে করা params=paramsবা আমার 500 টি ত্রুটি পাওয়া উচিত।
ডেমোঙ্গোলেম

140

requestsপাইথন মডিউল যত্ন নেয় উভয় JSON তথ্য পুনরুদ্ধারের এবং এটি ডিকোডিং, তার builtin তাদেরকে JSON ডিকোডার কারণে। এখানে মডিউলটির ডকুমেন্টেশন থেকে নেওয়া একটি উদাহরণ রয়েছে :

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

সুতরাং জেএসএন ডিকোডিংয়ের জন্য কিছু আলাদা মডিউল ব্যবহার করার কোনও সুবিধা নেই।


4
আপনার যদি অনুরোধ 0.x (দেবিয়ান হুইজি) এর সাথে সামঞ্জস্যপূর্ণ হওয়ার দরকার হয় তবে আপনার ব্যবহার করা উচিত json.load()বা json.loads()পরিবর্তে, 0.x হিসাবে, jsonএটি কোনও ফাংশনের পরিবর্তে সম্পত্তি।
nyuszika7h

2
@nyuszika আপনি যদি ডেবিয়ান ব্যবহার করেন তবে যদি কোনওভাবে সম্ভব হয় তবে নতুন পাইথন লাইব্রেরিগুলি পেতে পাইপ ব্যবহার করুন। আপনি পুরানো অজগর লাইব্রেরি সহ কোড করতে চান না, যদি না এপিটি সংগ্রহস্থলগুলিতে ডেবিয়ানের কী আছে তা ব্যবহারের গুরুত্বপূর্ণ কারণ না থাকে।
শেরনান্দেজ

@ শেরনান্দেজ এটি একটি বৈধ পয়েন্ট, তবে কিছু প্যাকেজগুলি python-requests(বা python3-requests) প্যাকেজের উপর নির্ভর করতে পারে , সুতরাং আপনাকে /usr/localএই প্যাকেজগুলি না ভাঙার পরিবর্তে অন্য কোথাও ইনস্টল করা প্রয়োজন । অন্যদিকে, যখন বহনযোগ্যতা / সামঞ্জস্যতা তুচ্ছ হয়, আমার মতে এটি মূল্যবান।
nyuszika7h

3
জসন প্রতিক্রিয়া 'আর' থেকে কীভাবে কেবলমাত্র একটি নির্দিষ্ট নাম-মান জুটি বের করতে হয়?
3lokh

1
ইন r.json()(আমার উত্তর থেকে) আপনার আসল প্রতিক্রিয়া রয়েছে, জেএসএন-ডিকোড হয়েছে। আপনি এটি সাধারণ list/ এর মতো অ্যাক্সেস করতে পারেন dict; print r.json()দেখতে কেমন লাগে তা দেখতে। অথবা আপনি যে পরিষেবার জন্য অনুরোধ করেছেন সেটির API ডক্স উল্লেখ করুন।
linkyndy

37

requestsঅন্তর্নির্মিত .json()পদ্ধতি আছে

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
আপনার সহায়তার জন্য ধন্যবাদ, তবে নিম্নলিখিতটি লক্ষণীয়: urllib.urlopen () ফাংশনটি urllib2.urlopen () এর পক্ষে পাইথন 3.0 এ সরানো হয়েছে।
অরুণ

2
অরুণ, হ্যাঁ তবে এর আর নাম নেই urlib2
কোরি গোল্ডবার্গ

3
এটি urllib.requestপাইথন ৩.
nyuszika7

এটা কাজ করে না. json.loads 'TypeError দেয়: JSON অবজেক্টটি অবশ্যই' HTTPResponse 'নয় এবং json.load অবশ্যই' TypeError 'দিতে পারে: JSON অবজেক্টটি অবশ্যই অবশ্যই' বাইটস 'নয়
এম হর্নব্যাকার

16

অনুরোধের গ্রন্থাগারটি ব্যবহার করুন, ফলাফলগুলি মুদ্রণ করুন যাতে আপনি কীগুলি / মানগুলি বের করতে চান তা আরও ভালভাবে সনাক্ত করতে পারেন এবং তারপরে ডেটা পার্স করার জন্য লুপগুলির জন্য নেস্টেড ব্যবহার করুন। উদাহরণস্বরূপ আমি ধাপে ধাপে ড্রাইভিংয়ের দিকগুলি বের করি।

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

মাইকেল, আমি যখন ডেটা পেয়েছি তখন আমি কীভাবে এটি থেকে কিছুটা বোঝাতে পারি? আমি কীভাবে এটি "ক্লাসিক" জসন ভিজ্যুয়াল ফর্ম্যাটে (আপনার ব্রাউজারে যেমন পেয়েছেন তার মতো) প্রদর্শন করব? আমি আমার টার্মিনালে যা পাই তা এখানে: [লিঙ্ক] s13.postimg.org/3r55jajk7/terminal.png
আলেকজান্ডার স্টারবাক

3
@ অ্যালেক্স স্টারবাক এর import pprintপরে ->pprint.pprint(step['html_instructions'])
মাইকেল 14

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
অনুরোধগুলির নিজস্ব
জসন

0

কনসোলে সুন্দর জসনের জন্যও:

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

ইনডেন্ট সহ ডাম্প ব্যবহার সম্ভব। (দয়া করে জেসন আমদানি করুন )

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.