Récupérer le détail d’une carte Magic the Gathering avec un parseur HTML

 Article modifié dernièrement le 19 Avr 2011 @ 14 h 12 min

Présentation

Je travaille depuis peu sur un site web personnel concernant Magic the Gathering, mon jeu de cartes préféré qui passe bien devant le poker, la belote, la manille et le tarot (voir les articles de Greg ici et  pour voir de quoi ça parle).

Le site devant proposer aux utilisateurs de visionner les cartes, il est primordial d’avoir à porter de main toutes les informations concernant les différentes cartes qui existent, comment s’y prend t’on ?

Je vois trois façons de faire :

  1. Vous utilisez la base de données déjà alimentées d’un ami ou d’un site marchand : chose qui n’arrivera jamais, de plus il faudrait alors se plier à leur modèle de données qui ne vous conviendra pas forcément
  2. Vous appelez un service web qui depuis un nom de carte ou un identifiant vous renvoie toutes les informations nécessaires concernant cette carte (sous forme JSON ou XML) : un tel service n’existe pas ou je suis passé à côté
  3. Vous alimentez vous-même votre base de données en récupérant chaque information de chaque carte par le biais d’un parseur HTML : difficile à mettre en place, tributaire du code source du site cible, mais l’énorme avantage est que vous définissez vous-même le modèle de données et qu’au final vous obtenez votre propre base de données

Jericho

Voici le nom du parseur HTML que j’utilise, Jericho, il ne m’avait servi pour le moment qu’à modifier les éléments d’un source HTML, plus précisément modifier le contenu HTML généré par une Taglib, voir article précédent.

Nous allons à présent nous en servir pour l’extraction de données à partir d’un document HTML.

Voici les différentes étapes (ou algorithme) pour la récupération des données d’une carte, nous utiliserons comme référant le site officiel de la base de données des cartes Magic, Gatherer :

  1. Récupérer l’url de votre carte détaillée à récupérer, ex : http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=192230
  2. Récupérer le source HTML de cette page qui contient toutes les informations qu’il vous faut
  3. A partir de cet objet « source » tout est à présent possible, il faudra extraire une à une les informations souhaitées : nom de la carte, coût en mana, force et endurance, type de carte, image, édition, etc.

Données à extraire

Je ne vais pas donner le code pour la récupération de chaque détail de la carte mais juste quelques uns pour vous montrer le principe :

  • Nom
  • Image
  • Pour récupérer l’image sous forme d’un tableau de bytes afin de pouvoir l’enregistrer en base :

    Pour sauvegarder l’image sur votre disque dur :

  • Type et sous-type
  • Les cartes de créatures sont typées « Créature » mais ont aussi un sous-type comme par exemple « Vampire », nous séparons ici ces deux informations. A noter aussi que si le numéro de la carte recherchée permet d’obtenir les informations en français de la carte alors le source du site diffère, d’où quelques ajustations permettant de rendre le code générique :

  • Nom de l’artiste

Conclusion

Long et fastidieux par le principe même de devoir parser du code HTML, mais Jericho, lui, est très simple d’utilisation et permet assez rapidement d’extraire n’importe quelle données sans avoir à écrire trop de code.

De plus je trouve Jericho très rapide dans la recherche des éléments d’un document ainsi qu’à récupérer le source HTML d’une page à partir de son url.

Je vous le conseille parmi la multitude de parseurs HTML Java à notre portée.

Trois flèches vers le bas

1- Logiciel de brouillage d’adresse IP :

Contourner la censure en surfant anonyme

2- L’article explicatif :

La différence entre un proxy et un VPN

3- Comment espionner un smartphone (app) :

L’application de référence

Commentez ici

  • Greg 12 février 2010, 20 08

    Je pense que cet article intéressera ceux qui apprennent la programmation en effet

  • Mimie 15 février 2010, 14 02

    L’appréhension d’un parseur HTML est destiné à ceux qui maîtrisent déjà le langage HTML (et ses dérivés), sinon il sera impossible d’analyser le code source et donc d’en extraire les données attendues.

  • Fabrice 14 mars 2010, 1 01

    j’ai mis en place cette solution 3 il y a quelques années pour justement un projet SourceForge (firemox) un meta-jeu ( Magic The Gathering entre autre), et le système de picture-provider et data-provider était géré non pas avec un parseur HTML, mais de simple RegExp. J’y vois les avantages suivants :
    – la page HTML n’étant pas toujours valide XTML, HTML W3C,… les parseur peuvent échouer.
    – les performances!
    – le temps de mise en place. Comme tu le souligne, le code est bien trop compliqué avec ce genre de parseur.

  • Mimie 14 mars 2010, 22 10

    Bonjour Fabrice, super initiative le projet firemox 😀 j’aime beaucoup la façon de représenter une carte Magic sous forme XML.
    Je n’ai pas encore récupéré le projet sous mon Eclipse, peux-tu donner un exemple d’expression régulière que tu utilises pour récupérer les informations des cartes ?
    Ce projet est toujours suivi ? les nouvelles cartes sont ajoutées au projet régulièrement ?

Article suivant:

Article précédent:

Share This