Request mehrmals durchführen, wie for Schleife benutzen?

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.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen,

ich führe derzeit mein erstes Projekt mit Python durch, bin daher noch ein blutiger Anfänger was das Programmieren angeht. Hoffe, ihr könnt mir trotzdem helfen:)

Ich habe via import requests ein Request durchgeführt, was auch problemlos funktioniert hat (siehe unten) . Aber ich frage mich, wie ich es coden muss, das der Request z.B. 20 mal hintereinander durchgeführt/ausgeführt wird.

Ich nehme stark an, das ich hierfür die for Schleife benutzen muss, allerdings komme ich auf keine vernünftige Lösung.

Könnt ihr mir diesbezüglich weiter helfen. Danke für euer Feedback

Code: Alles auswählen

>>> import requests
>>> r = requests.get("http://Beispiel")
>>> r.content
b'[{"debuggerLink":"http://Beispielresponse}]'
BlackJack

@SeriousRuffy: Du musst halt eine ``for``-Schleife schreiben die 20 mal durchlaufen wird. Welches Tutorial verwendest Du denn zum lernen wo *nicht* irgendwo bei der ``for``-Schleife auch `xrange()` (Python 2) oder `range()` (Python 3) gezeigt wird?
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

BlackJack hat geschrieben:@SeriousRuffy: Du musst halt eine ``for``-Schleife schreiben die 20 mal durchlaufen wird. Welches Tutorial verwendest Du denn zum lernen wo *nicht* irgendwo bei der ``for``-Schleife auch `xrange()` (Python 2) oder `range()` (Python 3) gezeigt wird?
Danke für dein Feedback Black Jack. Ehrlich gesagt, googele ich mich quasi durch.

Ich habe es auch bereits mit range() ausprobiert, leider macht es nicht was ich will;) Ich bekomme quasi die Zahlen von 1-20 wieder

habe eingegeben:

Code: Alles auswählen

>>> import requests
>>> r = requests.get("http://Beispiel")
>>> r.content
b'[{"debuggerLink":"http://Beispielresponse}]'
>>> for r in range(20):
            print(r)
1
2
3
4
u.s.w
Kannst du mir diesbezüglich weiter helfen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du bindest r in der for-Schleife ja auch bei jedem Durchlauf an einen neuen Wert. Dein r, welches du dir via requests.get() geholt hast ist damit unerreichbar geworden. Mal abgesehen davon ist die von dir gezeigte Ausgabe merkwürdig. Eigentlich müsstest du Werte von 0-19 erhalten, nicht Werte von 1-20.

Wirf mal einen Blick ins offizielle Tutorial statt dir bei Bedarf Code-Fragmente via Suchmaschine zusammenzuklauben.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo /me,

danke für dein Feedback und deine Tipps.

Hier nochmal der richtige Code:

Code: Alles auswählen

>>> import requests
>>> r = requests.get("http://Beispiel")
>>> r.content
b'[{"debuggerLink":"http://Beispielresponse}]'
>>> for r in range(20):
            print(r)

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Habe mich mit den Tutorial auseinander gesetzt, bin leider nicht schlauer geworden. Deshalb habe ich angefangen zu googlen.

Kannst du mir eventuell ein Tipp geben, wie ich am besten vorgehe? Stehe grad echt auf den Schlauch
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

SeriousRuffy hat geschrieben:Habe mich mit den Tutorial auseinander gesetzt, bin leider nicht schlauer geworden.
Sich mit dem Tutorial "auseinandersetzen" ist etwas wenig, das musst du schon gründlich durcharbeiten. Alle Beispiele ausprobieren, die Beispiele erweitern und selbst etwas experimentieren. Das wird schon ein paar Tage dauern. Wenn du das Wissen aus dem Tutorial nicht drauf hast, dann wirst du nicht weit kommen. Mit Raten wird das nichts. Wer Texte schreiben will, der muss Wörter kennen. Du hast aber noch nicht alle Buchstaben drauf ;-)
Das Leben ist wie ein Tennisball.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Dann werde ich es gründlich durcharbeiten und hoffe, das ich es danach lösen kann. Werde es euch wissen lassen:)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

SeriousRuffy hat geschrieben:Habe mich mit den Tutorial auseinander gesetzt, bin leider nicht schlauer geworden.
Das Tutorial kann man nicht einfach kurz lesend überfliegen und damit automatisch verstehen. Experimentiere mit den Beispielen dort.

Schau dir mal folgenden Code an.

Code: Alles auswählen

x = 'Hallo'
for x in range(5):
    pass
Wenn du jetzt x ausgibst, welchen Wert würdest du dann erwarten? 'Hallo'? Das kann es nicht sein, da x in der for-Schleife dauernd an einen neuen Wert gebunden wird und zwar der Reihe nach von 0 bis 4. x hat also nach Ausführung des Codes den Wert 4. Jetzt übertrage das mal gedanklich auf deinen Code. Das r, das du mit dem Aufruf von requests.get() füllst, wird durch die Zuweisung in der Schleife direkt wieder weggeworfen und der Reihe nach mit den Werten von 0 bis 19 belegt.

Jetzt kommt man natürlich darauf, dass man unterschiedliche (und sinnvolle) Namen verwenden sollte.

Code: Alles auswählen

request_result = requests.get("http://www.example.com")
for loop in range(20):
    print(request_result.content)
Jetzt wird 20 Mal hintereinander der gleiche Text ausgegeben. Deine Beschreibung klang allerdings so, als wolltest du in der Schleife den Wert aktualisieren. In dem Fall muss dann natürlich auch der Aufruf von requests.get in der Schleife durchgeführt werden.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Vielen Dank für dein Feedback!!!
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Hallo zusammen,

bin mittlerweile weitergekommen, allerdings hake ich bei einem Schritt.

Ich habe nun ein Counter eingefügt weil ich wissen will, wieviel mal der gewünschte Wert nicht gefunden wurde.

Im Beispiel unten wurde dreimal was gefunden, d.h. der Counter sollte mir am Ende eigentlich darstellen : Anzahl: 0


Leider weiß ich nicht, was ich genau falsch mache. Könnt ihr mir weiter helfen?

Code: Alles auswählen

import requests
counter = {"empty": 0};
for r in range(3):
	r = requests.get("http://blabla")
	response = r.json()
	Hallo = response[0]["List"][0].get("ID")
	print(Hallo)
	if not Hallo:
		current_counter = counter['empty'];
		current_counter +1;
		counter['empty'] = current_counter;
		print("Anzahl:", counter['empty'])

		
626
626
626


BlackJack

@SeriousRuffy: Du gibst den Zähler ja nur aus wenn etwas nicht gefunden wurde. Also jedes mal wenn etwas nicht gefunden wurde. Also niemals wenn immer etwas gefunden wurde.

Und das wird selbst wenn etwas nicht gefunden wurde immer bei 0 bleiben denn Du erhöhst den Wert nie. Du denkst vielleicht das Du das bei den Zeilen mit den unnötigen Semikolons am Ende tust, aber so funktioniert das nicht. Eine normale Addition mit ganzen Zahlen verändert keine Werte sondern hat die Summe als Ergebnis. Mit diesem Ergebnis tust Du dann aber nichts. Da drei Zeilen für zu schreiben ist sowieso ein wenig übertrieben. Und warum steckt das als einziges Schlüssel/Wert-Paar in einem Wörterbuch? Das sieht auch unnötig umständlich aus.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

BlackJack hat geschrieben:@SeriousRuffy: Du gibst den Zähler ja nur aus wenn etwas nicht gefunden wurde. Also jedes mal wenn etwas nicht gefunden wurde. Also niemals wenn immer etwas gefunden wurde.

Und das wird selbst wenn etwas nicht gefunden wurde immer bei 0 bleiben denn Du erhöhst den Wert nie. Du denkst vielleicht das Du das bei den Zeilen mit den unnötigen Semikolons am Ende tust, aber so funktioniert das nicht. Eine normale Addition mit ganzen Zahlen verändert keine Werte sondern hat die Summe als Ergebnis. Mit diesem Ergebnis tust Du dann aber nichts. Da drei Zeilen für zu schreiben ist sowieso ein wenig übertrieben. Und warum steckt das als einziges Schlüssel/Wert-Paar in einem Wörterbuch? Das sieht auch unnötig umständlich aus.
Danke für dein Feedback BlackJack.

Mir ist bewusst das es etwas umständlich ist, aber das liegt daran das ich mich nach und nach in das Thema einarbeite. Mein Knowledge ist nicht stark, aber versuche es ständig zu erweitern.

Kannst du mir eventuell sagen, wie ich weiter vorgehen kann?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@SeriousRuffy: laß einfach alles weg, was es kompliziert macht:

Code: Alles auswählen

import requests
counter = 0
for r in range(3):
    r = requests.get("http://blabla")
    response = r.json()
    Hallo = response[0]["List"][0].get("ID")
    print(Hallo)
    if not Hallo:
        counter = counter + 1
print("Anzahl:", counter['empty'])
man kann noch ausnutzen, das True 1 und False 0 ist:

Code: Alles auswählen

import requests
counter = 0
for r in range(3):
    response = requests.get("http://blabla").json()
    counter += not response[0]["List"][0].get("ID")
print("Anzahl:", counter['empty'])
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Vielen Vielen Dank für dein Feedback:)
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Noch eine kurze Frage, jetzt würde ich gerne wissen, wieviel mal der gewünschte Wert gefunden wurde. Leider kommt die folgende Meldung zurück:

else:
^
IndentationError: unexpected indent

Weiss aber ehrlich gesagt nicht, wo genau der Fehler liegt.

Kann mir diesbezüglich einer weiter helfen?

Code: Alles auswählen


import requests
counter = 0
for r in range(3):
    r = requests.get("http://blabla")
    response = r.json()
    Hallo = response[0]["List"][0].get("ID")
    print(Hallo)
    if not Hallo:
        counter = counter + 1
print("Missing: " + str(counter))
    else:
        counter[Hallo] = 1
print("Da " + str (counter[Hallo]))


Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dir ist schon klar, dass Einrückung in Python-Code eine Bedeutung hat?

Hast du mal in die Zeile vor dem else: geschaut? Dort beendest du bereits die for-Schleife.
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Sorry, das ist ein blöder Fehler von mir.

Code: Alles auswählen

import requests
counter = 0
for r in range(3):
    r = requests.get("http://blabla")
    response = r.json()
    Hallo = response[0]["List"][0].get("ID")
    print(Hallo)
    if not Hallo:
        counter = counter + 1
        print("Missing: " + str(counter))
    else:
        counter[Hallo] = 1
print("Da " + str (counter[Hallo]))
Jetzt bekomme ich allerdings die folgende Meldung:

line 15, in <module>
counter[Hallo] = 1
TypeError: 'int' object does not support item assignment

Kannst du mir diesbzuglich Tipps geben wie ich hier weiter machen kann?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@SeriousRuffy: was soll denn counter[Hallo] sein? Warum wird 3 mal das selbe gemacht? Warum wird was gezählt und was soll damit angefangen werden?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da steht es doch schon: ``TypeError`` und ``int object``... ein Integer-Objekt bietet eben keinen Zugriff über die "Klammeroperatoren", also ``1[42]`` geht eben nicht.

Außerdem sieht die Einrückung schon wieder falsch aus :!:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
SeriousRuffy
User
Beiträge: 32
Registriert: Dienstag 16. Dezember 2014, 21:16

Vielen Dank für euer Feedback. Nach einigen Hin und her habe ich es hinbekommen:

Code: Alles auswählen

import requests
counter = 0
times = 3
for r in range(times):
    r = requests.get("blabla")
    response = r.json()
    Hallo = response[0]['enrichedList'][0].get("roomDesc")
    print('>>'+Hallo+'<<')
    if not Hallo:
        counter = counter + 1
print("Missing: " + str(counter))
print("Successful: " + str(times-counter))

Allerdings habe ich bei einem anderen Request eine Frage:

Code: Alles auswählen


import requests
response = requests.get("blabla")
 data = response.json()
Hallo = data[0]["responseBodies"][0]
print(Hallo)
    {"diagnostic":{"status":200,"elapsetime":"0.2692","memoryusage":"9.07MB","unix_timestamp":1421153447,"confirm":"success","lang":"id","currency":"IDR"},"output_type":"json","result":[{"hotel_id":"144861","hotel_description":"Terletak strategis diwilayah Palembang, Zuri Express Palembang menawarkan kenyamanan dan nilai yang baik.","hotel_name":"Zuri Express Palembang","star_rating":"2","photo_primary":"https:\/\/www.tiket.com\/img\/business\/r\/o\/business-room-orange3.sq2.jpg","business_lat":"-2.96680950000000000000","business_long":"104.76957149999998000000","address":"Jl Dr. M. Isa no 988 , Ilir Timur II, Palembang","rooms":[{"room_available":"30","room_max_occupancy":"2","room_id":"2981","with_breakfast":"1","star_rating":"2","tripadvisor_rating":"{\"name\":\"Zuri Express Hotel\",\"url\":\"http:\\\/\\\/www.tripadvisor.com\\\/Hotel_Review-g608501-d2313959-Reviews-m18379-Zuri_Express_Hotel-Palembang_South_Sumatra_Sumatra.html\",\"reviewcnt\":\"34\",\"avgrating\":\"3.5\"}","average_rate_per_night":515000,"hotel_id":"144861","room_name":"Express Room","room_facility":["AC","Air mineral botol gratis","Surat kabar harian","Meja","Shower Panas & Dingin","Akses Internet - Wifi","Televisi LCD\/layar plasma","Bar kecil","Cermin","Satelit\/TV kabel","Shower","Sandal","Telepon"],"room_description":"Terletak strategis diwilayah Palembang, Zuri Express Palembang menawarkan kenyamanan dan nilai yang baik. Pengunjung bisnis akan menghargai bahwa semua bisnis lokal dalam jangkauan lokasi hotel ini. Hotel bintang tiga ini dekat Stadion Sultan Agung, Stadion Gelora Sriwijaya, 30-menit berkendara dari Sultan Mahmud Badaruddin II dan 20 menit dari Jembatan Ampera.\nHotel ini menawarkan kenyamanan pusat bisnis, layanan loundry, parkir gratis, sebuah restoran dan reseptionis 24-jam.\nKamar-kamar memiliki kamar mandi pribadi dengan fasilitas shower air panas dan dingin. Terang dan lapang, kamar dilengkapi dengan tempat tidur putih bersih dan TV satelit layar datar.","all_photo_room":["http:\/\/www.tiket.com\/img\/business\/r\/o\/business-room-orange1.room.jpg"],"bookUrl":"http:\/\/api.tiket.com\/hotel\/indonesia\/palembang\/palembang\/zuri-express-palembang?uid=business%3A144861&adult=2&child=0"}

type(Hallo)
<class 'str'>


Wie ihr sehen könnt, wurde die Response in "str" wiedergegeben. Jetzt würde ich gerne den Wert "Status" aus der Response extrahieren, allerdings weiß ich nicht wie ich genau vorgehen soll. Mit der get. Methode fuktioniert es nicht, da es sich ja nicht um ein Dict. handelt.

Sollte ich die Response erst wieder in einem Dict. umwandeln? Und dann mir den gewünschten Wert holen? Oder geht das einfacher? Wäre für jede Hilfe dankbar:)
Antworten