TP1 : Multimédia sur le Web Robot Web et indexation dʼimages par
Transcription
TP1 : Multimédia sur le Web Robot Web et indexation dʼimages par
TP1 : Multimédia sur le Web Robot Web et indexation dʼimages par contexte Objectifs : ! 1. Développer les fonctionnalités de base d'un robot web en Java ! ! 2. Association de termes textuels à des images de Wikipedia Plusieurs solutions sont envisageables pour l'implémentation du robot. Ici, on s'intéresse à celle qui explore le Web en suivant les liens hypertextes de chaque page, sans se soucier d'une visite régulières de celles ci. Cependant, pour éviter de boucler sur les mêmes pages, le robot ne devra visiter que les liens qu'il n'a pas préalablement rencontré. L'association image/termes pourra consister à nommer les images, téléchargées depuis une page web, par une chaine incluant les 10 termes les plus proches de lʼimage. Pour exemple, la première image JPG figurant sur la page http://en.wikipedia.org/wiki/Paris serait nommée 1-sunk+waves+tossed+latin+mergitur+eiffel+tower+foreground +skyscrapers+paris.jpg. Voici un bout de code utile pour le téléchargement d'une page et la mise en mémoire (variable String) du contenu HTML : String inputLine; URL url = new URL(url_string); BufferedReader in = new BufferedReader( ! new InputStreamReader( ! url.openStream())); while ((inputLine = in.readLine()) != null) ! downloadedString += inputLine; in.close(); Pour le parcours d'une page HTML, vous pourrez utiliser la classe ParserDelegator et implémenter une classe héritant de HTMLEditorKit.ParserCallback, dont le principe est similaire au fonctionnement de l'API SAX. import javax.swing.text.html.*; import javax.swing.text.html.parser.*; public class Callback extends HTMLEditorKit.ParserCallback { ! ! public Callback() { } ! ! public void handleText(char[] data, int pos) { } ! ! public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) { ! ! if (t.equals(HTML.Tag.A)) ! ! ! System.out.println(a.getAttribute(HTML.Attribute.HREF).toString()); ! } ! ! public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) { } ! ! public void handleEndTag(HTML.Tag t, int pos) { } } L’association entre la chaine téléchargée et le parser HTML peut être fait de la façon suvante. On suppose que la fonction String download (String) renvoie le code HTML contenu associé à une url donnée. ! ! ! ! ParserDelegator parser = new ParserDelegator(); Callback callback = new Callback(this); ! ! ! ! Vector<String> fifo = new Vector<String>(); fifo.add(urlstring); ! ! ! ! ! ! true); ! ! while (!fifo.isEmpty()) { ! current_url = fifo.remove(0); ! parser.parse(new StringReader(download(current_url)), callback, } Enregister un fichier binaire (une image) à partir dʼune URL : try { ! String name = "fichiers/"+un_nom+urlstring.substring(urlstring.lastIndexOf('.')); ! URL url = new URL(urlstring); ! FileOutputStream fs = new FileOutputStream(newname); ! InputStream is = url.openStream(); ! while ((c = is.read()) != -1) fs.write(c); ! is.close(); ! fs.close(); } catch (Exception e) {} Partie 1 : Robot et parcours des pages web : 1. Implémentez un algorithme de parcours d'arbre en "largeur d'abord" qui suit les liens rencontrés dans la page. Fixez un paramètre pour la profondeur maximale jusqu'à laquelle le robot naviguera. Veillez à ce que le robot navigue bien malgré les liens relatifs. 2. Stockez en mémoire tous les liens que le crawler à déjà rencontré pour ne visiter que des liens inconnus. Utilisez pour cela un objet de la classe Vector. 3. Rendez le robot conforme à la norme des fichiers « robots.txt ». Vous pourrez le tester sur le site http://www.google.fr. Pour rappel, le fichier « robots.txt » se trouve à la racine d'un serveur. Partie 2 : Indexation dʼimages par le contexte : 4. Téléchargez les fichiers images jpeg présents sur les pages web parcourues. Pour lʼenregistrement dʼun fichier à partir dʼune URL, vous pourrez utiliser le code suivant : ! ! ! URL image_url = new URL(url_string); ! ! ! FileOutputStream fs = new FileOutputStream(image_name); ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! InputStream is = url.openStream(); while ((c = is.read()) != -1) ! fs.write(c); is.close(); fs.close(); 5. Stockez en mémoire tous les termes apparaissant dans une page web, dans leur ordre dʼapparition. Pour cela, vous utiliserez un objet Vector que vous initialiserez à chaque nouvelle page et alimenterez à chaque terme identifié. Pour éviter les mots sans importance, un terme sera considéré comme tel à partir de 3 caractères. 6. Identifiez pour chaque image ces 10 termes plus proches dans la page : 5 termes avant et 5 termes après lʼapparition de lʼimage. 7. Construisez des listes d'images nommées à partir des pages wikipedia de Marseille, Paris, New York, Les Alpes, Tokyo et Timbuktu. On les utilisera par la suite. Hum, notez quʼil faut désactiver la gestion de « robots.txt » pour crawler sur wikipedia...