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
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 :/
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 .
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.)
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
× 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.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Pas d'aide concernant le code par MP, le forum est là pour ça :)