Comment scraper les valeurs de cryptomonnaie sur Coinmarketcap.com avec Python 3 et Request

Arrêtez de copier le net. Scrapez le.

 

Comment scraper les valeurs de cryptomonnaie sur Coinmarketcap.com avec Python 3 et Request

coinmarketcap-scraping-16dkk2u

En 2009, un développeur (ou un groupe de développeurs) de logiciels qui utilise le pseudonyme de Satoshi Nakamoto, crée le Bitcoin. Alors que la crise financière a éclaté un an plus tôt, cette technologie permet de réaliser des transactions entre pairs, et chaque transaction est inscrit collectivement au sein d’un bloc de données, dans un grand livre consultable et vérifiable par tous. En théorie, plus besoin de banques centrales, de comptable, de notaires : c’est le collectif qui, en s’appuyant sur des technologies de cryptographies, assure le bon déroulement des transactions.

Monnaie d’échange virtualisée, la crypto-monnaie est également devenu un objet de spéculation. Selon Coinmarketcap.com, on compte 1722 Crypto-monnaies, 12 370 plateformes d’échange, avec une capitalisation globale de +230 milliards de dollars, c’est à dire le PIB du Portugal. Nous allons voir comment collecter toutes les données, grâce à Python et Requests.

Quelle donnée allons nous extraire ?

Rendons-nous d’abord sur la page avec l’ensemble des Crytpo-monnaies à extraire. Voilà l’url, simple et explicite : https://coinmarketcap.com/fr/all/views/all/. Voici les champs que nous allons extraire :

  1. Nom
  2. Symbole
  3. Cap. marché
  4. Prix
  5. Offre en circulation
  6. Volume (24h)
  7. % 1h
  8. % 24h
  9. % 7j

Et maintenant, un screenshot afin de visualiser la présence de chaque élément dans le site web :

coinmarketcap-scraping-pr2re86

Trouvez la donnée

Avant de commencer à construire le scraper, nous devons trouver où les données sont présentes dans les balises HTML de la page Web. Il faut connaître le fonctionnement des balises HTML de la page pour pouvoir faire ça.

Nous allons supposer que vous avez déjà des bases en HTML et que vous connaissez le langage Python. Vous n’avez pas besoin de plus de connaissances pour réaliser ce tutoriel.

Si vous ne connaissez ni le HTML, ni le CSS, ni le XPATH, ni le Python, prenez le temps de lire Premiers pas avec HTML – Mozilla Developer Network, Tutoriel CSS W3 School, XPath Tutorial – W3Schools,  et https://www.programiz.com/python-programming

Nous allons inspecter le code HTML de la page Web et localiser les données, en suivant la logique suivante :

  1. Inspecter l’élément
  2. Trouver la balise correspondante

 Inspecter l’HTML

Ouvrez votre navigateur Chrome, et rendez-vous sur la page de l’ensemble des valeurs de bitcoin de Coinmarketcap, à l’adresse évoquée plus haut. Vous pouvez le faire avec d’autres navigateurs, mais ce tutoriel se fait sur Chrome, et facilitera votre apprentissage.

Faites, un clique droit, puis cliquer sur Inspecter.

coinmarketcap-scraping-rml7nvq

Nous allons maintenant chercher le tag XPATH de chaque élément, avant de lancer notre scraper. Pour faciliter la recherche, cliquer sur le curseur en bas à gauche. Passez ensuite votre souris sur les éléments que nous avons cités en introduction.

On remarque d’abord que l’ensemble des éléments se trouvent dans un tableau, et que chaque cryptomonnaie est présente au sein d’un bloc HTML < tr > qui a pour id, « id-* », puis le nom de la cryptomonnaie, et pour attribut « role », la valeur row.

Voilà donc le XPATH de l’élément : « //tr[contains(@id, ‘id-‘) and @role=’row’] »

coinmarketcap-scraping-xmxtj8n

L’ensemble des données est ensuite dispersé parmi les différentes colonnes de la ligne, au sein des balises < td >. On obtient ainsi les XPATH suivants :

  • Nom : « //td[contains(@class, ‘currency-name’)]/@data-sort »
  • Symbole : « //td[contains(@class, ‘col-symbol’)]/text() »
  • Cap. marché : « //td[contains(@class, ‘market-cap’)]/text() »
  • Prix : « //a[@class=’price’]/@data-usd »
  • Offre en circulation : « //a[@class=’volume’]/@data-usd »
  • Volume (24h) : « //td[contains(@class, ‘circulating-supply’)]/@data-sort »
  • % 1h : « //td[@data-timespan=’1h’]/@data-sort »
  • % 24h : « //td[@data-timespan=’24h’]/@data-sort »
  • % 7j : « //td[@data-timespan=’7d’]/@data-sort »

Installer Python et Request

Pour installer Python et PIP, vous pouvez vous rendre sur le post que nous avons déjà fait à ce sujet : https://lobstr.io/index.php/2018/02/15/installer-librairies-python-mac-os/

Pour installer Requests, et les autres librairies utilisées dans le code, il suffit d’ouvrir votre commande, et de

Pour plus de renseignements sur Requests et ses fonctionnalités avec Python, leur documentation est fournie et très utile : http://docs.python-requests.org/en/master/

Le code

Pour exécuter le script, ouvrez votre éditeur Sublime Text 3, copier-coller le code ci contre, et enregistrez le sous le nom de coinmarketcap_extract.py. Si vous ne savez pas comment l’installer, rendez-vous ici : https://lobstr.io/index.php/2018/02/08/comment-pourquoi-installer-sublim-text/

Dans votre commande, placez ensuite la ligne suivante :

Vous pourrez ensuite observer directement depuis votre console, le résultat suivant :

coinmarketcap-scraping-nnl1m9x

30 secondes entre la requête et l’extraction des données, soit 1723 monnaies référencées.

Vous devriez retrouver dans le même dossier que le dossier où se trouve le script, un fichier .csv, nommé cryptocurrencies_*.csv, avec la date du jour à la place du symbole *. Une fois ouvert, et formaté sur excel, vous obtiendrez un fichier .xls comme suit :

coinmarketcap-scraping-lsotqk6

Vous pouvez également télécharger le code sur notre Github, à l’adresse suivante : https://gist.github.com/Lobstrio/972a60304517e12d85682beee4d61703. N’hésitez pas à nous indiquer dans les commentaires, ou sur le github, si le script fonctionne bien chez vous aussi.

Limitations connues

Le script permet de collecter les données, et de les enregistrez au format .csv. Toutefois, vous ne pourrez récolter que les données de la page indiquée, tandis que d’autres données (prix, prime, production, année…) ne seront pas récoltées. Par ailleurs, à grande échelle, Amazon vous posera des problèmes lors de la collecte (IP, Cookies, accès au serveur).

Si vous avez besoin d’aide pour scraper des milliers de données de façon récurrente et à grande échelle, vous pouvez nous contacter via le formulaire ci-dessous :

Avertissement: Tout code fourni dans nos tutoriels est destiné à des fins d’illustration et d’apprentissage uniquement. Nous ne sommes pas responsables de la façon dont il est utilisé et n’assumons aucune responsabilité pour toute utilisation préjudiciable du code source. La simple présence de ce code sur notre site n’implique pas que nous encourageons le scraping ou l’extraction de données des sites référencés dans le code et le tutoriel qui l’accompagne. Les tutoriels ne font qu’illustrer la technique de programmation des scrapers web pour les sites internet populaires. Nous ne sommes pas obligés de fournir un support pour le code, cependant, si vous ajoutez vos questions dans la section des commentaires, nous pouvons vous y répondre périodiquement.

Une réponse

  1. ILLAT dit :

    Bonjour,
    c’est exactement ce que je recherchais, sauf que je souhaitais mettre le résultat dans une liste.
    J’ai une syntax error sur la ligne prix, j’avoue ne pas comprendre pourquoi.
    Si jamais je mets ici le code que j’ai adapté.
    Merci pour votre retour éventuel.
    Excellente journée.

    def extract(url):
    «  » »
    Export des 30 gainers page gainers-losers
    MAJ 45 secondes
    Arguments:
    url (str):
    url of the aimed Coinmarketcap page
    Return:
    liste
    «  » »

    # INITIALISATION
    r = requests.session()
    start = datetime.datetime.now()

    # COLLECTE DU CODE SOURCE
    for retry in range(10): # ajout d’un retrier en cas de site inaccessible
    response = r.get(url=url)
    print(response.headers)
    print(« — STATUS CODE –« )
    print(response.status_code)

    # PARSING ET CREATION DU CSV
    if response.status_code == 200:
    #with open(« /Users/sashabouloudnine/PycharmProjects/lobstr/lobstr/modules/coinmarketcap/cryptocurrencies_{}.csv ».format(str(datetime.date.today())), « w ») as f:
    # fieldnames = [‘Nom’, ‘Symbole’, ‘Cap. marché’, ‘Prix’, ‘Offre en circulation’, ‘Volume (24h)’, ‘% 1h’, ‘% 24h’, ‘7 j’]
    # writer = csv.DictWriter(f, fieldnames=fieldnames, delimiter=’\t’)
    # writer.writeheader()

    liste=[]
    soup = BeautifulSoup(response.text, features=’html.parser’)
    sel = Selector(text=soup.prettify())
    cryptos = sel.xpath(« //tr[contains(@id, ‘id-gainers’)] »).extract()
    print(cryptos)
    for crypto in cryptos:
    soup = BeautifulSoup(crypto, features=’html.parser’)
    sel = Selector(text=soup.prettify())

    nr = sel.xpath(« //td[contains(@class, ‘id-‘)]/text-right »).extract_first()
    nom = sel.xpath(« //td[contains(@class, ‘currency-name’)]/@data-sort »).extract_first()
    symbole = sel.xpath(« //td[contains(@class, ‘text-left’)]/text() »).extract_first()
    volume = sel.xpath(« //a[@class=’volume’]/@data-usd ».extract_first()
    prix = sel.xpath(« //a[@class=’price’]/@data-usd »).extract_first()
    percent = sel.xpath(« //td[contains(@class, ‘percent’)]/@data-sort »).extract_first()

    clean_values = []
    values = [nr,nom, symbole, volume, prix, percent]
    for value in values:
    if value:
    value = value.strip().replace(‘\n’,  »)
    clean_values.append(value)

    print(‘, ‘.join(clean_values))
    dict_row = dict(zip(fieldnames, clean_values))
    #writer.writerow(dict_row)
    liste.append[values]
    # TEMPS PASSE
    end = datetime.datetime.now()
    time_elapsed = str(end – start)
    print(‘\n’)
    print(‘– TIME ELAPSED –‘)
    print(time_elapsed)
    break

    elif response.status_code == 404:
    print(« Page indisponible »)
    break

    else:
    print(« Impossible d’accéder à la page »)
    return []

    def main():
    url = « https://coinmarketcap.com/fr/gainers-losers/ »
    extract(url)

    if __name__ == ‘__main__’:
    main()

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *