Как получить адреса из набора данных, имеющих координаты, используя Google API? - PullRequest
0 голосов
/ 06 октября 2018

Набор данных имеет 9975 широт и долгот.Я хочу извлечь адреса.Я написал следующий код:

import numpy as np
from bs4 import BeautifulSoup
import urllib.request
import json

coordinates=coordinates.as_matrix()
address=[]
for i in range(len(coordinates)):
    qpage = 'https://maps.googleapis.com/maps/api/js/GeocodeService.Search?5m2&1d'+str(coordinates[i][0])+'&2d'+str(coordinates[i][1])+'&7sUS&9sen&callback=_xdc_._jhwtgt&key=MY_API_KEY&token=53066'
    page = urllib.request.urlopen(qpage)
    data = page.read().decode('utf-8').replace('(','[').replace(')',']')
    data=data[34:]
    js = json.loads(data)
    address.append(js[0]['results'][1]['formatted_address'])

Я получаю ошибку:

HTTPError Traceback (последний последний вызов) в () 8 для i в диапазоне (len(координаты): 9 qpage = 'https://maps.googleapis.com/maps/api/js/GeocodeService.Search?5m2&1d'+str(coordinates[i][0])+'&2d'+str(coordinates[i][1])+'&7sUS&9sen&callback=xdc._jhwtgt&key=MY_API_KEY&token=53066' ---> 10 page = urllib.request.urlopen (qpage) 11 data = page.read (). decode (' utf-8 '). replace ('(', '['). replace (')', ']') 12 data = data [34:]

c: \ users \ anish \ appdata \ local \ Programs \ python \ python36 \lib \ urllib \ request.py в urlopen (url, data, timeout, cafile, capath, cadefault, context) 221 else: 222 opener = _opener -> 223 return opener.open (url, data, timeout) 224 225 def install_opener(opener):

c: \ users \ anish \ appdata \ local \ Programs \ python \ python36 \ lib \ urllib \ request.py в open (self, fullurl, data, timeout) 530 для процессора в self.process_response.get (protocol, []): 531 meth = getattr (процессор, meth_name) -> 532 response = meth (req, response) 533 534 return response

c: \ users \ anish \ appdata\ local \ Programs \ python \ python36 \ lib \ urllib \ request.py в http_response (self, request, response) 640, если нет (200 <= код <300): 641 response = self.parent.error (-> 642 'http', запрос, ответ, код, msg, hdrs) 643 644 returnответ

c: \ users \ anish \ appdata \ local \ Programs \ python \ python36 \ lib \ urllib \ request.py по ошибке (self, proto, * args) 568, если http_err: 569 args = (dict, 'default', 'http_error_default') + orig_args -> 570 return self._call_chain (* args) 571 572 # XXX, вероятно, также хочет абстрактную фабрику, которая знает, когда она делает

c: \ users \ anish\ appdata \ local \ Programs \ python \ python36 \ lib \ urllib \ request.py в _call_chain (self, chain, kind, meth_name, * args) 502 для обработчика в обработчиках: 503 func = getattr (обработчик, meth_name) ->504 результат = func (* аргументы) 505, если результат не равен None: 506 результат возврата

c: \ users \ anish \ appdata \ local \ Programs \ python \ python36 \ lib \ urllib \ request.py в http_error_default(self, req, fp, code, msg, hdrs) 648 класс HTTPDefaultErrorHandler (BaseHandler): 649 def http_error_default (self, req, fp, code, msg, hdrs): -> 650 повысить HTTPError (req.full_url, code, msg, hdrs, fp) 651 652 класс HTTPRedirectHandler (BaseHandler):

HTTPError: Ошибка HTTP 403: запрещено

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 октября 2018

Используемый вами URL

'https://maps.googleapis.com/maps/api/js/GeocodeService.Search?5m2&1d'+str(coordinates[i][0])+'&2d'+str(coordinates[i][1])+'&7sUS&9sen&callback=_xdc_._jhwtgt&key=YOUR_API_KEY&token=53066'

это внутренний вызов службы геокодирования из JavaScript API Карт Google.Вы не должны использовать внутренние URL-адреса, использовать официальные вызовы веб-службы.

Ознакомьтесь с документацией Geocoding API и замените URL-адрес документированным обратным URL-адресом геокодирования:

'https://maps.googleapis.com/maps/api/geocode/json?latlng='+str(coordinates[i][0])+'%2C'+str(coordinates[i][1])+'&key=YOUR_API_KEY.

Я полагаю, что вы получаете ошибку 403, поскольку токен в вашем запросе истек.Этот токен создается API JavaScript JavaScript, поэтому для решения проблемы следует использовать вызов веб-службы.

Имейте в виду, что количество веб-служб ограничено 50 запросами в секунду.

Кроме тогоЯ бы посоветовал взглянуть на Python Client для Google Maps Services .С помощью этой библиотеки вы можете легко изменить геокодирование ваших координат

import googlemaps

coordinates=coordinates.as_matrix()
gmaps = googlemaps.Client(key='YOUR_API_KEY')

for i in range(len(coordinates)):
    reverse_geocode_result = gmaps.reverse_geocode((coordinates[i][0], coordinates[i][1]))

Надеюсь, это поможет!

...