Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/11/2010, à 05:46

vinikkrill

[résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Bonjour à tous.

Je joue à un jeu sur lequel le classement ne permet absolument aucune recherche. On peut juste afficher tous les joueurs dans leur ordre de niveau par page de 50. Je voudrais donc créer une base de donnée de tous les joueurs pour me faire mon propre classement qui aurait cette fois des critères de recherche possible. Mon seul problème est la collecte des informations.

J'ai fait un début de script qui s'occupe de télécharger les pages de classement. Il fait toutes les pages une par une de domaine.tld/classement.php?page=1 jusqu'à domaine.tld/classement.php?page=356 (qui est la dernière page).

J'aimerais maintenant ajouter plusieurs choses à mon script.


1/ Je voudrais que mes 356 pages html de classement enregistrées soient traitées afin d'en extraire les données et faire des INSERT dans un bd mysql :

La partie intéressante des pages de classement ressemble à ça : (y'a du blabla avant et après, mais les balise <table> sont unique dans toute la page donc facile de se repérer).

<table class="tableau">
    <tr>
            <th>Position</th>
            <th></th>
            <th></th>
            <th>Nom</th>

            <th>Guilde</th>
            <th>Progression</th>
            <th>Points</th>
        </tr>

            <tr class="impair">
                <td>1</td>

                <td><img src="http://data.domaine.tld/img/offline.png" alt="Déconnecté" title="Déconnecté"></td>
                <td><img src="http://data.domaine.tld/img/neutre.png" title="Allignement neutre" alt="" width="20" height="20"></td>
                <td><a href="/perso.php?id=295">Pseudo_perso1</a></td>
                <td>NomDeGuilde</td>
                <td>=</td>
                <td>22 429 743</td>
            </tr>

            <tr class="pair">
                <td>2</td>
                <td><img src="http://data.domaine.tld/img/offline.png" alt="Déconnecté" title="Déconnecté"></td>
                <td><img src="http://data.domaine.tld/img/bien.png" title="Allignement bon" alt="" width="20" height="20"></td>
                <td><a href="/perso.php?id=678">Pseudo_perso2</a></td>
                <td>NomDeGuilde</td>
                <td>=</td>

                <td>21 408 183</td>
            </tr>
            <tr class="impair">
                <td>3</td>
                <td><img src="http://data.domaine.tld/img/offline.png" alt="Déconnecté" title="Déconnecté"></td>
                <td><img src="http://data.domaine.tld/img/neutre.png" title="Allignement neutre" alt="" width="20" height="20"></td>
                <td><a href="/perso.php?id=138">Pseudo_perso3</a></td>

                <td>NomDeGuilde</td>
                <td>=</td>
                <td>19 853 518</td>
            </tr>


[.......]



            <tr class="impair">
                <td>49</td>
                <td><img src="http://data.domaine.tld/img/offline.png" alt="Déconnecté" title="Déconnecté"></td>

                <td><img src="http://data.domaine.tld/img/mal.png" title="Allignement mauvais" alt="" width="20" height="20"></td>
                <td><a href="/perso.php?id=223184">Pseudo_perso49</a></td>
                <td>NomDeGuilde</td>
                <td><span class="progression_plus">+2</span></td>
                <td>17 245 081</td>
            </tr>
            <tr class="pair">

                <td>50</td>
                <td><img src="http://data.domaine.tld/img/offline.png" alt="Déconnecté" title="Déconnecté"></td>
                <td><img src="http://data.domaine.tld/img/neutre.png" title="Allignement neutre" alt="" width="20" height="20"></td>
                <td><a href="/perso.php?id=143012">Pseudo_perso50</a></td>
                <td>NomDeGuilde</td>
                <td><span class="progression_moins">-1</span></td>
                <td>17 242 142</td>

            </tr>
        </table>

J'aimerais garder l'id du personnage, le pseudo, l'alignement, la guilde et le nombre d'xp.
J'avais dans l'idée de créer un fichier xml unique pour la totalités des pages de classement avec une arborescence ressemblant à ça :

<personnage>
    <id></id>
    <pseudo></pseudo>
    <alignement></alignement>
    <guilde></guilde>
    <experience></experience>
</personnage>

Ensuite, grace à ce fichier xml, je pourrais insérer dans ma base de données tous les joueurs.
Mais là j'ai 2 problèmes. Je ne sais pas comment créer ce fichier xml. Je ne sais pas non plus comment m'en servir pour faire des INSERT dans ma bd.

2/ Maintenant que dans ma bd j'ai la liste de tous les joueurs avec leur id, j'aimerais compléter les informations que j'ai sur eux. Pour cela rien de plus facile, les pages du type domaine.tld/perso.php?id=25544 me donnent des informations complémentaires sur tous les joueurs.
Il faut donc que je complète mon script pour qu'il télécharge toutes ces pages. Seulement, ce n'est pas aussi simple que les pages classement. Pour les pages classement j'ai télécharger les pages 1 à 356. Mais pour les personnages ce n'est pas possible comme certains id ne sont plus utilisés (les joueurs arrêtent de jouer, sont bannis etc...). Je dois donc aller chercher uniquement les id qui me seront utiles grâce à la bd... ça non plus je ne sais pas bien comment faire !
Une fois ces pages téléchargées ils me suffira de faire le même traitement que pour le 1/ (création de l'xml puis actions sur la bd) mais avec des UPDATE à la place de INSERT donc là plus de problème.


Voilà, si une âme charitable est prête à m'expliquer comment chercher des trucs dans un document, en créer un xml, puis s'en servir pour faire des traitements sur une base de données mysql, je suis client ^^

Merci d'avance de votre aide smile

edit : voici ce sur quoi je travaille :

#!/bin/bash

PAGEACTUELLE=1
PAGETOTAL=357
DBHOST="host"
DBUSER="user"
DBPASS="passw0rd"
BDBASE="base"

echo "Purge des pages déjà existantes"
rm -rf /home/vinikkrill/classement/pages/
mkdir /home/vinikkrill/classement/pages/

# echo "Connexion à Domaine.tld"
# touch home/vinikkrill/classement/cookies.txt
# wget --post-data='pseudo=lepseudo&password=lemdp01&submit=Se connecter' --save-cookies=/home/vinikkrill/classement/cookies.txt --keep-session-cookies http://domaine.tld/login -O /home/vinikkrill/classement/log
#
# J'ai commenté cette partie puisque, je ne sais pas pourquoi (si vous avez la solution ! =D),
# ça ne fonctionne pas. C'est sensé envoyé en post les données qu'il faut pour se connecter
# (les pages classement et perso ne sont visibles que connecté...), mais ça n'a pas l'air de
# marcher des masses. Du coup je me connecte avec firefox et écris moi-même le cookies.txt et
# là, la suite du code marche.

echo "Téléchargement des pages de classement une à une"

    echo "$PAGETOTAL pages à télécharger"

    echo "Début du téléchargement..."
    while [ "$PAGEACTUELLE" != "$PAGETOTAL" ]
    do
        wget --quiet http://domaine.tld/classement.php?page=$PAGEACTUELLE --load-cookies=/home/vinikkrill/classement/cookies.txt --save-cookies=/home/vinikkrill/classement/cookies.txt --keep-session-cookies -O /home/vinikkrill/classement/pages/$PAGEACTUELLE.html
        echo "téléchargement de la page de classement n°$PAGEACTUELLE effectué"
        : $((PAGEACTUELLE = $PAGEACTUELLE + 1))
        # sleep 2s
        # J'avais pour idée de pas trop harceller le serveur grace à ce sleep mais bon
        # ... c'est long ! surtout pour la suite !
    done

echo "Fin des téléchargements du classement"

echo "Création du fichier xml"
# Là... c'est vous qui intervenez !

echo "Suppression des données déjà existantes sur la base de données"
# Ca je trouverais bien une doc qqpart pour savoir comment vider une table depuis le terminal,
# c'est pas bien dur.

echo "Insertion des nouvelles données sur les joueurs"
# Là... c'est encore vous ! Trouver la requête ça je dois pouvoir faire mais ce qu'il me faut,
# c'est de l'aide sur la création de la boucle, et la création de la requête dans la boucle.

echo "Téléchargement des pages de personnage une à une"

    # un echo qui affiche le nombre de page à télécharger (donc on retourne le résultat
    # d'un count(*) sur ma table de perso mais... comment ? ^^

    echo "Début du téléchargement..."
    # la jolie boucle qui doit se charger de faire tous les wget qu'il faut sur les pages
    # des personnages.

echo "Fin des téléchargements des personnages"

echo "Edition du fichier xml"
# Hop on modifie l'ancien xml pour y ajouter toutes nos nouvelles données (ou on en refait un
# évidement si c'est plus facile.... ça je ne sais pas trop ?)

echo "Mise à jour de la base de données avec les infos complémentaires"
#ça c'est comme là où il y a le insert ... mais en update... donc pas de problème

echo "La mise à jour du classement est terminé !"

Je sais qu'il n'y a aucune verrif à aucun moment, je les ajouterais plus tard, quand le base sera terminée.

Dernière modification par vinikkrill (Le 15/11/2010, à 10:15)

Hors ligne

#2 Le 11/11/2010, à 12:53

chopinhauer

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Tu peux par exemple utiliser un langage de transformation de XML comme XSLT. Une feuille de style comme :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:s="http://www.mozilla.org/2006/browser/search/"
  xmlns:str="http://exslt.org/strings"
  extension-element-prefixes="str">
  <xsl:template match="/">
    <catalogue>
      <xsl:apply-templates select="//table[@class='tableau']"/>
    </catalogue>
  </xsl:template>
  <xsl:template match="table">
    <xsl:for-each select="tr[@class='impair'|@class='pair']">
      <personnage>
    <id><xsl:value-of select="td[1]"/></id>
    <pseudo><xsl:value-of select="td[4]/a"/></pseudo>
    <alignement><xsl:value-of select="td[3]/@title"/></alignement>
    <guilde><xsl:value-of select="td[5]"/></guilde>
    <experience><xsl:value-of select="td[7]"/></experience>
      </personnage>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

devrait sortir le format que tu souhaites. À utiliser comme :

xsltproc -html feuille_de_style.xsl fichier.html

Évidemment au lieu de sortir du XML, tu peux aussi bien sortir un tableau CSV ou une suite de commandes SQL INSERT INTO.

Dernière modification par chopinhauer (Le 11/11/2010, à 12:55)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#3 Le 11/11/2010, à 17:55

vinikkrill

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Merci, ça marche impec ça ! ^^
j'ai juste changé le

    <xsl:for-each select="tr[@class='impair'|@class='pair']">

qui ne fonctionnait pas, j'ai dû transformer en

    <xsl:for-each select="tr[@class='impair']|tr[@class='pair']">

pour que ça fonctionne.

Pour l'id tu as mit le <td>[1] mais il s'agit en fait de l'id contenu dans le href ici :

<td><a href="/perso.php?id=295">Pseudo_perso1</a></td>

Comment faire pour récupérer juste l'id et pas tout le href comme ce serait le cas avec un ? (enfin je crois que ça ressemblerait à ça ! ^^')

<xsl:value-of select="td[4]/@href"/>

Par contre j'ai un petit souci... avec ça je sais faire autant de xml que de html mais je voudrais n'avoir qu'un seul xml avec toutes les entrées si possible.

Et ensuite, une fois que j'ai mon xml, comment je fais pour faire mes INSERT sur le script en puisant dedans ?

(à la base je voulais un xml avant les requêtes juste pour pouvoir conserver le xml à chaque fois et ainsi pouvoir retrouver l'historique du classement si besoin)

Hors ligne

#4 Le 12/11/2010, à 19:25

chopinhauer

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Oubié de m'abonner au sujet.

vinikkrill a écrit :

Comment faire pour récupérer juste l'id et pas tout le href comme ce serait le cas avec un ? (enfin je crois que ça ressemblerait à ça ! ^^')

Tu peux utiliser les extensions de EXSLT à XPath, donc une règles comme :

<xsl:value-of select="str:replace(td[4]/@href, '/perso.php?id=', '')"/>

va garder juste le ID.

vinikrill a écrit :

Par contre j'ai un petit souci... avec ça je sais faire autant de xml que de html mais je voudrais n'avoir qu'un seul xml avec toutes les entrées si possible.

Et ensuite, une fois que j'ai mon xml, comment je fais pour faire mes INSERT sur le script en puisant dedans ?

Tu demande à xsltproc d'omettre la déclaration XML avec :

<xsl:output method="xml" omit-xml-declaration="yes"/>

fils direct de xsl:stylesheet. Après tu concatène le tout avec cat smile

Pour produire tes commandes INSERT tu fais juste une autre feuille de style XSLT pour transformer ton XML en texte :

<xsl:output method="text"/>

dira au processeur de traiter la sortie comme du texte. Tu pourras ajouter des morceaux de texte avec la balise <xsl:text.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#5 Le 14/11/2010, à 11:24

vinikkrill

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Bon, le projet avance !
J'ai réussi à avoir l'id correct. J'ai mes suite de requete insert.
Là j'ai un souci, c'est que dans ma bd j'enregistre l'experience en int et que sur le site, il y a un espace pour séparer les milliers du coup il enregistre pour 1 000 000 : "1" au lieu de "1000000". Y a-t-il un moyen pour que, directement dans le fichier xml je n'ai plus d'espace ?
Après la fin devrait pas trop être problématique ^^

edit : bon bah j'ai trouvé la solution avec un p'tit sed. je reviens donc quand j'aurais tout fini. j'ai pas encore attaqué les pages perso.

Dernière modification par vinikkrill (Le 14/11/2010, à 11:28)

Hors ligne

#6 Le 14/11/2010, à 16:40

chopinhauer

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Tu peux aussi utiliser la fonction str:replace de XPath pour remplacer ' ' par '', comme dans mon message précédent. Si tu veux plus puissant, ajoute la déclaration du namespace :

<namespace>:xmlns="http://exslt.org/regular-expressions"

dans les propriétés du tag xsl:stylesheet et tu pourras utiliser la fonction <namespace>:replace. Choisit quelque chose de confortable pour <namespace>, par exemple re ou regexp.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#7 Le 15/11/2010, à 08:28

vinikkrill

Re : [résolu] Téléchargement de nombreuses pages sur un site et mise en bd

Super tout marche parfaitement !
Me reste plus qu'à faire ma p'tite interface php pour exploiter tout ça et ça sera fini ^^

Merci de ton aide x) !

Hors ligne