Python Google Places API

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Hallo,

ich bin ein kompletter Neuling in Programmieren und Python. Nun folgendes, ich probiere mich ein wenig mit der Places API von Google aus. ich habe folgendes geschrieben:

Code: Alles auswählen

from CredentialsGoogle import APIKey
import googlemaps
import urllib
import json


gmaps = googlemaps.Client(key = APIKey)

search = "Handwerker Berlin"
input = "input="+search           
inputtype = "inputtype=textquerry"
fields = "fields=formatted_address,name,rating"

json1 = "json?"+input+"&"+inputtype+"&"+fields

find_places = "https://maps.googleapis.com/maps/api/place/findplacefromtext/"+json1+"&key="+APIKey

request = urllib.request.urlopen(find_places)

print(json.load(request))
Nun gibt er mir folgendes aus:

{'candidates': [], 'status': 'INVALID_REQUEST'}

Frage ist WARUM?

Und könnt ihr mir eine gute PDF schicken wo der Umgang mit googlemaps mod und allgemein APIs erklärt wird? (Befehle, usw.)

Ich danke vielmals,

Illy
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sehe einen Rechtschreibfehler in deinem Code. Der könnte dafür verantwortlich sein. Ansonsten ist etwas befremdlich, dass du zwar einen Google Maps Client erzeugst, den aber dann gar nicht benutzt. Warum nicht? Und die Dokumentation des googlemaps-Moduls solltest du mal lesen. Ob das ein PDF ist kann ich dir nicht sagen.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Ja weil ich das Prinzip des Clients nicht vertanden habe, woher weiß man welche commands da gültig sind und nicht? Und wie heißen denn die ganzen Codes?

Und ich habe keine Dokumentation des Googlemap-Moduls gefunden.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Google will das Zeug ja verkaufen. Dementsprechend ist die Dokumentation sehr gut. Einfach mal lesen: https://developers.google.com/places/web-service/search
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Übrigens lag es auch an dem Rechtschreibfehler.

@Sirius: Ja schon, aber ich weiß nicht wo ich die googlemaps-modul befehle da entnehmen soll, wie gesagt, ich bin ein kompletter newby
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Meine Frage ist: wie funktioniert das gmaps.Client? Was macht das? Woher weiß ich, dass zum Beispiel ein command gmaps.places_nearby heißt?(habs in einem video gesehn)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Schau dir das mal an, vielleicht wirst du dort fündig.

https://github.com/googlemaps/google-ma ... ces-python
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@illy1: Auf die schnelle habe ich keine fertig generierte Dokumentation gefunden, aber die Module scheinen dokumentiert zu sein. Also entweder in den Quelltext schauen und in einer interaktiven Shell untersuchen und/oder für sich selbst die Dokumentation generieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem man in dessen Repository https://github.com/googlemaps/google-ma ... ces-python mal in die Beispiele schaut. Ich nehme desweiteren mal an, dass die "einfach" bestehende API-Calls wie sie in der offiziellen Dokumentation auftauchen abbilden. Also systematisch Namen und Parameter zu aufrufen machen. Das ist aber nur eine Vermutung.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Die Beispiele habe ich mir schon angeschaut, aber nun mache ich die API suche mit den Json Links. Nun folgendes Problem:

Code: Alles auswählen

from CredentialsGoogle import APIKey
import googlemaps
import urllib
import json



search = input("Bitte Stichwort für Ortssuche eingeben: ")
query= "query="+search
find_places = "https://maps.googleapis.com/maps/api/place/textsearch/json?"+query+"&key="+APIKey
url_json = urllib.request.urlopen(find_places)
jsonf = json.load(url_json)
for places in jsonf['results']:
    place_id = places['place_id']
    details = "https://maps.googleapis.com/maps/api/place/details/json?place_id="+place_id+"&fields=name,formatted_address,rating,formatted_phone_number&key="+APIKey
    url_json2 = urllib.request.urlopen(details)
    jsondetails = json.load(url_json2)
    for field in jsondetails['result']:
        place_name = field['name']
        place_address = field['formatted_address']
        place_phone = field['formatted_phone_number']
        print(place_name+" "+place_address+" "+place_phone)
        
        
Nur macht das Program nicht das was es machen soll und gibt mir einen Fehler aus, nämlich dass "field" nicht definiert sei(zumindest keine liste enthalte).
Da habe ich beim Debugger geschaut und tatsächlich, field ist nur mit einem String aus der Liste "result" des Json-Files definiet. Kann mir jemanden bitte erklären warum?

Bild

Wäre sehr cool, ich danke euch :)

MfG,

Illy
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@illy1: Auf dem Bild ist ein Syntaxfehler in der IDE zu sehen. Oder zumindest war da mal einer? Warum zeigst Du dieses Bild?

Die `field` ist halt nicht das was Du denkst was es ist. Was ist ``jsondetails["result"]`` für ein Datentyp? Und was bedeutet es da mit einer ``for``-Schleife drüber zu laufen — an was wird `field` da gebunden? Offensichtlich an etwas anderes als Du denkst. Das sind Grundlagen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

jsondetails['results'] soll von der json datei, die bei "details" erstellt wird, die Werte unter "result" herausnehmen. Die for Schleife ist dazu da, dass diese Werte in einen directory an field übermittelt werden, im Prinzip also nur eine Wiederholung von Zeile 18.

Er soll mir die Werte von field herausgeben, die ich in den darauffolgenden Zeilen beschrieben habe.(Phonenumber usw)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das war nicht die Frage. Die Frage ist, welchen TYP jsondetails["result"] hat. Kleiner Tipp: es ist keine Liste, und kein String. Und keine Nummer. Bleibt nicht mehr so viel uebrig. Und wenn man ueber ein Objekt dieses mysterioesen Typens iteriert, wie du es tust, dann bekommt man dessen Schluessel. Wenn man die Werte haben will, muss man noch was anderes machen.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Nun es ist ein Dict? Und könntest du mir erklären was genau ich da machen soll? :D Thx
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@illy1: Das ist aber keine Wiederholung von Zeile 18 weil ``jsonf["result"]`` und ``jsondetails["result"]`` nicht den gleichen Typ haben und deshalb auch nicht gleich behandelt werden können. ``for item in container:`` kann je nach Typ eine andere Bedeutung haben.

In Zeile 18 das `places` sollte vielleicht besser `place` heissen, denn das repräsentiert ja nur *einen* Ort in jedem Schleifendurchlauf.

Und bei `field` wäre interessant wie Du auf *den* Namen gekommen bist und was Du denkst wie der denn auszusehen hat. Das macht doch überhaupt gar keinen Sinn anzunehmen dass das so funktionieren könnte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

@_blackjack_

Ahsooo ok, naja wie gesagt, ich habe einfach absolut keine Ahnung, bin einfach der größter Quereinsteiger überhaupt :D

und ja mit place hast du recht :D

Bei field dachte ich dass er mir die Werte der "Fields" innerhalb des Result Directorys wiedergibt, deshalb habe ichd as field genannt :D
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@illy1: Aber was sind denn dann ”Fields”? Du behandelst es ja dann als wäre es wieder das komplette Wörterbuch, und das in einer Schleife, das macht alles gar keinen Sinn.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Fields sind die Keys in den Directorys, ich habe das einfach fields gannt, weil es in meinem Kopf einfach ist ein Feld zu merken als ein Key xD

Aber das Hauptproblem ist noch, warum erkennt er das jsondetails, was die Google Place Details API sein soll, nicht als ein Directory?
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Zumal auch in der API-URL selbst, sind diese Keys als Fields gekennzeichnet:

Code: Alles auswählen

"https://maps.googleapis.com/maps/api/place/details/json?place_id="+place_id+"&fields=name,formatted_address,rating,formatted_phone_number&key="+APIKey"
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

__blackjack__ hat geschrieben: Dienstag 22. Oktober 2019, 18:06 @illy1: Aber was sind denn dann ”Fields”? Du behandelst es ja dann als wäre es wieder das komplette Wörterbuch, und das in einer Schleife, das macht alles gar keinen Sinn.
Aber wieso nicht?

Ich möchte ja nur, dass er so wie in Zeile 18 das selbe Prinzip mit einer anderen URL wiederholt.
Antworten