Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer l'image principale dans wikipedia

    5 janvier 2021 à 12:59:02

    Bonjour,
    J'aimerai bien récupérer les images des plantes sur wikipedia (l'image principale) pour faire un quizz (on a l'image il faut trouver le texte). Je vais fair eune base de donnée qui me permet d'avoir l'URL. Je sais aussi que c'est image sont contenu dans une balise a dont la class est "image". J'aimerai bien pouvoir accéder à l'image et cela peut importe son URL car ils ne sont pas standardisés.

    -
    Edité par Augustin Écologie 5 janvier 2021 à 12:59:22

    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2021 à 13:35:47

      Bonjour,

      tu peux utiliser l'API de Wikipédia. J'avais fait ça dans ce projet : https://github.com/Lamecarlate/republican-calendar , dans ce fichier https://github.com/Lamecarlate/republican-calendar/blob/master/inc/Wikipedia_API.class.php (oula ça date, le code est pas forcément top :( ).

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        5 janvier 2021 à 13:58:48

        Merci beaucoup pour ton retour :D. Mais j'aurai aimé rester en javascript, je connais à peine le php et le reste de mon code est déjà prêt et est en javascript :/
        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2021 à 14:02:23

          Salut,

          C'est pas des masses compliquer en full js, mais je te suggèrerais plutôt (une fois que ta liste d'url de page wikipédia est prête) d'éxécuter le code suivant dans une console et d'enregistrer le résultat dans ta base de donnée :

          void async function(data) { // On crée une IIFE asynchrone sans retour prenant un argument qui doit être un array d'url wikipédia
              const parser = new DOMParser(); // On crée un DOMParser
              const requests1 = await Promise.all(data.map(url => fetch(url))); // Pour chaque url soumises, on envoi une requête fetch et on attends toutes les réponses
              const responses1 = await Promise.all(requests1.map(request => request.text())); // Pour chaque réponses obtenues, on demande à récupérer le code html de la page sous forme de texte et on attends tout les résultats
              const imgWikiUrls = responses1.map(response => parser.parseFromString(response, 'text/html').querySelector('.entete + .images > .image').href); // Pour chaque code source html obtenu, on parse la réponse au moyen du DOMParser et on récupère l'url de l'élément anchor portant le lien vers l'image en fullsize (grâce au selector '.entete + .images > .image'.)
              const requests2 = await Promise.all(imgWikiUrls.map(url => fetch(url))); // On recommences avec tout les liens obtenus : pour chaque url, on envoi une requête fetch et on attends toutes les réponses
              const responses2 = await Promise.all(requests2.map(request => request.text())); // Idem, on attends tous les retours texte des codes source de ces requêtes
              const imgDirectUrls = responses2.map(response => parser.parseFromString(response, 'text/html').querySelector('.fullImageLink img').src); // Et cette fois, on récupère l'url de l'image en fullsize contenu dans la balise img correspondant au selector suivant : '.entete + .images > .image'.
              console.log(JSON.stringify(imgDirectUrls)); // On renvoi le résultat (qui est un tableau d'url d'image wikipédia) en json.
          }([
              'https://fr.wikipedia.org/wiki/Amaranthaceae',
              'https://fr.wikipedia.org/wiki/Atriplex',
              'https://fr.wikipedia.org/wiki/Halosarcia'
          ]);

          Attention, le code étant asynchrone, en fonction du nombre de lien à traiter, tu peux te retrouver avec un certain temps à attendre pour que l'exécution soit terminer.

          A voir également si wikipédia ne va pas finir par bloquer tes requêtes si elles sont trop nombreuses...

          Peut-être même que tu peux adapter le code avec l'api wikipédia et tu n'aura certainement plus ces éventuelles restrictions.

          C'est un peu une méthode de brute que je te propose :euh:.

          -
          Edité par BrainError 5 janvier 2021 à 14:33:49

          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2021 à 14:20:53

            En fait, l'url que j'utilise dans mon code pour appeler l'API renvoie du JSON. Exemple : https://fr.wikipedia.org/w/api.php?format=json&action=query&titles=Chien&prop=pageimages&piprop=name&pilimit=10&redirects&continue. Et le JS sait probablement quoi faire avec ça ;) (JSON = JavaScript Object Notation).
            • Partager sur Facebook
            • Partager sur Twitter

            Pas d'aide concernant le code par MP, le forum est là pour ça :)

              5 janvier 2021 à 15:59:18

               void async function(data) { // On crée une IIFE asynchrone sans retour prenant un argument qui doit être un array d'url wikipédia
                    const parser = new DOMParser(); // On crée un DOMParser
                    const requests1 = await Promise.all(data.map(url => fetch(url))); // Pour chaque url soumises, on envoi une requête fetch et on attends toutes les réponses
                    const responses1 = await Promise.all(requests1.map(request => request.text())); // Pour chaque réponses obtenues, on demande à récupérer le code html de la page sous forme de texte et on attends tout les résultats
                    const imgWikiUrls = responses1.map(response => parser.parseFromString(response, 'text/html').querySelector('.entete + .images > .image').href); // Pour chaque code source html obtenu, on parse la réponse au moyen du DOMParser et on récupère l'url de l'élément anchor portant le lien vers l'image en fullsize (grâce au selector '.entete + .images > .image'.)
                    const requests2 = await Promise.all(imgWikiUrls.map(url => fetch(url))); // On recommences avec tout les liens obtenus : pour chaque url, on envoi une requête fetch et on attends toutes les réponses
                    const responses2 = await Promise.all(requests2.map(request => request.text())); // Idem, on attends tous les retours texte des codes source de ces requêtes
                    const imgDirectUrls = responses2.map(response => parser.parseFromString(response, 'text/html').querySelector('.fullImageLink img').src); // Et cette fois, on récupère l'url de l'image en fullsize contenu dans la balise img correspondant au selector suivant : '.entete + .images > .image'.
                    console.log(JSON.stringify(imgDirectUrls)); // On renvoi le résultat (qui est un tableau d'url d'image wikipédia) en json.
                    url_img = imgDirectUrls;
                }(
                  
              [
                "https://fr.wikipedia.org/wiki/Acanthaceae",
                "https://fr.wikipedia.org/wiki/Actinidiaceae",
                "https://fr.wikipedia.org/wiki/Aizoaceae",
                "https://fr.wikipedia.org/wiki/Amaranthaceae",
                "https://fr.wikipedia.org/wiki/Amaryllidaceae",
                "https://fr.wikipedia.org/wiki/Anacardiaceae",
                "https://fr.wikipedia.org/wiki/Annonaceae",
                "https://fr.wikipedia.org/wiki/Aphloiaceae",
                "https://fr.wikipedia.org/wiki/Apiaceae",
                "https://fr.wikipedia.org/wiki/Apocynaceae",
                "https://fr.wikipedia.org/wiki/Araceae",
                "https://fr.wikipedia.org/wiki/Araliaceae",
                "https://fr.wikipedia.org/wiki/Araucariaceae",
                "https://fr.wikipedia.org/wiki/Arecaceae",
                "https://fr.wikipedia.org/wiki/Aristolochiaceae",
                "https://fr.wikipedia.org/wiki/Asparagaceae",
                "https://fr.wikipedia.org/wiki/Aspleniaceae",
                "https://fr.wikipedia.org/wiki/Asteliaceae",
                "https://fr.wikipedia.org/wiki/Asteraceae",
                "https://fr.wikipedia.org/wiki/Athyriaceae",
                "https://fr.wikipedia.org/wiki/Balsaminaceae",
                "https://fr.wikipedia.org/wiki/Basellaceae",
                "https://fr.wikipedia.org/wiki/Begoniaceae",
                "https://fr.wikipedia.org/wiki/Betulaceae",
                "https://fr.wikipedia.org/wiki/Bignoniaceae",
                "https://fr.wikipedia.org/wiki/Bixaceae",
                "https://fr.wikipedia.org/wiki/Blechnaceae",
                "https://fr.wikipedia.org/wiki/Boraginaceae",
                "https://fr.wikipedia.org/wiki/Brassicaceae",
                "https://fr.wikipedia.org/wiki/Bromeliaceae",
                "https://fr.wikipedia.org/wiki/Burseraceae",
                "https://fr.wikipedia.org/wiki/Cactaceae",
                "https://fr.wikipedia.org/wiki/Campanulaceae",
                "https://fr.wikipedia.org/wiki/Cannabaceae",
                "https://fr.wikipedia.org/wiki/Cannaceae",
                "https://fr.wikipedia.org/wiki/Caprifoliaceae",
                "https://fr.wikipedia.org/wiki/Caricaceae",
                "https://fr.wikipedia.org/wiki/Caryophyllaceae",
                "https://fr.wikipedia.org/wiki/Casuarinaceae",
                "https://fr.wikipedia.org/wiki/Celastraceae",
                "https://fr.wikipedia.org/wiki/Chrysobalanaceae",
                "https://fr.wikipedia.org/wiki/Cleomaceae",
                "https://fr.wikipedia.org/wiki/Clusiaceae",
                "https://fr.wikipedia.org/wiki/Colchicaceae",
                "https://fr.wikipedia.org/wiki/Combretaceae",
                "https://fr.wikipedia.org/wiki/Commelinaceae",
                "https://fr.wikipedia.org/wiki/Connaraceae",
                "https://fr.wikipedia.org/wiki/Convolvulaceae",
                "https://fr.wikipedia.org/wiki/Costaceae",
                "https://fr.wikipedia.org/wiki/Crassulaceae",
                "https://fr.wikipedia.org/wiki/Cucurbitaceae",
                "https://fr.wikipedia.org/wiki/Cunoniaceae",
                "https://fr.wikipedia.org/wiki/Cupressaceae",
                "https://fr.wikipedia.org/wiki/Cyatheaceae",
                "https://fr.wikipedia.org/wiki/Cyperaceae",
                "https://fr.wikipedia.org/wiki/Cystopteridaceae",
                "https://fr.wikipedia.org/wiki/Dennstaedtiaceae",
                "https://fr.wikipedia.org/wiki/Dilleniaceae",
                "https://fr.wikipedia.org/wiki/Dioscoreaceae",
                "https://fr.wikipedia.org/wiki/Dryopteridaceae",
                "https://fr.wikipedia.org/wiki/Ebenaceae",
                "https://fr.wikipedia.org/wiki/Elaeocarpaceae",
                "https://fr.wikipedia.org/wiki/Equisetaceae",
                "https://fr.wikipedia.org/wiki/Ericaceae",
                "https://fr.wikipedia.org/wiki/Eriocaulaceae",
                "https://fr.wikipedia.org/wiki/Erythroxylaceae",
                "https://fr.wikipedia.org/wiki/Escalloniaceae",
                "https://fr.wikipedia.org/wiki/Euphorbiaceae",
                "https://fr.wikipedia.org/wiki/Fabaceae",
                "https://fr.wikipedia.org/wiki/Fagaceae",
                "https://fr.wikipedia.org/wiki/Flagellariaceae",
                "https://fr.wikipedia.org/wiki/Gentianaceae",
                "https://fr.wikipedia.org/wiki/Geraniaceae",
                "https://fr.wikipedia.org/wiki/Gisekiaceae",
                "https://fr.wikipedia.org/wiki/Gleicheniaceae",
                "https://fr.wikipedia.org/wiki/Goodeniaceae",
                "https://fr.wikipedia.org/wiki/Haloragaceae",
                "https://fr.wikipedia.org/wiki/Heliconiaceae",
                "https://fr.wikipedia.org/wiki/Hernandiaceae",
                "https://fr.wikipedia.org/wiki/Hydrangeaceae",
                "https://fr.wikipedia.org/wiki/Hydrocharitaceae",
                "https://fr.wikipedia.org/wiki/Hymenophyllaceae",
                "https://fr.wikipedia.org/wiki/Hypericaceae",
                "https://fr.wikipedia.org/wiki/Hypoxidaceae",
                "https://fr.wikipedia.org/wiki/Icacinaceae",
                "https://fr.wikipedia.org/wiki/Iridaceae",
                "https://fr.wikipedia.org/wiki/Juglandaceae",
                "https://fr.wikipedia.org/wiki/Juncaceae",
                "https://fr.wikipedia.org/wiki/Lamiaceae",
                "https://fr.wikipedia.org/wiki/Lauraceae",
                "https://fr.wikipedia.org/wiki/Lecythidaceae",
                "https://fr.wikipedia.org/wiki/Lentibulariaceae",
                "https://fr.wikipedia.org/wiki/Liliaceae",
                "https://fr.wikipedia.org/wiki/Linaceae",
                "https://fr.wikipedia.org/wiki/Lindsaeaceae",
                "https://fr.wikipedia.org/wiki/Loganiaceae",
                "https://fr.wikipedia.org/wiki/Lomariopsidaceae",
                "https://fr.wikipedia.org/wiki/Lycopodiaceae",
                "https://fr.wikipedia.org/wiki/Lythraceae",
                "https://fr.wikipedia.org/wiki/Magnoliaceae",
                "https://fr.wikipedia.org/wiki/Malpighiaceae",
                "https://fr.wikipedia.org/wiki/Malvaceae",
                "https://fr.wikipedia.org/wiki/Marantaceae",
                "https://fr.wikipedia.org/wiki/Marattiaceae",
                "https://fr.wikipedia.org/wiki/Melastomataceae",
                "https://fr.wikipedia.org/wiki/Meliaceae",
                "https://fr.wikipedia.org/wiki/Menispermaceae",
                "https://fr.wikipedia.org/wiki/Menyanthaceae",
                "https://fr.wikipedia.org/wiki/Molluginaceae",
                "https://fr.wikipedia.org/wiki/Monimiaceae",
                "https://fr.wikipedia.org/wiki/Moraceae",
                "https://fr.wikipedia.org/wiki/Moringaceae",
                "https://fr.wikipedia.org/wiki/Musaceae",
                "https://fr.wikipedia.org/wiki/Myristicaceae",
                "https://fr.wikipedia.org/wiki/Myrtaceae",
                "https://fr.wikipedia.org/wiki/Nelumbonaceae",
                "https://fr.wikipedia.org/wiki/Nephrolepidaceae",
                "https://fr.wikipedia.org/wiki/Nyctaginaceae",
                "https://fr.wikipedia.org/wiki/Nymphaeaceae",
                "https://fr.wikipedia.org/wiki/Ochnaceae",
                "https://fr.wikipedia.org/wiki/Olacaceae",
                "https://fr.wikipedia.org/wiki/Oleaceae",
                "https://fr.wikipedia.org/wiki/Oleandraceae",
                "https://fr.wikipedia.org/wiki/Onagraceae",
                "https://fr.wikipedia.org/wiki/Ophioglossaceae",
                "https://fr.wikipedia.org/wiki/Orchidaceae",
                "https://fr.wikipedia.org/wiki/Orobanchaceae",
                "https://fr.wikipedia.org/wiki/Osmundaceae",
                "https://fr.wikipedia.org/wiki/Oxalidaceae",
                "https://fr.wikipedia.org/wiki/Pandanaceae",
                "https://fr.wikipedia.org/wiki/Papaveraceae",
                "https://fr.wikipedia.org/wiki/Passifloraceae",
                "https://fr.wikipedia.org/wiki/Phyllanthaceae",
                "https://fr.wikipedia.org/wiki/Phytolaccaceae",
                "https://fr.wikipedia.org/wiki/Pinaceae",
                "https://fr.wikipedia.org/wiki/Piperaceae",
                "https://fr.wikipedia.org/wiki/Pittosporaceae",
                "https://fr.wikipedia.org/wiki/Plantaginaceae",
                "https://fr.wikipedia.org/wiki/Platanaceae",
                "https://fr.wikipedia.org/wiki/Plumbaginaceae",
                "https://fr.wikipedia.org/wiki/Poaceae",
                "https://fr.wikipedia.org/wiki/Polemoniaceae",
                "https://fr.wikipedia.org/wiki/Polygalaceae",
                "https://fr.wikipedia.org/wiki/Polygonaceae",
                "https://fr.wikipedia.org/wiki/Polypodiaceae",
                "https://fr.wikipedia.org/wiki/Pontederiaceae",
                "https://fr.wikipedia.org/wiki/Portulacaceae",
                "https://fr.wikipedia.org/wiki/Potamogetonaceae",
                "https://fr.wikipedia.org/wiki/Primulaceae",
                "https://fr.wikipedia.org/wiki/Proteaceae",
                "https://fr.wikipedia.org/wiki/Psilotaceae",
                "https://fr.wikipedia.org/wiki/Pteridaceae",
                "https://fr.wikipedia.org/wiki/Putranjivaceae",
                "https://fr.wikipedia.org/wiki/Ranunculaceae",
                "https://fr.wikipedia.org/wiki/Rhamnaceae",
                "https://fr.wikipedia.org/wiki/Rhizophoraceae",
                "https://fr.wikipedia.org/wiki/Rosaceae",
                "https://fr.wikipedia.org/wiki/Rubiaceae",
                "https://fr.wikipedia.org/wiki/Ruppiaceae",
                "https://fr.wikipedia.org/wiki/Rutaceae",
                "https://fr.wikipedia.org/wiki/Salicaceae",
                "https://fr.wikipedia.org/wiki/Santalaceae",
                "https://fr.wikipedia.org/wiki/Sapindaceae",
                "https://fr.wikipedia.org/wiki/Sapotaceae",
                "https://fr.wikipedia.org/wiki/Scrophulariaceae",
                "https://fr.wikipedia.org/wiki/Selaginellaceae",
                "https://fr.wikipedia.org/wiki/Smilacaceae",
                "https://fr.wikipedia.org/wiki/Solanaceae",
                "https://fr.wikipedia.org/wiki/Stilbaceae",
                "https://fr.wikipedia.org/wiki/Strelitziaceae",
                "https://fr.wikipedia.org/wiki/Surianaceae",
                "https://fr.wikipedia.org/wiki/Tamaricaceae",
                "https://fr.wikipedia.org/wiki/Tectariaceae",
                "https://fr.wikipedia.org/wiki/Theaceae",
                "https://fr.wikipedia.org/wiki/Thelypteridaceae",
                "https://fr.wikipedia.org/wiki/Tropaeolaceae",
                "https://fr.wikipedia.org/wiki/Typhaceae",
                "https://fr.wikipedia.org/wiki/Urticaceae",
                "https://fr.wikipedia.org/wiki/Verbenaceae",
                "https://fr.wikipedia.org/wiki/Violaceae",
                "https://fr.wikipedia.org/wiki/Vitaceae",
                "https://fr.wikipedia.org/wiki/Xanthorrhoeaceae",
                "https://fr.wikipedia.org/wiki/Zingiberaceae",
                "https://fr.wikipedia.org/wiki/Zygophyllaceae"
              ]
                );

              Cela ne me renvoie pas le tableau au final. Avec ton exemple ça marchait pourtant :/

              • Partager sur Facebook
              • Partager sur Twitter
                5 janvier 2021 à 16:43:20

                Ben en fait, le principe de mon exemple consiste purement à aspirer les pages de wikipédia pour obtenir une toute pauvre url. Et wikipédia dispose sans nulle doute d'un dispositif pour bloquer ce genre de pratique, notamment pour un si grand nombre de requêtes. (Tu peux certainement voir à quelle moment tes requêtes finissent par être bloqué dans l'onglet Network, ou Réseau en français, de l'inspecteur chrome.)

                En contrepartie, ils mettent à disposition une api (dont lamecarlate à fait précédemment mention) et qui est censé servir exactement à ça !

                Peut-être que tu peux combinée les deux idées en étudiant un peu le principe des requêtes dans le code que je t'ai donné en exemple, et en étudiant également le fonctionnement de l'API wikipédia (qui fonctionne sur la base de l'URL de requête donc pas besoin de PHP.)

                -
                Edité par BrainError 5 janvier 2021 à 16:44:49

                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2021 à 16:50:47

                  D'accord merci pour vos conseils. Du coup ça donnerait quelque chose dans le genre ? EN fait une fois que j'ai récupéré le nom d el'image, je peux aller la rechercher car l'URL est toujours le même. Mais je ne comprend pas la ligne de imgWikiUrls, je n'arrive pas à l'adapter :/

                  void async function(data) { // On crée une IIFE asynchrone sans retour prenant un argument qui doit être un array d'url wikipédia
                  
                        const parser = new DOMParser(); // On crée un DOMParser
                  
                        const requests1 = await Promise.all(data.map(url => fetch(url))); // Pour chaque url soumises, on envoi une requête fetch et on attends toutes les réponses
                  
                        const responses1 = await Promise.all(requests1.map(request => request.text())); // Pour chaque réponses obtenues, on demande à récupérer le code html de la page sous forme de texte et on attends tout les résultats console.log(JSON.stringify(imgDirectUrls));
                  
                     const imgWikiUrls = responses1.map(response => parser.parseFromString(response, 'text/html').querySelector('.entete + .images > .image').href);
                  
                     console.log(imgWikiUrls);}(
                  
                  [
                  
                  "https://fr.wikipedia.org/w/api.php?format=json&action=query&titles=Amaranthaceae&prop=pageimages&piprop=name&pilimit=10&redirects&continue"]
                  
                    );



                  -
                  Edité par Augustin Écologie 6 janvier 2021 à 16:51:25

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 janvier 2021 à 22:19:03

                    Avec l'API, pas besoin de DOMParser. Tu as cliqué sur le lien que j'avais mis ?

                    Si tu reprends la fonction proposée plus haut, et qu'au lieu des lignes 3 à 11, tu mets un console.log(data), ça te donne quoi ?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Pas d'aide concernant le code par MP, le forum est là pour ça :)

                    Récupérer l'image principale dans wikipedia

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown