Requests Error

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.
Antworten
SomePythonDude
User
Beiträge: 4
Registriert: Montag 13. Juni 2022, 13:06

Hi!

Ich benutze requests und sseclient um von einer Webseite mir bestimmte Daten zu ziehen (Börse Frankfurt). Auf meinem Lokalen PC funktioniert auch alles einwandfrei. Doch wenn ich dies auf meinen Ubuntu 20.04 LTS mit Python Version 3.10 aufspiele und laufen lasse, kommt folgender Fehler:
requests.exceptions.InvalidURL: Failed to parse: <Response [200]>
Ich benutze die selbe versionen sowohl von den Library als auch von Python. Wieso kommt dieser Fehler zustande?

Das Script findet ihr hier: https://github.com/joqueka/bf4py

Mein Code sieht wie folgt aus:

Code: Alles auswählen

client = bf4py.live_data.live_quotes(sys.argv[1], callback=json, mic="XSC")
client.open_stream()
while True:
    sleep(5)
    print(client.data[-1])
Danke für jegliche unterstützung! :D
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SomePythonDude: Wie sieht denn die URL aus?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
SomePythonDude
User
Beiträge: 4
Registriert: Montag 13. Juni 2022, 13:06

"https://api.boerse-frankfurt.de/v1/data ... P5&mic=XSC"

Dies ist die URL, wenn ich die Webseite öffne, dann funktioniert es einwandfrei. Nur halt auf meinem Mac :D
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SomePythonDude: Ist das die URL die Du jetzt in den Browser eingegeben hast, weil Du weisst das die richtig ist, oder *tatsächlich* die URL die das Programm benutzt?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
SomePythonDude
User
Beiträge: 4
Registriert: Montag 13. Juni 2022, 13:06

Das ist ein Socket den die Börse benutzt um Echtzeitdaten auf der Webseite darzustellen. Dieses Package(der programmierer) hat die schnittstelle raus gefunden.

Gefunden habe ich das in dem code von ihm:

Code: Alles auswählen

socket = requests.get(url, stream=True, headers=header, timeout=(3.5, 5))
print(socket) #Output "<Response [200]>"
client = sseclient.SSEClient(socket)
scheinbar wird requests im stream benutzt, nur wenn socket geprinted wird, kommt dabei dieser Response raus.
Auf Mac/Windows scheint das auch gut zugehen, nur irgendwie nicht auf Ubuntu 20.04. Deshalb auch der Fehler: Failed to parse: <Response [200]>, weil dies keine URL ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SomePythonDude: Die Frage ist halt was `url` bei diesem Aufruf *tatsächlich* für einen Wert hat. Nicht was Du glaubst, nicht was Du wünschst, sondern was das tatsächlich für ein Wert ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
SomePythonDude
User
Beiträge: 4
Registriert: Montag 13. Juni 2022, 13:06

Ich habe jetzt den sseclient ausgebaut und stattdessen Requests Session mit Stream=True und ohne Timeout verwendet. Das klappt einwandfrei.

Ich denke es lag daran das der client die eingabe: "<Response [200]>" nicht verarbeiten konnte. Komisch das es auf Mac und Windows geht, finde es aber auch noch heraus :D
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SomePythonDude: Das ist wirklich komisch denn das sollte unabhängig vom Betriebssystem *nicht* funktionieren. Du hast da ein `requests.Response`-Objekt und versuchst das `sseclient.SSEClient()` als URL zu übergeben. Das Objekt benutzt diesen Wert als URL für einen weiteren `requests.get()`-Aufruf, was natürlich nicht geht.

Das `Response`-Objekt `socket` zu nennen, hilft sicher auch nicht wenn man anscheinend sowieso schon unsicher mit den Typen ist. Wobei auch ein Socket-Objekt falsch wäre wenn eine URL erwartet wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
DeaD_EyE
User
Beiträge: 1244
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Wird Zeit, dass alles auf 0 gesetzt wird. Dann braucht man auch diese dämlichen Abfragen nicht mehr!

Mir ist aufgefallen, dass man das response-Objekt nicht erstellen muss, da der sseclient das schon macht: https://pypi.org/project/sseclient/

Code: Alles auswählen

from sseclient import SSEClient

messages = SSEClient('http://mysite.com/sse_stream/')
for msg in messages:
    do_something_useful(msg)
bf4py: https://github.com/joqueka/bf4py/blob/m ... ils.py#L90

Probier mal statdessen:

Code: Alles auswählen

client = sseclient.SSEClient(url)
Und die Zeile 90 auskommentieren.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten