Guide de construction d'un simple tracker de prix de crypto-monnaies

Commentaires: 0

Le suivi des prix des crypto-monnaies les plus populaires peut s'avérer difficile en raison de leur forte volatilité. Il est essentiel de mener des recherches approfondies et d'être prêt à saisir les opportunités de profit lorsque l'on traite avec des crypto-monnaies. Il est parfois difficile d'obtenir des données précises sur les prix. Les API sont couramment utilisées à cette fin, mais les abonnements gratuits sont souvent limités.

Nous allons voir comment récupérer périodiquement les prix actuels des 150 premières crypto-monnaies à l'aide de Python. Notre outil de suivi des prix des crypto-monnaies recueillera les données suivantes :

  • Nom de la pièce ;
  • Ticker ;
  • Prix ;
  • Pourcentage de variation des prix sur 24 heures.

Etape 1 : Importation de bibliothèques

La première étape de notre script Python est d'importer les bibliothèques nécessaires. Nous utiliserons les bibliothèques `requests` et `BeautifulSoup` pour envoyer des requêtes et extraire des données de fichiers HTML, respectivement.

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

Nous utiliserons également `csv` pour les opérations sur les fichiers CSV et `time` et `random` pour contrôler la fréquence des mises à jour de prix et la rotation des proxies, respectivement.

Étape 2 : Mise en place de proxys

Lorsque vous envoyez des requêtes sans proxy premium, il se peut que vous receviez des réponses du type "Accès refusé".

Vous pouvez mettre en place un proxy de cette manière :

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

Pour les mandataires authentifiés, utilisez le format suivant :

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

N'oubliez pas de remplacer "Your_proxy_IP_Address" et "Your_proxy_port" par l'adresse réelle du proxy. Remplacez également les valeurs "username" et "password" par vos identifiants.

Étape 3 : Rotation des mandataires

La rotation des proxys est une technique très importante pour scraper avec succès les sites web modernes, car ils bloquent ou restreignent souvent l'accès aux bots et aux scrapers lorsqu'ils détectent plusieurs requêtes provenant de la même adresse IP. Pour mettre en place la rotation des proxys, importez la bibliothèque random.

Créer une liste de procurations pour la rotation :

# Liste des mandataires
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",
]

Nous définissons ensuite une fonction get_proxy() qui sélectionne aléatoirement un proxy de notre liste pour chaque requête.

# pour faire pivoter vos proxies
def get_proxy(): 
  # Choisissez un proxy aléatoire dans la liste
  proxy = random.choice(proxies) 
  return {
            "http": f'http://{proxy}',
            "https": f'http://{proxy}'
    }

Cette fonction renvoie un dictionnaire contenant le proxy sélectionné pour le protocole HTTP. Cette configuration nous permet d'apparaître comme plusieurs utilisateurs organiques sur le site web que nous scrappons, ce qui augmente nos chances de contourner les mesures anti-scraping.

Étape 4 : Obtention et analyse de nos données cryptographiques

La fonction get_crypto_prices() récupère les prix des crypto-monnaies sur Coindesk. Elle envoie une requête GET au site web en utilisant la fonction requests.get(), avec nos proxies rotatifs passés en argument. Nous passons le texte de la réponse et l'analyseur "html.parser" au constructeur de BeautifulSoup.

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

Étape 5 : Comprendre la structure du site

Avant de commencer l'extraction des données, nous devons comprendre la structure du site. Nous pouvons utiliser les outils de développement du navigateur pour inspecter le code HTML de la page web. Pour accéder aux outils de développement, vous pouvez cliquer avec le bouton droit de la souris sur la page web et sélectionner "Inspecter".

1.png

Nous trouvons ensuite tous les conteneurs de prix sur la page en utilisant la fonction find_all() de BeautifulSoup et le sélecteur CSS "tr", class_='css-1cxc880' et nous extrayons le nom de la pièce, le ticker, le prix et le pourcentage de variation sur 24 heures pour chaque conteneur. Ces données sont stockées dans un dictionnaire, puis ajoutées à la liste des prix.

2.png

Extraction du nom de la pièce

Ici, nous utilisons row.find('p', class_='css-rkws3') pour localiser l'élément 'p' avec la classe "css-rkws3" . Nous extrayons ensuite le texte et le stockons dans une variable "name".

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"

Extraction du téléscripteur

De même, nous utilisons row.find("span", class_="css-1jj7b1a") pour localiser l'élément span avec la classe "css-1jj7b1a". La méthode get_text() extrait le contenu textuel, ce qui nous permet d'obtenir le téléscripteur.

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"

Extraction du prix

Nous localisons l'élément "div" avec la classe "css-b1ilzc". Le contenu textuel est ensuite dépouillé et affecté à la variable "price". Nous utilisons une instruction conditionnelle pour gérer les cas où l'élément pourrait ne pas être présent.

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"

Extraction du pourcentage de variation

De même, nous localisons l'élément "p" avec la classe "css-yyku61" pour extraire le pourcentage de changement. Le contenu du texte est dépouillé et une instruction conditionnelle gère les absences potentielles.

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"

En mettant tout cela ensemble, nous avons une boucle for qui ressemble à ceci :

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

Étape 6 : Exportation des données au format CSV

La fonction export_to_csv() est définie pour exporter les données extraites vers un fichier CSV. Nous utilisons la bibliothèque CSV pour écrire les données de la liste des prix dans le fichier CSV spécifié.

 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)

Étape 7 : Exécution du tracker

Dans la partie principale de notre script, nous appelons la fonction get_crypto_prices() pour récupérer les prix et export_to_csv() pour les exporter dans un fichier CSV. Nous attendons ensuite 5 minutes (300) avant de mettre à nouveau les prix à jour. Cette opération est effectuée dans une boucle infinie, de sorte que les prix continueront d'être mis à jour toutes les 5 minutes jusqu'à ce que le programme soit arrêté.

if __name__ == "__main__":
       while True:
           prices = get_crypto_prices()
           export_to_csv(prices)
           print("Prices updated. Waiting for the next update...")
           time.sleep(300)  # Mise à jour des prix toutes les 5 minutes

Code complet

Voici le code complet qui intégrera toutes les techniques et étapes que nous avons couvertes, fournissant une approche simplifiée pour construire un tracker de prix de crypto comme nous l'avons fait dans ce projet.

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

# Liste des procurations
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",
]

# Méthode personnalisée pour faire pivoter les proxies
def get_proxy():
    # Choisissez un proxy aléatoire dans la liste
    proxy = random.choice(proxies)
    # Retourne un dictionnaire avec le proxy pour le protocole http
    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)  # Mise à jour des prix toutes les 5 minutes (à ajuster selon les besoins)

Résultats

Les résultats de notre traqueur de prix des cryptomonnaies sont enregistrés dans un fichier CSV appelé "proxy_crypto_prices.csv", comme indiqué ci-dessous :

7.jpg

La syntaxe simple de Python en fait le choix idéal pour construire un tracker automatisé de prix des crypto-monnaies. Ce langage de programmation facilite l'ajout de nouvelles fonctionnalités et l'extension des capacités du tracker. L'exemple fourni montre comment créer un scraper de base qui peut automatiquement mettre à jour les cours des crypto-monnaies à des intervalles spécifiés, collecter des données par l'intermédiaire d'un proxy et les enregistrer dans un format convivial.

Commentaires:

0 Commentaires