程序将提示输入位置,联系 Web 服务并检索 Web 服务的 JSON 并解析该数据,并从 JSON 中检索第一个 place_id。地点 ID 是在 Google 地图中唯一标识地点的文本标识符。 API 端点
要完成此任务,您应该使用此 API 端点,该端点具有 Google 数据的静态子集:
http://py4e-data.dr-chuck.net/json? 此 API 使用与 Google API 相同的参数(地址)。该 API 也没有速率限制,因此您可以根据需要进行多次测试。如果您访问不带参数的 URL,您会收到“无地址...”响应。
我已经完成了这项作业,但代码没有运行。每当我运行程序时,我都会出现 JSONDecodeError 。
import urllib.request, urllib.parse, urllib.error
import json
adr= 'http://py4e-data.dr-chuck.net/json?'
while True:
loca= input('Enter Location: ')
if len(loca)<1:break
url=adr + urllib.parse.urlencode({"address": loca})
print('Retrieving', url)
fha=urllib.request.urlopen(url)
data=fha.read().decode()
print('Retrieved', len(data))
jsdata=json.loads(str(data))
placeid= jsdata['results'][0]['place_id']
print('The Place ID is: ', placeid)
import urllib.error, urllib.request, urllib.parse
import json
target = 'http://py4e-data.dr-chuck.net/json?'
local = input('Enter location: ')
url = target + urllib.parse.urlencode({'address': local, 'key' : 42})
print('Retriving', url)
data = urllib.request.urlopen(url).read()
print('Retrived', len(data), 'characters')
js = json.loads(data)
print(json.dumps(js, indent = 4))
print('Place id', js['results'][0]['place_id'])
看来错误在于这需要一个额外的参数(Key)
Missing/incorrect key = parameter (it is an easy number to guess) ...
编辑:查看文档https://www.py4e.com/code3/geodata/README.txt
示例1:
http://py4e-data.dr-chuck.net/json?key=42&address=Monash+University
示例2:
http://py4e-data.dr-chuck.net/json?key=42&address=Kokshetau+Institute+of+Economics+and+Management
这是查询的最新代码
import json,ssl
import urllib.request,urllib.parse, urllib.error
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
#Stroring the given parameters
api_key = 42
serviceurl = "http://py4e-data.dr-chuck.net/json?"
# sample_address = "South Federal University"
data_address = "South Federal University"
address_wanted = data_address
#Setting the GET parameters on the URL
parameters = {"address": address_wanted, "key":api_key}
paramsurl = urllib.parse.urlencode(parameters)
#Generating the complete URL. Printing it in order to check if it's correct.
queryurl = serviceurl.strip() + paramsurl.strip()
print("DATA URL: ", queryurl)
#Obtaining and reading the data
try :
data_read = urllib.request.urlopen(queryurl , context=ctx).read()
data = data_read.decode()
# Parsing the data and looking for the field we want.
jsondata = json.loads(data)
print(jsondata)
place_id = jsondata["results"][0]["place_id"]
print("PLACE ID: ", place_id)
except:
print("Error.....")
print("-"*50)
print(data)
import json,ssl
import urllib.request,urllib.parse, urllib.error
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
#Stroring the given parameters
api_key = 42
serviceurl = "http://py4e-data.dr-chuck.net/json?"
# sample_address = "South Federal University"
data_address = "IIT KANPUR"
address_wanted = data_address
#Setting the GET parameters on the URL
parameters = {"address": address_wanted, "key":api_key}
paramsurl = urllib.parse.urlencode(parameters)
#Generating the complete URL. Printing it in order to check if it's correct.
queryurl = serviceurl.strip() + paramsurl.strip()
print("DATA URL: ", queryurl)
#Obtaining and reading the data
try :
data_read = urllib.request.urlopen(queryurl , context=ctx).read()
data = data_read.decode()
# Parsing the data and looking for the field we want.
jsondata = json.loads(data)
print(jsondata)
place_id = jsondata["results"][0]["place_id"]
print("PLACE ID: ", place_id)
except:
print("Error.....")
print("-"*50)
print(data)
DATA URL: http://py4e-data.dr-chuck.net/json?address=IIT+KANPUR&key=42
{'results': [{'access_points': [], 'address_components': [{'long_name': 'Kalyanpur', 'short_name': 'Kalyanpur', 'types': ['political', 'sublocality', 'sublocality_level_1']}, {'long_name': 'Kanpur', 'short_name': 'Kanpur', 'types': ['locality', 'political']}, {'long_name': 'Kanpur Nagar', 'short_name': 'Kanpur Nagar', 'types': ['administrative_area_level_2', 'political']}, {'long_name': 'Uttar Pradesh', 'short_name': 'UP', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'India', 'short_name': 'IN', 'types': ['country', 'political']}, {'long_name': '208016', 'short_name': '208016', 'types': ['postal_code']}], 'formatted_address': 'Kalyanpur, Kanpur, Uttar Pradesh 208016, India', 'geometry': {'location': {'lat': 26.5123388, 'lng': 80.2329}, 'location_type': 'GEOMETRIC_CENTER', 'viewport': {'northeast': {'lat': 26.5136877802915, 'lng': 80.23424898029151}, 'southwest': {'lat': 26.5109898197085, 'lng': 80.23155101970849}}}, 'place_id': 'ChIJcb6oxAE3nDkRNoTDq4Do-zo', 'plus_code': {'compound_code': 'G66M+W5 Kalyanpur, jvs tower, Kanpur, Uttar Pradesh, India', 'global_code': '7MR2G66M+W5'}, 'types': ['establishment', 'point_of_interest', 'university']}], 'status': 'OK'}
PLACE ID: ChIJcb6oxAE3nDkRNoTDq4Do-zo
# In this program you will use a GeoLocation lookup API modelled after the
# Google API to look up some universities and parse the returned data.
import ssl
import urllib.request, urllib.parse, urllib.error
import json
api_key= False
# api_key='....'
if api_key is False:
api_key=42
serviceurl= 'http://py4e-data.dr-chuck.net/json?'
else:
serviceurl='https://maps.googleapis.com/maps/api/geocode/json?'
## Ignore SSL certification
ctx=ssl.create_default_context()
ctx.check_hostname=False
ctx.verify_mode=ssl.CERT_NONE
while True:
address= input('Enter Adderss: ')
if len(address)< 1: break
contents= dict()
contents['address']=address
if api_key is not False: contents['key']=api_key
url= serviceurl+ urllib.parse.urlencode(contents)
print('Retrieving:', url)
access= urllib.request.urlopen(url, context=ctx)
data= access.read().decode()
print('Retrieved', len(data), 'characters')
## check--- working or not
try:
js= json.loads(data)
except:
None
# check if status is OK
if not js or 'status' not in js or js['status'] != 'OK':
print('========Failure To Retrieve=========')
print(data)
continue
## For proper representation
print(json.dumps(js, indent=4))
## Print various values
loc= js['results'][0]['place_id']
print('Loc', loc)
addr= js['results'][0]['formatted_address']
print('Address of', address,'is:',addr)
lati= js['results'][0]['geometry']['location']['lat']
long= js['results'][0]['geometry']['location']['lng']
print('Latitude:',lati,'\nLongitude:',long)
使用urllib打开URL并收集数据。 JSON 用于解析数据并在 JavaScript 中加载。我们将得到结果,即使用
placeid = js['results'][0]['place_id']
获取地点 id。
import urllib.request, urllib.parse, urllib.error
import json
import ssl
api_key = False
# If you have a Google Places API key, enter it here
# api_key = 'AIzaSy___IDByT70'
# https://developers.google.com/maps/documentation/geocoding/intro
if api_key is False:
api_key = 42
serviceurl = 'http://py4e-data.dr-chuck.net/json?'
else :
serviceurl = 'https://maps.googleapis.com/maps/api/geocode/json?'
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
while True:
address = input('Enter location: ')
if len(address) < 1: break
parms = dict()
parms['address'] = address
if api_key is not False: parms['key'] = api_key
url = serviceurl + urllib.parse.urlencode(parms)
print('Retrieving', url)
uh = urllib.request.urlopen(url, context=ctx)
data = uh.read().decode()
print('Retrieved', len(data), 'characters')
try:
js = json.loads(data)
except:
js = None
if not js or 'status' not in js or js['status'] != 'OK':
print('==== Failure To Retrieve ====')
print(data)
continue
placeid = js['results'][0]['place_id']
print('Place id', placeid)
您无法让程序运行的原因是因为您缺少密钥,当您运行程序时,他们会说: 缺少/不正确的键 = 参数(这是一个很容易猜到的数字)...
我想他们只是开玩笑,把它写成了 42,这在《银河系漫游指南》中就是生命的意义。
为什么运行脚本窗口关闭后我看不到结果?谢谢你