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...