Excel macro/vba récupérer données wikipedia (voir p.4) - VB/VBA/VBS - Programmation
Marsh Posté le 09-04-2024 à 23:06:32
Mediawiki a une API. Regarde si tu peux pas l'utiliser. Après, le VBA, c'est pas franchement le langage le plus approprié pour faire ce genre de traitement
Du Python ou PHP serait sans doute mieux.
Marsh Posté le 10-04-2024 à 11:24:57
Merci pour la réponse.
Copilot m'avait sorti un script avec l'appel d'un API mais ça ne marchait pas vraiment et j'ai pas su adapter/corriger le script.
Je testerai à nouveau.
Pour python/php faut que je regarde si je peux me débrouiller sachant que je ne connais rien en codage.
Marsh Posté le 10-04-2024 à 21:44:35
Voilà j'ai retenté avec l'API mais visiblement ca marche pas à l'extraction.
je suis allé fouiller sur le site de l'api de wikimedia mais j'avoue que je suis perdu.
https://www.mediawiki.org/wiki/Exte [...] xtracts/fr
https://www.mediawiki.org/wiki/API:Query/fr
je vais continuer à regarder de ce coté.
****************
Code :
|
Marsh Posté le 11-04-2024 à 18:53:21
Bonjour !
Sans peut-être passer par l'API, il manque au moins deux liens pour deux jeux et pour chacun l'exact résultat escompté
ou encore mieux un lien DropBox - ou autre hébergeur de fichiers - sur un classeur Excel avec tout le nécessaire
à savoir source des pages Web et résultats attendus …
Marsh Posté le 12-04-2024 à 17:50:34
Bonjour
pour des jeux j'ai testé :
https://fr.wikipedia.org/wiki/Princess_Peach:_Showtime! (avec lui que le offset a fonctionné pas avec les autres - normal)
donnée à récupérer : Action-aventure
https://fr.wikipedia.org/wiki/Horizon_Forbidden_West
donnée à récupérer : Action-RPG, aventure
et à mettre dans la case "catégorie"
j'ai mis une partie de mon xlsm ici :
y a toutes les tentatives de scripts avec
https://1fichier.com/?b52ql9ht82ux8djr7000
Au final j'avais espérer compléter mon tableau avec le script : Développeur , Éditeur et Genre.
pour le moment je le fais à la main.
Marsh Posté le 19-04-2024 à 09:39:18
Bonjour, merci pour les liens.
En effectuant une requête directe cela a bien fonctionné pour Horizon et Princess, pour Elder Scroll il a fallu ruser mais pas moyen pour les deux restants,
même en essayant de louvoyer avec les titres "Catégorie" etc et comme le code HTML source de ces pages non normalisées ne contient pas "Genre" …
Par contre en pilotant Internet Explorer c'est l'enfance de l'art !
J'hésitais entre différentes méthodes, j'ai finalement opté pour celle du gamin débutant en VBA vers qui j'ai adressé cet exercice de simple logique
ayant résolu simplement ce mini challenge : « si la première cellule d'une table HTML est égale à "Genre" alors l'info est dans la seconde cellule. »
Très simple, suffit-il encore de juste prendre deux minutes pour bien observer comment fonctionne la page Web, d'inspecter les éléments …
Démonstration VBA / Windows à coller uniquement dans le module de la feuille Feuil1 (Catalogue Games)
ne nécessitant pas l'activation de référence spécifique, remplissant juste les vides de la colonne H :
Code :
|
Marsh Posté le 19-04-2024 à 18:14:49
Franchement merci beaucoup.
Je vais tester tout cela. Depuis l'autre jour, j'ai tenté des choses mais rien de mieux.
J'avais pas du tout pensé à demander à copilot de prendre la donnée de la case à coté de "genre". Vu que c'est sous forme de tableau j'aurais dû y penser.
Marsh Posté le 19-04-2024 à 19:38:12
Oubliez 'Copilot', d'abord il faut juste vérifier le contenu du code HTML source pour voir si une simple requête peut être appliquée
et comme ici la donnée ciblée n'existe pas dans la source alors se tourner vers d'autres voies comme les fonctions Web d'Excel
- ne font pas toujours l'affaire - ou Power Query par exemple …
Une autre méthode est d'utiliser les fonctions VBA texte pour extraire la donnée ciblée du code HTML une fois la page complètement chargée,
c'est un peu plus compliqué à coder que de scanner le contenu des tables.
Et pour alimenter des colonnes contigües - F, G & H - d'une feuille de calculs une simple variation lisant les tables HTML peut être mise en œuvre.
Marsh Posté le 20-04-2024 à 07:19:27
je m'aide de copilot parce que je ne savais pas comment aborder la chose et j'y connais trop peu en programmation pour être à l'aise...
j'ai décomposé mes demandes et je les ai empilées au fil des tests. (recherche de la case / recherche sur wikipedia / etc).
Mais il restait la partie pour vraiment toujours tomber sur le "genre" où je n'arrive pas à trouver la bonne solution.
en tout cas j'ai à peu près compris comment procède votre script mais j'aurais été incapable de le créer.
Sinon conclusions de mes essais : ca marche bien. La petite voix m'a surpris la 1ère fois.
même si certaines pages reviennent bredouille alors qu'il y a bien la même structure de page.
j'ai utilisé l'inspecteur de firefox pour voir pour comparer 2 pages mais j'ai pas compris pourquoi l'une renvoie bien la donnée et pas l'autre.
Pour d'autres je sais que cela ne marchera pas car le titre de la case ne renvoie pas correctement vers la bonne page wikipédia.
je vais regarder comment ca marche pour les "fonctions VBA texte" si je peux en faire quelque chose.
en tout cas merci beaucoup.
Marsh Posté le 20-04-2024 à 08:03:26
en expliquant à copilot qu'il y avait certaines cases non remplies il a compris la présence des infobox, a fait évoluer le code.
Des cases sont toujours vides mais d'autres ont été remplies maintenant.
Code :
|
Marsh Posté le 20-04-2024 à 08:41:00
Comme pour "Genre" dans le code source primaire.
Sinon merci d'indiquer quelles pages de jeux sont concernées …
Questions :
1) A part la colonne H, quelles sont les colonnes à remplir ?
Et si elles sont contigües le code en serait simplifié.
2) Quel est le critère pour traiter ou pas une ligne ? (Pour éviter de perdre du temps pour ce qui a déjà été fait …)
Par exemple le critère de ma démonstration est les cellules vides de la colonne H.
Marsh Posté le 20-04-2024 à 09:51:31
avant de répondre aux questions, j'ai constaté une erreur de ma part..... dans la semaine j'avais rajouté une colonne.... donc ce n'est plus H mais I et pas vu qu'il fallait corriger cela.
Donc je suis reparti des 1ers scripts.
Entre temps j'ai corrigé un certain nombre de titres de jeux donc ca a mieux fonctionné (j'ai gardé de coté les anciennes colonnes remplies par les scripts pour comparer)
La v2 a déjà mieux rempli même s'il en manquait.
La v3 + copilot a fonctionné parfaitement. Aucune case vide. Au mieux j'ai ¤¤¤ dans la case (nom du jeu pas conforme avec wikipedia - je corrigerai à la main).
1) Pour le genre juste une colonne (la " I " maintenant)
2) j'avoue ne pas bien comprendre.... >> je pense avoir mieux compris : vérifier la colonne à remplir suffit je pense. je vois pas autre chose pour éviter de perdre du temps.
Je vais essayer d'adapter pour les éditeurs/Développeur/autre.
Finalement votre script était quasi parfait dès le début.
-----
Code :
|
--------------
Code :
|
Marsh Posté le 20-04-2024 à 17:48:58
suite à essais au final tout fonctionne.
Genre, Développeur, Éditeur.
J'ai juste changé ici "If oCell.innerText = "Genre" Then" et si le titre est conforme à Wikipédia la donnée est bien récupérée.
j'adapte la valeur de la colonne ici "Cells(R, 9)" pour la donnée souhaitée.
Merci pour l'aide. Sans votre script j'y serai pas arrivé.
Copilot a quand même eu son utilité et ca m'a permis de découvrir son usage. ^^
Marsh Posté le 20-04-2024 à 21:05:24
Marc L a écrit : Il ne faut pas boucler sur toutes les cellules d'une table mais sur toutes ses lignes afin de tester uniquement la première cellule de chaque ligne … |
Ma démonstration revisitée où que soit la colonne 'Catégorie' et au cas où 'Genre' ne se trouve pas toujours dans la première ligne d'une table HTML
et, par sécurité, à placer directement dans le module de la feuille au lieu d'un module standard :
Code :
|
Marsh Posté le 21-04-2024 à 09:22:54
Merci pour cette "ultime" version.
j'ai testé pour les éditeurs/dev/genre : Ca marche nickel aussi.
je vais voir si je peux récupérer d'autres infos avec ce même script ^^
Marsh Posté le 21-04-2024 à 17:12:25
Il me faudrait la liste des infos à récupérer avec leurs colonnes associées surtout quand 'Genre' devient 'Catégorie' dans Excel par exemple …
Ou encore un nouveau lien sur le fichier actuel avec un peu plus de jeux "référence" ayant des paginations différentes.
Afin de simplifier le code, d'éviter une usine à gaz de If en cascade, l'idéal pour les colonnes dont les infos se trouvent dans des tables HTML est
qu'elles soient contigües comme par exemple dans le classeur original 'Développeur Éditeur Catégorie' dans les colonnes F:H …
Dans ce cas quel que soit le nombre de colonnes contigües cela demande juste deux lignes de code dont un seul If.
Et encore plus idéal pour simplifier le code de ces colonnes contigües dont la source se trouve dans une table HTML est
leurs entêtes dans la feuille de calculs correspondant exactement aux pages web comme 'Genre' et non pas 'Catégorie' …
Marsh Posté le 21-04-2024 à 18:10:25
Merci pour l'aide mais je vais en rester à ces colonnes.
En regardant les pages des jeux, je vois pas trop d'utilité d'en rajouter plus.
Je suis déjà bien content du résultat et de l'expérience ^^
j'avais déjà changé "Catégorie" pour "Genre" pour qu'ils soient tous identiques à Wikipédia.
Marsh Posté le 21-04-2024 à 18:21:41
Bien. A noter dans le cas de colonnes contigües - peu importe leur nombre - une procédure VBA optimisée ne demande pas plus de 30 lignes de code …
Marsh Posté le 21-04-2024 à 18:48:58
Juste une dernière chose : j'ai mis des images pour illustrer certains jeux dans un commentaire.
Une idée s'il y a mieux/plus simple pour cela ?
j'ai trouvé cette idée car quand on passe la souris dessus on a l'image mais il faut tout faire à la main.
Marsh Posté le 21-04-2024 à 19:36:16
Cela doit être possible : juste avant de le faire à la main, activer l'Enregistreur de macros puis opérer manuellement
puis désactiver l'Enregistreur puis voir la procédure VBA ainsi générée qui doit être optimisée ensuite …
Marsh Posté le 21-04-2024 à 19:42:09
Une autre idée : au lieu d'augmenter significativement la taille du classeur en incluant des images
juste incorporer un lien hypertexte de l'URL - ou du fichier si stocké localement - de l'image dans la cellule du nom du jeu …
Marsh Posté le 22-04-2024 à 08:02:55
merci pour l'aide. je vais tenter cela.
Marsh Posté le 22-04-2024 à 08:43:44
en fouillant je suis tombé sur une solution :
https://excel-downloads.com/threads [...] .20051402/
reste à créer tous les liens mais au moins le xls ne sera pas alourdi par les photos.
edit : juste a savoir si un lien peut fonctionner si la place en local des photos est déplacée
en gros c:\catalogue\jeux.xlsm et le lien "...\images\jeux1.jpg" au lieu de "c:\catalogue\images\jeux1.jpg"
edit 2 : j'ai quand même essayé de récupérer les dates des sorties mais il y a tellement variations sur wikipedia que ca va devenir une usine pour filtrer. donc je vais rester à la main.
Marsh Posté le 22-04-2024 à 12:35:07
Avec le peu d'information et les rares jeux dans le classeur exemple aucun souci pour récupérer 'Date de sortie' …
Marsh Posté le 23-04-2024 à 08:17:01
pour l'année de sortie, voici plusieurs exemples avec un affichage différent :
https://fr.wikipedia.org/wiki/Horizon_Forbidden_West
https://fr.wikipedia.org/wiki/Subnautica:_Below_Zero
https://fr.wikipedia.org/wiki/Immortals_Fenyx_Rising
https://fr.wikipedia.org/wiki/Doom_Eternal
https://fr.wikipedia.org/wiki/Age_of_Mythology
il y a entre les dates les éléments "PC, PlayStation 4, PlayStation 5, Nintendo Switch, MacOS", les zones géographiques, qui peuvent trainer au milieu de tout ca, être séparés.
Donc j'imagine qu'il faut filtrer la plateforme du fichier excel pour ensuite aller récupérer la bonne plateforme sur Wikipédia.
Et "Subnautica:_Below_Zero" est encore différent puisqu'il est donné aussi la date "accès anticipé".
Bref c'est pas grave du tout sachant que c'est juste l'année qui m'intéresse.
Marsh Posté le 23-04-2024 à 16:13:12
Je peux charger facilement la première année trouvée mais pour la plateforme faut-elle encore que celle du classeur corresponde à celle de la page !
Par exemple 'PC' dans le classeur pour Horizon Forbidden West n'existe pas dans sa page source Wiki … (idem pour Half Life 3)
Autre point, 'Copilot' et son 'infobox_v2' :
en cherchant parmi quatre méthodes pour charger la date laquelle serait la plus appropriée je suis tombé sur 'infobox_v3' : erreur de frappe ?
Si oui alors je suis d'accord, si toutes les données à télécharger se trouvent uniquement dans cet élément
alors il vaut mieux limiter les recherches à ses tables au lieu de la page entière, l'exécution en sera un iota plus rapide.
Si non, j'aimerais des liens de pages où cet 'infobox_v2' apparaît …
Marsh Posté le 23-04-2024 à 17:46:09
j'avoue ne pas avoir testé plus que ca le script "essai v4/copilot/infoboxwikipedia" avec la infobox v2. je viens de tester en corrigeant pour v3 et ca semble fonctionner aussi.
c'est copilot qui a sorti le "v2". j'ai pas su dire s'il avait juste ou faux.
pour l' infobox il y a visiblement déjà eu 4 versions >> https://fr.wikipedia.org/wiki/Mod%C [...] vid%C3%A9o (en bas de page "archive" )
Pour la date, d'une fiche à l'autre parfois il y a PC, windows bref c'est pas toujours hyper carré. J'ai eu pareil pour les genres qui ne sont pas nommés exactement pareils sur chaque fiche.
j'ai même fait un script pour nettoyer un peu tout ca (et c'est incomplet je pense):
Code :
|
Au final pour la date franchement c'est pas grave.
Marsh Posté le 23-04-2024 à 19:54:10
Allez je mets à disposition mon catalogue avec tous les scripts :
Catalogue Games.xlsm / 9.42 Mo / https://1fichier.com/?9mh8cjffciebruo7mcjd
si ca peut aider d'autres personnes à refaire leur catalogue personnel.
Marsh Posté le 24-04-2024 à 09:32:32
Là il y a du monde !
Bonne nouvelle : toutes les pages existantes
- une cinquantaine de jeux du catalogue complet n'ont pas de page Wiki, je n'y inclus pas ceux pour lesquels il faut ajouter une extension -
contiennent 'infobox_v3' donc à utiliser comme limite de recherche au lieu de la page complète.
Je dois maintenant tester toutes les pages pour voir s'il y a d'autres cas spéciaux de date
avant une démonstration pour les quatre colonnes - mais contigües - à télécharger ensemble …
Marsh Posté le 24-04-2024 à 09:47:19
pour les jeux qui n'ont pas de wiki, c'est possible d'avoir des noms ?
j'ai corrigé beaucoup de noms mais pas impossible d'en avoir oublié (je suis en train de tous les repasser en vue...)
par ex : Bioshock Infinite : Clash in the Clouds >> https://fr.wikipedia.org/wiki/Biosh [...] the_Clouds pas de fiche car c'est une extension du jeu qui est incluse dans la page du jeu principal.
Certaines extension renvoient vers la page du jeu d'origine
Marsh Posté le 24-04-2024 à 12:03:53
La procédure ci-dessous cherche pour chaque page de jeu quelle version 'infobox' elle utilise dans son code source HTML
via des requêtes Web donc ce n'est pas le code HTML de la page une fois chargée comme via Internet Explorer,
progression visible en bas dans la barre d'état, résultat affiché à la fin dans la colonne N.
Si une page n'existe pas le résultat sera S#404 …
S'il y a eu besoin de l'extension '_(jeu_vidéo)' alors le caractère ¤ est ajouté au résultat et,
s'il apparaît seul, la page avec l'extension n'a rien donné.
Encore une fois à coller uniquement dans le module de Feuil1 (Catalogue Games) au lieu d'un simple module,
là où est située la procédure évènementielle Worksheet_Activate et, une fois en place,
la procédure doit être visible via Alt F8 comme Feuil1.TestReq1 sinon ce n'est pas bon !
Code :
|
Marsh Posté le 24-04-2024 à 17:38:38
testé = que des V3 avec quelques ¤
certains titres sont S#404 mais c'est normal après vérification car pas de fiche existante en français.
je vais pouvoir continuer de mettre à jour certains titres de jeux
Marsh Posté le 26-04-2024 à 11:30:25
Pour le moment ca marche très bien. Aucun souci rencontré.
J'ai voulu voir pour tout ce qui est BD.
J'ai testé mais je ne comprends pas du tout pourquoi ca ne marche pas vu que la page est construite de facon identique (sauf qu'ici c'est une infobox_v2) d'après ce que j'ai vu :
J'ai testé juste avec tintin : https://fr.wikipedia.org/wiki/Les_Aventures_de_Tintin
Mais ca ne fonctionne pas du tout (genre(s) , éditeur, etc) je n'ai que des ¤¤ comme résultat alors que le nom est correct.
Marsh Posté le 26-04-2024 à 15:37:58
Je suis sur la fin des tests pour les dates + autres colonnes.
Sinon pour les BD cela a l'air encore plus facile car tout est dans la table de l'infobox de la page une fois chargée
donc en scannant la première colonne uniquement (et non pas toutes les cellules) …
Suivre donc l'exécution de la procédure en mode pas à pas pour voir où cela pêche.
Marsh Posté le 26-04-2024 à 17:19:38
c'est ce que j'ai fait mais je ne détecte rien.... je suis clairement pas au niveau pour ca ^^""""
il boucle comme prévu ici
Code :
|
mais ne bascule jamais sur le "Then S = ..." donc j'en ai conclu qu'il ne trouve pas le terme "éditeur" sauf que j'ai testé plusieurs écritures sans resultat (j'ai même fouillé avec l'inspecteur de firefox pour vérifier mais idem)
Marsh Posté le 26-04-2024 à 17:43:58
Comme cela fonctionne bien de mon côté, sans même piloter IE, juste avec une requête et un document HTML
donc il y aurait déjà une mauvaise orthographe de l'élément cherché …
Ensuite je ne peux pas deviner donc vaudrait mieux poster le code délimité entre balises via l'icône C.
Marsh Posté le 26-04-2024 à 18:06:26
Même si je l'ai clairement évoqué lors de mon premier post de ce jour, je vais insister : copier / coller n'est pas coder !
Car comme souligné pour la page Wiki BD tout est dans la table de l'infobox_v2, bien visible en inspectant la page
donc pourquoi s'évertuer à boucler sur des tables alors que cet infobox_v2 est une table ?!
Du reste, dans une page Wiki de jeu vidéo, quel est donc le type d'élément de l'infobox_v3 ?
C'est le B-A-BA de l'inspection d'une page HTML et sans cela, coder serait vain …
Marsh Posté le 26-04-2024 à 18:27:48
AYÉ !! viens de trouver l'erreur... = un espace oublié après "Éditeur "
c'est en testant avec "Site web " que j'ai constaté l'oubli vu qu'avec Site web cela a fonctionné.
édit: oh purée c'est pire que prévu y a encore moins d'homogénéité dans les pages... "Genre" "Genres" "Genre(s)"
Marsh Posté le 26-04-2024 à 19:06:01
Bien vu !
Comme je n'ai vu qu'une page BD wiki, mais je m'imagine bien vu le bordel des pages Wiki de jeux vidéo !
J'espère que les autres pages BD sont elles aussi interrogeables directement par requête car plus rapide que de piloter IE …
Marsh Posté le 08-04-2024 à 21:57:38
Bonjour à tous
Je recherche de l'aide pour excel/macro/vba
j'ai voulu me faire un fichier excel pour lister les jeux vidéos auxquels j'ai joués et pour essayer de récupérer certaines infos depuis leur page wikipedia, j'ai commencé à me torturer en faisant une macro avec l'aide de copilot.
Globalement je m'en sors pas trop mal sachant que je n'y connais pas grand chose mais sur la dernière ligne droite je bug.
En fait ce sont plusieurs macros de copilot que j'ai modifié au fil des essais.
plusieurs points sont pas encore bons et je galère :
(1) D'un jeu à l'autre la donnee "Genre" n'est pas au même endroit sur la page wikipedia. Donc la donnée récupérée n'est pas bonne/tronquée/etc. Et làje sèche complètement.
J'ai modifié les offset pour tomber pile dessus pour un jeu mais je sais que c'est foireux....
Même avec Copilot j'arrive pas à trouver une solution pour toujours tomber sur le bon emplacement. Si ce souci est résolu ca voudrait dire que n'importe quelle donnée pourrait être trouvée pour remplir le tableau Excel ?
(2) Le "cellule.Offset(0, 8).Value = Genre" ne fonctionne pas. Il ne va pas remplir la colonne que j'ai choisi pour mettre cette donnée et je n'ai pas trouvé de solution. >>> Trouvé !!
(3) le script plante en fonction des jeux sélectionnés....
en gros j'ai réussi à faire ca :
Merci pour qui pourra m'aider.
*******************************
****
Message édité par xenesys le 15-08-2024 à 18:28:25
---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4