Aktienchecker, urllib3

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
onur22
User
Beiträge: 19
Registriert: Freitag 28. Dezember 2018, 21:25

Hallo,

Ich habe einen kleinen Aktienchecker geschrieben. Aber ich weiß nicht, ob das so eine "elegante" Methode ist, die ich nutze oder ob es nicht anders mit urllib3 funktioniert.

Code: Alles auswählen

import urllib3





def Amazon_Checker():
    http = urllib3.PoolManager()
    Get_Amazon = http.request('GET', 'https://www.finanzen.net/aktien/Amazon-Aktie')
    Amzn = str(Get_Amazon.data)
    TextPassage = Amzn.find('col-sm-4 text-sm-right text-nowrap">')
    Nummer = int(TextPassage)
    Kurs = "Amazon Kurs " + Amzn[Nummer + 36:Nummer + 44] + " €"
    print(Kurs)
Der Code liest einfach den ganzen Text auf der Page aus, findet eine gewisse Passage und sucht relativ zu dieser eine von mir festgelegte Passage und printed diese aus. Diese Passage enthält dann die Information, die ich möchte.
Das klappt auch soweit ganz gut, aber es kann ja jederzeit passieren, dass die Seite irgendwas hinzufügt oder entfernt und dann stimmen diese "festen" Angaben von mir nicht mehr. Deswegen denke ich, dass diese Methode nicht so gut ist.

Hoffe auf Ratschläge, danke!
alles ist als Einsteiger möglich. Es ist nur die Frage, wie lange es dauert, bis man die nötigen Vorkenntnisse erworben hat.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@onur22: Als erstes wäre ein Blick in den Style Guide for Python Code angebracht was die Namensschreibweisen angeht.

Obwohl, nein, als erstes sollte man den offensichtlichen Syntaxfehler beseitigen.

Funktionen/Methoden werden üblicherweise nach der Tätigkeit benannt die sie ausführen. `amazon_checker()` ist keine Tätigkeit.

`get_amazon` wäre ein Name für eine Funktion, aber nicht für eine Antwort vom Server.

`Amzn` ist dann für gar nichts ein guter Name weil komisch und kryptisch abgekürzt. Ab hier ist der Code auch falsch, denn `data` ist ein `bytes`-Objekt und auf dessen Zeichenkettenrepräsentation will man nicht arbeiten. An der Stelle würde ich dann auch von `urllib3` Abstand nehmen und `requests` verwenden, was netterweise auch den korrekt dekodierten Inhalt der Antwort zur Verfügung stellt, so das man nicht selber versuchen muss heraus zu finden wie die Antwort kodiert ist.

`str.find()` gibt bereits eine ganze Zahl zurück, da macht es keinen Sinn die an den Namen `TextPassage` zu binden und dann noch mal als `int()` umgewandelt an den Namen `Nummer`. Beide Namen sind auch nicht wirklich gut. Zudem hat `find()` das Problem das es eine -1 zurück gibt wenn der Text nicht gefunden wird, Du das aber überhaupt nicht prüfst, sondern diese -1 als Index in die Zeichenkette verwendest, was ja gültig ist aber ein total falsches Ergebnis zur Folge hat. `find()` sollte man deswegen nicht verwenden, sondern die `index()`-Methode bevorzugen. Die lässt einen nicht einfach ignorieren und mit falschen Werten weiter machen wenn der Text nicht gefunden wird.

Das sähe also dann eher so aus:

Code: Alles auswählen

#!/usr/bin/env python3
import requests


def check_amazon():
    response = requests.get('https://www.finanzen.net/aktien/Amazon-Aktie')
    response.raise_for_status()
    text = response.text
    index = text.index('col-sm-4 text-sm-right text-nowrap">')
    print('Amazon Kurs ' + text[index + 36:index + 44] + ' €')
Und Du hast natürlich recht, dass das Fragment des HTML-Quelltexts nach dem gesucht wird, und die Versatzwerte für den Slice-Zugriff sich ändern können und dieser Ansatz deshalb nicht sehr robust ist. Dafür nimmt man normalerweise einen HTML-Parser wie `lxml.html` oder BeatifulSoup4 und orientiert sich mehr an der Struktur der Webseite. Die kann sich zwar auch ändern, aber der Ansatz ist robuster.

Und man möchte das vielleicht etwas flexibler gestalten. Also beispielsweise keine Funktion die speziell Amazon's Aktienwert ausgibt, sondern eine wo man den Namen der Aktie als Argument übergeben kann.

Eine Trennung zwischen Benutzerinteraktion und Aktienwert ermitteln wäre vielleicht auch gut. Also eine Funktion die den Aktienwert als Rückgabe hat und der Aufrufer dann entscheiden kann, was er mit dem Wert machen möchte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten