Anleitung zur Erstellung eines einfachen Krypto-Preis-Trackers

Bemerkungen: 0

Die Preisdaten beliebter Kryptowährungen zu verfolgen, kann aufgrund ihrer hohen Volatilität eine Herausforderung sein. Eine gründliche Recherche und die Bereitschaft, Gewinnchancen zu nutzen, sind beim Handel mit Kryptowährungen unerlässlich. Die Beschaffung von genauen Preisdaten kann manchmal schwierig sein. Zu diesem Zweck werden häufig APIs verwendet, aber kostenlose Abonnements sind oft mit Einschränkungen verbunden.

Wir werden untersuchen, wie man mit Python regelmäßig die aktuellen Preise der 150 wichtigsten Kryptowährungen abrufen kann. Unser Cryptocurrency Price Tracker wird die folgenden Daten sammeln:

  • Coin-Name;
  • Ticker;
  • Preis;
  • 24-Stunden-Kursänderung in Prozent.

Schritt 1: Bibliotheken importieren

Der erste Schritt in unserem Python-Skript besteht darin, die notwendigen Bibliotheken zu importieren. Wir werden die Bibliotheken `requests` und `BeautifulSoup` verwenden, um Anfragen zu senden bzw. Daten aus HTML-Dateien zu extrahieren.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

Wir werden auch `csv` für CSV-Datei-Operationen und `time` und `random` zur Steuerung der Häufigkeit von Preisaktualisierungen bzw. der Rotation von Proxies verwenden.

Schritt 2: Einrichten von Proxys

Wenn Sie Anfragen ohne einen Premium-Proxy senden, kann es zu "Access Denied"-Antworten kommen.

Sie können einen Proxy folgendermaßen einrichten:

proxy = {
 "http": "http://Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

Für authentifizierte Proxys ist das folgende Format zu verwenden:

proxy = {
 "http": "http://username:password@Your_proxy_IP_Address:Your_proxy_port",
}
html = requests.get(url, proxies=proxy)

Denken Sie daran, "Your_proxy_IP_Address" und "Your_proxy_port" durch die tatsächliche Proxy-Adresse zu ersetzen. Ersetzen Sie auch den Wert von "username" und "password" durch Ihre Anmeldedaten.

Schritt 3: Proxys rotieren lassen

Das Rotieren von Proxys ist eine sehr wichtige Technik, um moderne Websites erfolgreich zu scrapen, da sie oft den Zugang für Bots und Scraper blockieren oder einschränken, wenn sie mehrere Anfragen von derselben IP-Adresse erkennen. Um die Proxy-Rotation einzurichten, importieren Sie die Random-Bibliothek.

Erstellen Sie eine Liste von Proxys für die Rotation:

# Liste der Bevollmächtigten
proxies = [ 
 "username:password@Your_proxy_IP_Address:Your_proxy_port1",
 "username:password@Your_proxy_IP_Address:Your_proxy_port2",
 "username:password@Your_proxy_IP_Address:Your_proxy_port3",
 "username:password@Your_proxy_IP_Address:Your_proxy_port4",
 "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

Anschließend definieren wir eine get_proxy()-Funktion, um für jede Anfrage einen Proxy aus unserer Liste nach dem Zufallsprinzip auszuwählen.

# Methode zum Drehen Ihrer Proxys
def get_proxy(): 
  # Wählen Sie einen zufälligen Proxy aus der Liste
  proxy = random.choice(proxies) 
  return {
            "http": f'http://{proxy}',
            "https": f'http://{proxy}'
    }

Diese Funktion gibt ein Wörterbuch mit dem ausgewählten Proxy für das HTTP-Protokoll zurück. Auf diese Weise können wir auf der Website, die wir auslesen, als mehrere organische Benutzer erscheinen, was die Chancen erhöht, Anti-Scraping-Maßnahmen zu umgehen.

Schritt 4: Abrufen und Analysieren unserer Kryptodaten

Die Funktion get_crypto_prices() holt die Kryptowährungspreise von Coindesk ab. Sie sendet eine GET-Anfrage an die Website mit der Funktion requests.get(), wobei unsere rotierenden Proxys als Argument übergeben werden. Wir übergeben den Text der Antwort und den Parser "html.parser" an den BeautifulSoup-Konstruktor.

def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    soup = BeautifulSoup(html.text, "html.parser")

Schritt 5: Verstehen der Struktur der Website

Bevor wir mit der Datenextraktion beginnen, müssen wir die Struktur der Website verstehen. Wir können die Entwicklertools des Browsers verwenden, um den HTML-Code der Webseite zu untersuchen. Um auf die Entwicklertools zuzugreifen, können Sie mit der rechten Maustaste auf die Webseite klicken und "Untersuchen" wählen.

1.png

Anschließend werden mit der Funktion find_all() von BeautifulSoup und dem CSS-Selektor "tr", class_='css-1cxc880' alle Preiscontainer auf der Seite gesucht und der Name der Münze, die Ticker, der Preis und die prozentuale Veränderung innerhalb von 24 Stunden für jeden Container extrahiert. Diese Daten werden in einem Wörterbuch gespeichert und dann an die Preisliste angehängt.

2.png

Extrahieren des Münznamens

Hier verwenden wir row.find('p', class_='css-rkws3'), um das Element 'p' mit der Klasse "css-rkws3" zu finden. Dann extrahieren wir den Text und speichern ihn in einer "name"-Variablen.

3.png

coin_name_tag = row.find('p', class_='css-rkws3')
name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

Den Ticker extrahieren

In ähnlicher Weise verwenden wir row.find("span", class_="css-1jj7b1a"), um das span-Element mit der Klasse "css-1jj7b1a" zu finden. Die Methode get_text() extrahiert den Textinhalt und liefert uns den Ticker.

4.png

coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"

Der Preis wird extrahiert

Wir lokalisieren das "div"-Element mit der Klasse "css-b1ilzc". Der Textinhalt wird dann ausgelesen und der Preisvariablen zugewiesen. Wir verwenden eine bedingte Anweisung, um Fälle zu behandeln, in denen das Element möglicherweise nicht vorhanden ist.

5.png

coin_price_tag = row.find('div', class_='css-b1ilzc')
price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

Extrahieren der prozentualen Veränderung

In ähnlicher Weise suchen wir das Element "p" mit der Klasse "css-yyku61", um die prozentuale Veränderung zu extrahieren. Der Textinhalt wird entfernt, und eine bedingte Anweisung behandelt das mögliche Fehlen.

6.png

coin_percentage_tag = row.find('p', class_='css-yyku61')
percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"

Wenn man alles zusammenfügt, erhält man eine for-Schleife, die wie folgt aussieht:

for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices

Schritt 6: Daten nach CSV exportieren

Die Funktion export_to_csv() wird definiert, um die gescrapten Daten in eine CSV-Datei zu exportieren. Wir verwenden die CSV-Bibliothek, um die Daten in der Preisliste in die angegebene CSV-Datei zu schreiben.

 def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
       with open(filename, "w", newline="") as file:
           fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
           writer = csv.DictWriter(file, fieldnames=fieldnames)
           writer.writeheader()
           writer.writerows(prices)

Schritt 7: Ausführen des Trackers

Im Hauptteil unseres Skripts rufen wir die Funktion get_crypto_prices() auf, um die Preise abzurufen, und export_to_csv(), um sie in eine CSV-Datei zu exportieren. Anschließend warten wir 5 Minuten (300), bevor wir die Preise erneut aktualisieren. Dies geschieht in einer Endlosschleife, so dass die Preise alle 5 Minuten aktualisiert werden, bis das Programm gestoppt wird.

if __name__ == "__main__":
       while True:
           prices = get_crypto_prices()
           export_to_csv(prices)
           print("Prices updated. Waiting for the next update...")
           time.sleep(300)  # Aktualisierung der Preise alle 5 Minuten

Vollständiger Code

Hier ist der vollständige Code, der alle Techniken und Schritte, die wir behandelt haben, integriert und einen optimierten Ansatz zum Aufbau eines Krypto-Preis-Trackers bietet, wie wir es in diesem Projekt getan haben.

import requests
from bs4 import BeautifulSoup
import csv
import time
import random

# Liste der Bevollmächtigten
proxies = [
     "username:password@Your_proxy_IP_Address:Your_proxy_port1",
     "username:password@Your_proxy_IP_Address:Your_proxy_port2",
     "username:password@Your_proxy_IP_Address:Your_proxy_port3",
     "username:password@Your_proxy_IP_Address:Your_proxy_port4",
     "username:password@Your_proxy_IP_Address:Your_proxy_port5",
]

# Benutzerdefinierte Methode zum Drehen von Proxys
def get_proxy():
    # Wählen Sie einen zufälligen Proxy aus der Liste
    proxy = random.choice(proxies)
    # Rückgabe eines Wörterbuchs mit dem Proxy für das http-Protokoll
    return {"http": f'http://{proxy}',
            "https": f'http://{proxy}'
          }


def get_crypto_prices():
    url = "https://crypto.com/price"
    html = requests.get(url, proxies=get_proxy())
    print(html.status_code)
    soup = BeautifulSoup(html.content, "html.parser")

    price_rows = soup.find_all('tr', class_='css-1cxc880')

    prices = []
    for row in price_rows:
        coin_name_tag = row.find('p', class_='css-rkws3')
        name = coin_name_tag.get_text() if coin_name_tag else "no name entry"

        coin_ticker_tag = row.find('span', class_='css-1jj7b1a')
        ticker = coin_ticker_tag.get_text() if coin_ticker_tag else "no ticker entry"
        
        coin_price_tag = row.find('div', class_='css-b1ilzc')
        price = coin_price_tag.text.strip() if coin_price_tag else "no price entry"

        coin_percentage_tag = row.find('p', class_='css-yyku61')
        percentage = coin_percentage_tag.text.strip() if coin_percentage_tag else "no percentage entry"
        
        prices.append({
            "Coin": name,
            "Ticker": ticker,
            "Price": price,
            "24hr-Percentage": percentage
        })
    
    return prices



def export_to_csv(prices, filename="proxy_crypto_prices.csv"):
    with open(filename, "w", newline="") as file:
        fieldnames = ["Coin", "Ticker", "Price", "24hr-Percentage"]
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        writer.writeheader()
        writer.writerows(prices)


if __name__ == "__main__":
    while True:
        prices = get_crypto_prices()
        export_to_csv(prices)
        print("Prices updated. Waiting for the next update...")
        time.sleep(300)  # Aktualisierung der Preise alle 5 Minuten (Anpassung nach Bedarf)

Ergebnisse

Die Ergebnisse unseres Kryptopreis-Trackers werden in einer CSV-Datei mit dem Namen "proxy_crypto_prices.csv" gespeichert (siehe unten):

7.jpg

Die einfache Syntax von Python macht es zur idealen Wahl für den Aufbau eines automatisierten Kursverfolgers für Kryptowährungen. Diese Programmiersprache erleichtert das Hinzufügen neuer Funktionen und die Erweiterung der Fähigkeiten des Trackers. Das mitgelieferte Beispiel zeigt, wie ein einfacher Scraper erstellt wird, der die Kryptowährungskurse automatisch in bestimmten Intervallen aktualisiert, Daten über einen Proxy sammelt und in einem benutzerfreundlichen Format speichert.

Bemerkungen:

0 Bemerkungen