« Web scraping » : différence entre les versions

De EduTech Wiki
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
 
(23 versions intermédiaires par 4 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{Ebauche}}
{{tutoriel
|fait_partie_du_cours=Analytique et exploration de données
|fait_partie_du_module=Text mining
|statut=à finaliser
|cat tutoriels=Analytique et exploration de données
|difficulté=intermédiaire
}}


==Définition==
==Définition==
Ligne 7 : Ligne 13 :
Le web scraping est utilisé dans différents activités telles que :
Le web scraping est utilisé dans différents activités telles que :


* Utilisation privée : par exemple dans le cas de services online qui permettent d'agréger des éléments provenant de différents sites (e.g. [[Netvibes]])
* Utilisation privée : par exemple dans le cas de services online qui permettent d'agréger des éléments provenant de différents sites (exemple : [[Netvibes]])
* Recherche académique : le web est une ressource de données qui concernent plusieurs domaines et le grand nombre de données disponibles permettent, parfois, de combler les biais méthodologiques liées aux informations disponibles dans le web (véridicité, authenticité, etc.)
* Recherche académique : le web est une source de données qui concerne plusieurs domaines et le grand nombre de données disponibles permettent, parfois, de combler les biais méthodologiques liés aux informations disponibles sur le web (véridicité, authenticité, etc.)
* Utilisation commerciale : comparaison entre informations disponibles entre sites concurrents  (e.g. billets d'avion de différentes compagnie pour le même trajet)
* Utilisation commerciale : comparaison entre informations disponibles entre sites concurrents  (exemple : billets d'avion de différentes compagnie pour le même trajet)
* Analyse marketing : les "traces" laisées sur internet sont de plus en plus nombreuses et permettent de fournir une idée de nos préférences, habitudes, etc. - ces données peuvent très bien être exploitées pour des analyse de marketing (dans le cadre notamment de la publicité online)
* Analyse marketing : les "traces" laissées sur internet sont de plus en plus nombreuses et permettent de fournir une idée de nos préférences, habitudes, etc. - ces données peuvent très bien être exploitées pour des analyses de marketing (dans le cadre notamment de la publicité online)


===Modalités d'extraction===
===Modalités d'extraction===
Ligne 28 : Ligne 34 :


===Techniques d'extraction===
===Techniques d'extraction===
Dans le cadre d'extractions automatiques ou sémi-automatique il est nécessaire d'identifier dans les documents analysés les données d'intérêt afin de le séparer de l'ensemble du contenu. Voici une liste non exhaustive de techniques qui peuvent être utilisées :
Dans le cadre d'extractions automatiques ou semi-automatiques, il est nécessaire d'identifier dans les documents analysés les données d'intérêt afin de les séparer de l'ensemble du contenu. Voici une liste non exhaustive de techniques qui peuvent être utilisées :


* Expressions régulières
* Expressions régulières
Ligne 35 : Ligne 41 :


====Expressions régulières====
====Expressions régulières====
Les [[Expression régulière|expressions régulières]] sont une fonctionnalité disponible pratiquement dans tout langage de programmation et qui permet d'identifier des patterns à l'intérieur de contenu textuel. Grâce à un syntaxe qui permet de combiner plusieurs règles d'analyse en même temps, il est possible d'extraire de manière ponctuelle des éléments qui correspondent aux critères définit dans l'expression régulière. Le mécanisme consiste à rechercher toutes les ressemblances entre la chaîne des caractères à trouver (le pattern) à l'intérieur du contenu cible de l'analyse. Les expressions régulières sont une techniques très puissante d'extraction de contenu car elles s'appliquent indépendamment de la structure du document analysé. Cette puissance nécessite cependant d'une syntaxe assez complexe qui n'est pas très intuitive.  
Les [[Expression régulière|expressions régulières]] sont une fonctionnalité disponible pratiquement dans tout langage de programmation et qui permet d'identifier des patterns à l'intérieur de contenu textuel. Grâce à une syntaxe qui permet de combiner plusieurs règles d'analyse en même temps, il est possible d'extraire de manière ponctuelle des éléments qui correspondent aux critères définis dans l'expression régulière. Le mécanisme consiste à rechercher toutes les ressemblances entre la chaîne de caractères à trouver (le pattern) à l'intérieur du contenu cible de l'analyse. Les expressions régulières sont une technique très puissante d'extraction de contenu car elles s'appliquent indépendamment de la structure du document analysé. Cette puissance nécessite cependant une syntaxe assez complexe qui n'est pas très intuitive.  


====XPath====
====XPath====
[[Tutoriel XPath|XPath]] est un standard du W3C (l'organisme qui s'occupe des standards du Web) pour trouver des éléments dans un document XML. Ce langage exploite la structure hiérarchique des nœuds (et attributs) d'un document XML et nécessite par conséquent d'une structure du document très précise, ce qui n'est pas forcément le cas dans le pages HTML (voir plus bas dans la section HTML et web scraping).  
[[Tutoriel XPath|XPath]] est un standard du W3C (l'organisme qui s'occupe des standards du Web) pour trouver des éléments dans un document XML. Ce langage exploite la structure hiérarchique des nœuds (et attributs) d'un document XML et nécessite par conséquent une structure de document très précise, ce qui n'est pas forcément le cas dans les pages HTML (voir plus bas dans la section HTML et web scraping).
 
* Voir [[Web scraping avec R]]


====Traverser le DOM====
====Traverser le DOM====
Cette technique est similaire à XPath car elle exploite également la structure hiérarchique d'une page web à travers le DOM (Document Object Model). Il s'agit encore une fois d'un standard W3C qui permet d'accéder au contenu des différents balises d'une page HTML grâce à leur positionnement hiérarchique dans la page. Pour accéder au contenu d'intérêt on peut utiliser par exemple la notation des [[CSS]] (feuilles de style).
Cette technique est similaire à XPath car elle exploite également la structure hiérarchique d'une page web à travers le DOM ([[Document Object Model]]). Il s'agit encore une fois d'un standard W3C qui permet d'accéder au contenu des différentes balises d'une page HTML grâce à leur positionnement hiérarchique dans la page. Pour accéder au contenu d'intérêt, on peut utiliser par exemple la notation des [[CSS]] (feuilles de style).
 
* Voir [[Web scraping avec R]]


==Web scraping et web sémantique==
==Web scraping et web sémantique==
(Section à completer...)
Le web scraping assume une grande importance en fonction de l'évolution progressive du web qui est passé d'un énorme réseau hypermedia de contenu (c'est-à-dire de documents) créés par des humains, à un système d'intégration de contenu généré par différents agents. Ces agents sont bien sûr parfois encore des humains, mais ils sont désormais de plus en plus d'autres dispositifs tels que des bases de données, des senseurs de température, webcams, lecteurs optiques, etc. Les données mises à disposition par ces dispositifs peuvent être analysées ultérieurement par d'autres dispositifs encore. On parle dans ce cas de "'''communication entre machines'''". Ce type de communication nécessite de paramètres beaucoup plus stricts par rapport à la communication humaine : les dispositifs n'ont évidemment pas la même capacité d'abstraction pour faire des inférences sur le contenu si ce n'est pour la structure de l'information. Pour faciliter la communication entre machines à travers le web, plusieurs initiatives ont été essayées. Parmi ces initiatives on retrouve :
 
Le web scraping assume une grande importance en fonction de l'évolution progressive du web qui est passé d'un énorme réseau hypermedia de contenu (i.e. de documents) créé par des humains, à un système d'intégration de contenu généré par différents agents. Ces agents sont bien sûr parfois encore des humains, mais ils sont désormais de plus en plus d'autres dispositifs tels que des bases de données, des senseurs de température, webcams, lecteurs optiques, etc. Les données mises à disposition par ces dispositifs peuvent être analysées ultérieurement par d'autres dispositifs encore. On parle dans ce cas de "'''communication entre machines'''". Ce type de communication nécessite de paramètres beaucoup plus stricts par rapport à la communication humaine : les dispositifs n'ont évidemment pas la même capacité d'abstraction pour faire des inférences sur le contenu si ce n'est pour la structure de l'information. Pour faciliter la communication entre machines à travers le web, plusieurs initiatives ont été essayées. Parmi ces initiatives on retrouve :


* Les API  (Application Programming Interface) : dans le cadre des applications web, les API représentent des interfaces qui permettent d'obtenir le contenu dans des formats différents par rapport à l'HTML standard des pages mises à disposition pour les navigateurs web. Ces formats alternatifs sont souvent des formats exclusivement textuels (donc sans balises) ou XML.  Ce même Wiki dispose par exemple d'une [http://edutechwiki.unige.ch/fmediawiki/api.php API]
* Les API  (Application Programming Interface) : dans le cadre des applications web, les API représentent des interfaces qui permettent d'obtenir le contenu dans des formats différents par rapport à l'HTML standard des pages mises à disposition pour les navigateurs web. Ces formats alternatifs sont souvent des formats exclusivement textuels (donc sans balises), [[JSON]] ou [[XML]].  Ce même Wiki dispose par exemple d'une [http://edutechwiki.unige.ch/fmediawiki/api.php API]
* Les [[RSS]] : les "really simple syndacation" sont des documents XML utilisés souvent dans le cadre de blog ou sites de news pour faciliter la diffusion des nouvelles informations disponibles.  Les RSS sont un bon exemple des difficultés de trouver des standards adéquats dans la communication machine-machine car il existe plusieurs formats RSS et aucun ne peut se considérer officiel.  
* Les [[RSS]] : la [[syndication de contenu web]] se fait à travers des documents XML utilisés souvent dans le cadre de blog ou sites de news pour faciliter la diffusion des nouvelles informations disponibles.  Les RSS sont un bon exemple des difficultés de trouver des standards adéquats dans la communication machine-machine car il existe plusieurs formats RSS et aucun ne peut se considérer officiel.  
* Metadonnées, microformats, microdata, ... : tous ces éléments partagent l'idée de créer des schémas pour identifier facilement du contenu particulier à l'intérieur des pages web. Cependant, chacun de ses éléments est basé sur l'acceptation des ces schémas en tant que standards partagés, et jusqu'à présent aucun standard ne s'est jamais imposé.  
* Metadonnées, microformats, microdata, ... : tous ces éléments partagent l'idée de créer des schémas pour identifier facilement du contenu particulier à l'intérieur des pages web. Cependant, chacun de ses éléments est basé sur l'acceptation des ces schémas en tant que standards partagés, et jusqu'à présent aucun standard ne s'est jamais imposé.  


Ligne 55 : Ligne 63 :


==Web scraping et HTML==
==Web scraping et HTML==
Les difficultés dans l'extraction de données à partir d'une page web sont liés au langage [[HTML]] lui-même. En effet, ce langage a représenté différentes fonctions dans le temps et ceci en dépit du fait que sa structure est restée relativement intacte : on peut très bien acceder aujourd'hui aux premières pages mises en ligne dans le Web. Cette compatibilité dans le temps a sans doute des avantages, mais représente également une limite notamment en ce qui concerne la structuration des documents HTML. Pour limiter cette problématique, en 1998 le W3C (l'organisme qui s'occupe des standards du Web) abandonne le format HTML (arrivé à ce point à ce version 4) et entame un processus qui vise à rapprocher le langage HTML aux formats [[XML]] : c'est le format [[XHTML]] 1.0. Ce format implique des règles plus strictes par rapport au format HTML, notamment en ce qui concerne l'emboitement et la fermeture des balises. Ces règles sont censées faciliter la communication entre machine (et par conséquent aussi le web scraping) grâce à une structure plus organisée des données. Cependant, cette organisation ne concerne que la disposition des balises : les documents peuvent être structurées de plusieurs manières à condition qu'ils respectent une certaine ordre dans l'ouverture et fermeture des balises. De plus, les producteurs des navigateurs web n'ont jamais vraiment adhéré aux standards plus stricte en privilégiant une approche pragmatique : montrer le contenu de la page, même avec des erreurs dans le code. Ces aspects sont à la base de l'echec de renforcer les standards dans la version XHTML 2.0. À la place de continuer dans le sciage du XHTML, le W3C a décidé plutôt de poursuivre un projet alternative, appelé HTML5.  À la base de cette nouvelle version du langage il y a un changement de paradigme radical :
Les difficultés dans l'extraction de données à partir d'une page web sont liés au langage [[HTML]] lui-même. En effet, ce langage a représenté différentes fonctions dans le temps et ceci en dépit du fait que sa structure est restée relativement intacte : on peut très bien accéder aujourd'hui [http://info.cern.ch/ aux premières pages mises en ligne dans le Web]. Cette compatibilité dans le temps a sans doute des avantages, mais représente également une limite notamment en ce qui concerne la structuration des documents HTML. Pour limiter cette problématique, en 1998 le W3C (l'organisme qui s'occupe des standards du Web) abandonne le format HTML (arrivé à ce point à la version 4) et entame un processus qui vise à rapprocher le langage HTML aux formats [[XML]] : c'est le format [[XHTML]] 1.0. Ce format implique des règles plus strictes par rapport au format HTML, notamment en ce qui concerne l'emboitement et la fermeture des balises. Ces règles sont censées faciliter la communication entre machine (et par conséquent aussi le web scraping) grâce à une structure plus organisée des données. Cependant, cette organisation ne concerne que la disposition des balises : les documents peuvent être structurées de plusieurs manières à condition qu'ils respectent un certain ordre dans l'ouverture et fermeture des balises. De plus, les producteurs des navigateurs web n'ont jamais vraiment adhéré aux standards plus strictes en privilégiant une approche pragmatique : montrer le contenu de la page, même avec des erreurs dans le code. Ces aspects sont à la base de l'échec de renforcer les standards dans la version XHTML 2.0. À la place de continuer dans le sillage du XHTML, le W3C a plutôt décidé de poursuivre un projet alternatif, appelé [[HTML5]].  À la base de cette nouvelle version du langage il y a un changement de paradigme radical :


* Le [[HTML]] a été pour longtemps considéré comme un '''langage de mise en forme''' des documents web, c'est-à-dire que les balises étaient choisies en fonction du layout final affiché à l'écran. Si on voulait un texte en gros on utilisait la balise <code>b</code>, pour une liste à pouce la combinaison <code>ul > li</code> et ainsi de suite.
* Le [[HTML]] a longtemps été considéré comme un '''langage de mise en forme''' des documents web, c'est-à-dire que les balises étaient choisies en fonction du layout final affiché à l'écran. Si on voulait un texte en gras on utilisait la balise <code>b</code>, pour une liste à puces la combinaison <code>ul > li</code> et ainsi de suite.
* Grâce à l'introduction des feuilles de style [[CSS]], la '''structure graphique de la page est prise en charge par les propriétés de style''', ce qui permet notamment de faire apparaitre deux balises différentes exactement de la même manière à l'écran. Cette constatation implique que les balises HTML perdent leur intérêt graphique, car le comportement de toute balise peut être achevé par une autre balises avec les mêmes propriétés de style.
* Grâce à l'introduction des feuilles de style [[CSS]], la '''structure graphique de la page est prise en charge par les propriétés de style''', ce qui permet notamment de faire apparaitre deux balises différentes exactement de la même manière à l'écran. Cette constatation implique que les balises HTML perdent leur intérêt graphique, car le comportement de toute balise peut être achevé par une autre balise avec les mêmes propriétés de style.
* Libéré de sa fonction graphique, le langage [[HTML]] peut donc être utilisé en tant que véritable '''langage de démarcation''' (i.e. mark-up) selon des critères d'association '''balise > contenu''' plutôt que balise > forme.
* Libéré de sa fonction graphique, le langage [[HTML]] peut donc être utilisé en tant que véritable '''langage de démarcation''' (c'est-à-dire mark-up) selon des critères d'association '''balise > contenu''' plutôt que balise > forme.


Cette constatation est à la base de la philosophie "sémantique" de [[HTML5]]
Cette constatation est à la base de la philosophie "sémantique" de [[HTML5]]
Ligne 71 : Ligne 79 :
====Les balises de structuration du contenu====
====Les balises de structuration du contenu====


Dans la perspective des développeurs de pages web il y a souvent des éléments qui sont présents dans la plupart des sites : une entête qui suggère l'argument du site, un menu de navigation qui permet d'accéder aux différents ressources disponibles, le contenu principale de la page (c'est-à-dire ce qui la rend "unique" par rapport aux autres pages du site), et ainsi de suite. Avant l'introduction de balises spécifiques en [[HTML5]], les développeurs utilisé pour chacun des ses éléments récurrents une balise div à laquelle ils associaient une classe souvent avec une relation sémantique avec le contenu, par exemple <code>div class="header"</code> pour l'entête, <code>div class="navigation"</code> pour le menu, et ainsi de suite. Cette pratique était cependant loin de représenter un standard : d'une part, chaque développeur pouvait choisir son propre nom de class (par exemple dans sa propre langue maternelle), et de l'autre les classes sont des éléments de style et en accord avec les bonnes pratiques de développement, il faudrait séparer le contenu de la forme. Dans cette perspective, [[HTML5]] introduit des balises telles que :
Dans la perspective des développeurs de pages web il y a souvent des éléments qui sont présents dans la plupart des sites : une entête qui suggère l'argument du site, un menu de navigation qui permet d'accéder aux différentes ressources disponibles, le contenu principal de la page (c'est-à-dire ce qui la rend "unique" par rapport aux autres pages du site), et ainsi de suite. Avant l'introduction de balises spécifiques en [[HTML5]], les développeurs utilisaient pour chacun de ces éléments récurrents une balise <code>div</code> à laquelle ils associaient une classe souvent avec une relation sémantique avec le contenu, par exemple <code>div class="header"</code> pour l'entête, <code>div class="navigation"</code> pour le menu, et ainsi de suite. Cette pratique était cependant loin de représenter un standard : d'une part, chaque développeur pouvait choisir son propre nom de classe (par exemple dans sa propre langue maternelle), et de l'autre les classes sont des éléments de style et en accord avec les bonnes pratiques de développement, il faudrait séparer le contenu de la forme. Dans cette perspective, [[HTML5]] introduit des balises telles que :


* <code>header</code>
* <code>header</code>
Ligne 85 : Ligne 93 :
====Les balises de marquage====
====Les balises de marquage====


D'autres balises ont été introduites mais cette fois-ci dans la perspective de structurer les informations ponctuelles plutôt que la structure générale de la page. Parmi ces balises on trouve <code>time</code>, <code>output</code>, <code>mark</code>, <code>del</code>, ou <code>ins</code>. Prenons l'exemple de la balise time qui sert à signaler la présence dans le code d'une date. Cette balise n'est pas associée à aucune structure graphique, c'est-à-dire que le contenu affiché à l'intérieur de la balise n'a pas de formatage particulier si aucune déclaration [[CSS]] explicite a été déclarée. Son rôle est de signaler la présence d'une date et, à travers l'attribut datetime, rendre disponible la date dans un format compréhensible pour una machine, tandis que le contenu de la balise peut être affiché en fonction des humains. Voici un exemple :
D'autres balises ont été introduites mais cette fois-ci dans la perspective de structurer les informations ponctuelles plutôt que la structure générale de la page. Parmi ces balises on trouve <code>time</code>, <code>output</code>, <code>mark</code>, <code>del</code>, ou <code>ins</code>. Prenons l'exemple de la balise time qui sert à signaler la présence dans le code d'une date. Cette balise n'est pas associée à aucune structure graphique, c'est-à-dire que le contenu affiché à l'intérieur de la balise n'a pas de formatage particulier si aucune déclaration [[CSS]] explicite n'a été déclarée. Son rôle est de signaler la présence d'une date et, à travers l'attribut datetime, rendre disponible la date dans un format compréhensible pour une machine, tandis que le contenu de la balise peut être affiché en fonction des humains. Voici un exemple :


<source lang="HTML5">
<source lang="HTML5">
<p>La conférence sur le web sémantique est prévue pour <time datetime="2014-10-30 18:30:00">jeudi 30 novembre à 18:30</time></p>
<p>La conférence est prévue pour <time datetime="2014-10-30 18:30:00">jeudi 30 novembre à 18:30</time></p>
</source>
</source>


Ligne 101 : Ligne 109 :


====Limites de l'extraction manuelle====
====Limites de l'extraction manuelle====
Les limites techniques de ce type d'extraction concernent principalement le temps et l'effort nécessaires pour extraire une grande quantité de données. Ce type d'extraction est adéquate pour des informations ciblées et avec des critères de choix qui seraient difficile à traduire de manière formelle, mais ne s'adapte pas à une recherche systématique.  
Les limites techniques de ce type d'extraction concernent principalement le temps et l'effort nécessaires pour extraire une grande quantité de données. Ce type d'extraction est adéquat pour des informations ciblées et avec des critères de choix qui seraient difficiles à traduire de manière formelle, mais ne s'adapte pas à une recherche systématique.  


====Limites des extractions automatique et sémi-automatique====
====Limites des extractions automatique et sémi-automatique====
Les extractions automatique et sémi-automatique sont similaires en ce qui concerne les limites techniques, mais se différencie notamment sur deux plans :
Les extractions automatiques et sémi-automatiques sont similaires en ce qui concerne les limites techniques, mais se différencient notamment sur deux plans :


* La '''taille''' et le '''temps''' '''d'extraction''' : la recherche automatique permet d'extraire beaucoup plus d'information et de plusieurs sources en moins de temps
* La '''taille''' et le '''temps''' '''d'extraction''' : la recherche automatique permet d'extraire beaucoup plus d'information et de plusieurs sources en moins de temps
* Le '''degrés de "envahissement"''' sur la source de données extraits : la recherche automatique est généralement beaucoup plus chargée en termes d'impact sur les servers hébergeant les sites analysés
* Le '''degré d' "envahissement"''' sur la source de données extraites : la recherche automatique est généralement beaucoup plus chargée en termes d'impact sur les serveurs hébergeant les sites analysés


Dans les deux cas, les limites techniques suivantes peuvent s'appliquer :
Dans les deux cas, les limites techniques suivantes peuvent s'appliquer :
Ligne 114 : Ligne 122 :
* '''Changement de la structure de l'information''' : même si des critères adéquats pour l'extraction des informations pertinents sont établis, dans le cadre d'une analyse qui s'étale dans le temps, il y a la possibilité que les sites analysés changent de structure et par conséquent les critères utilisés auparavant ne soient plus valides
* '''Changement de la structure de l'information''' : même si des critères adéquats pour l'extraction des informations pertinents sont établis, dans le cadre d'une analyse qui s'étale dans le temps, il y a la possibilité que les sites analysés changent de structure et par conséquent les critères utilisés auparavant ne soient plus valides
** Ce phénomène s'applique surtout aux sites qui utilisent des systèmes de gestion de contenu (e.g. WordPress, mais également Moodle) qui permettent de changer de thème graphique : le changement du thème implique très souvent aussi un changement de la structure de la page
** Ce phénomène s'applique surtout aux sites qui utilisent des systèmes de gestion de contenu (e.g. WordPress, mais également Moodle) qui permettent de changer de thème graphique : le changement du thème implique très souvent aussi un changement de la structure de la page
* Accès restreint à la page : certains contenus d'un site sont disponibles exclusivement à travers un système d'authentification (e.g. login). Même s'il existe des outils qui permettent d'émuler un mécanisme de login, il faudrait en tout cas disposer d'un accès et, surtout, fournir ses propres informations d'accès (username et password) à l'outil d'extraction, c'est-à-dire exposer ses propres droits d'accès
* Accès restreint à la page : certains contenus d'un site sont disponibles exclusivement à travers un système d'authentification (exemple : login). Même s'il existe des outils qui permettent d'émuler un mécanisme de login, il faudrait en tout cas disposer d'un accès et, surtout, fournir ses propres informations d'accès (username et password) à l'outil d'extraction, c'est-à-dire exposer ses propres droits d'accès
* '''Contenu généré dynamiquement''' : certaines pages ne téléchargent pas tout le contenu à la première requête, mais intègrent du contenu en fonction des actions du navigateur. Même si certains outils avancés permettent d'émuler des interactions de ce type, dans la plupart de cas l'analyse est faite sur le contenu HTML disponible lors de la première requête, sans interactions succéssives.  
* '''Contenu généré dynamiquement''' : certaines pages ne téléchargent pas tout le contenu à la première requête, mais intègrent du contenu en fonction des actions du navigateur. Même si certains outils avancés permettent d'émuler des interactions de ce type, dans la plupart des cas, l'analyse est faite sur le contenu HTML disponible lors de la première requête, sans interactions successives.  
* Pour analyser le contenu d'une page web il faut la "visiter", c'est-à-dire générer du traffic pour le server qui l'héberge. Ce type de traffic "non humain" n'est souvent pas très bien accepté par les administrateurs des sites qui disposent de quelques instruments techniques pour le limiter :
* Pour analyser le contenu d'une page web il faut la "visiter", c'est-à-dire générer du traffic pour le server qui l'héberge. Ce type de traffic "non humain" n'est souvent pas très bien accepté par les administrateurs des sites qui disposent de quelques instruments techniques pour le limiter :
** '''Limitation des requêtes dans un délais de temps''' : les administrateurs peuvent limiter le nombre de "hit" (i.e. les fois que l'on accède à une page spécifique ou à n'importe quelle page sur un même domain) provenant de la même source, justement parce que un navigateur "humain" nécessite normalement d'un certain temps pour passer d'une page à l'autre
** '''Limitation des requêtes dans un délais de temps''' : les administrateurs peuvent limiter le nombre de "hit" (i.e. les fois que l'on accède à une page spécifique ou à n'importe quelle page sur un même domain) provenant de la même source, justement parce que un navigateur "humain" nécessite normalement d'un certain temps pour passer d'une page à l'autre
Ligne 125 : Ligne 133 :


===Limites déontologiques/légales===
===Limites déontologiques/légales===
À présent, le cadre légale qui régule les droits de reproduction du contenu web sont de difficile interprétation même pour les experts du secteur et peuvent varier considérablement selon les pays. Un exemple concerne la reproduction des articles des journaux et magazines online dans des news agregator (site d'agrégation de nouvelles) : est-il suffisant de citer la source de l'article pour pouvoir l'afficher sur un autre site ? D'une part, les droits d'auteurs sont en partie respectés parce que la propriété intellectuelle de l'article est citée ; mais d'autre part les éditions online des journaux ont l'intérêt à ce que l'article soit lu sur leur site, où il est souvent accompagné de publicité online, plutôt que sur un autre site.
À présent, le cadre légal qui régule les droits de reproduction du contenu web sont difficilement interprétables même pour les experts du secteur et peuvent varier considérablement selon les pays. Un exemple concerne la reproduction des articles de journaux et magazines online dans des news agregator (site d'agrégation de nouvelles) : est-il suffisant de citer la source de l'article pour pouvoir l'afficher sur un autre site ? D'une part, les droits d'auteurs sont en partie respectés parce que la propriété intellectuelle de l'article est citée ; mais d'autre part les éditions online des journaux ont intérêt à ce que l'article soit lus sur leur site, où il est souvent accompagné de publicité online, plutôt que sur un autre site.


Les problèmes de ce type concernent principalement des situations commerciales, mais même dans le cadre de la recherche certaines "bonnes pratiques" pourraient être adoptées pour éviter des problèmes. Par exemple il serait bien d'avertir les administrateur d'un site si on a l'intention d'analyser du contenu présent dans leurs pages. Même s'il s'agit de contenu public et donc il ne faudrait pas d'autorisation formelle, informer les administrateurs du site à un double intérêt :
Les problèmes de ce type concernent principalement des situations commerciales, mais même dans le cadre de la recherche certaines "bonnes pratiques" pourraient être adoptées pour éviter des problèmes. Par exemple, il serait bien d'avertir les administrateurs d'un site si on a l'intention d'analyser du contenu présent dans leurs pages. Même s'il s'agit de contenu public et donc il ne faudrait pas d'autorisation formelle, informer les administrateurs du site à un double intérêt :


* D'une part, le fait qu'ils en soient au courant évite le péril de limitation technique (voir plus haut dans la page)
* D'une part, le fait qu'ils en soient au courant évite le risque de limitation technique (voir plus haut dans la page)
* De l'autre, les administrateurs peuvent vous donner des informations utiles sur des moyens pour analyser le contenu de la page, notamment à travers l'accès à des API (voir plus haut dans la page)
* De l'autre, les administrateurs peuvent vous donner des informations utiles sur des moyens pour analyser le contenu de la page, notamment à travers l'accès à des API (voir plus haut dans la page)
==Outils de Web scraping==
Il existe plusieurs logiciels et techniques pour faire du web scraping (voir à ce propos [[Outils text mining]]). La liste suivante illustre seulement des outils de "bas niveau" (c'est-à-dire qui ne prévoient pas une finalité plus ou moins explicite, mais qui intègrent le scraping dans une logique de programmation plus étendue) :
{| class="wikitable"
|-
! Outil !! Langage !! Description
|-
| [[Web scraping avec R|rvest]] || [[R]] || Paquet de R qui permet d'importer facilement des données depuis des pages web
|-
| [https://github.com/FriendsOfPHP/Goutte Goutte] || PHP || Bibliothèque PHP pour web scraping/crawling
|-
| [[JQuery|jQuery]] || [[JavaScript]] || Bibliothèque qui permet, notamment grâce à les requêtes asynchrones (AJAX), de faire du scraping côté client
|-
| [http://scrapy.org/ Scrapy] || Python || Bibliothèque python pour le web scraping/crawling
|}


==Références==
==Références==
Ligne 136 : Ligne 160 :
* Berners-Lee, T. (2001). The semantic web. Scientific American, 21.
* Berners-Lee, T. (2001). The semantic web. Scientific American, 21.
* MacDonald, M. (2013). HTML5 the missing manual (2nd edition.). Sebastopol, CA: O’Reilly.
* MacDonald, M. (2013). HTML5 the missing manual (2nd edition.). Sebastopol, CA: O’Reilly.
* McIlraith, S. A., Son, T. C., & Zeng, H. (2001). Semantic web services. IEEE intelligent systems, 16(2), 46-53
* Shadbolt, N., Hall, W., & Berners-Lee, T. (2006). The semantic web revisited. Intelligent Systems, IEEE, 21(3), 96-101.


==Liens==
==Liens==
* [http://en.wikipedia.org/wiki/Web_scraping Web scraping sur Wikipedia (en)]
* [http://en.wikipedia.org/wiki/Web_scraping Web scraping sur Wikipedia (en)]
* [[Text mining de forums]]
* [[Web scraping avec R]]
* [http://www.w3.org/standards/semanticweb/ Semantic Web - W3C]
[[Catégorie:Analytique et exploration de données]]

Dernière version du 18 mars 2020 à 23:43

Analytique et exploration de données
Module: Text mining
à finaliser intermédiaire
2020/03/18
Catégorie: Analytique et exploration de données


Définition

Le web scraping consiste à extraire des informations dans une page web afin de réutiliser les données dans un autre cadre et/ou sous une autre forme par rapport au contenu original. Le web scraping est souvent associé à l'indexation des pages web par les moteurs de recherche (i.e., web crawling). Le web scraping se différencie cependant du web crawling pour ses finalités liées au data mining ou text mining : l'intérêt du web scraping consiste à transformer des données non-structurées disponibles dans le web afin d'obtenir des données qui peuvent être traitées successivement, par exemple à travers des analyses (qualitatives et/ou quantitatives).

Cadre d'utilisation

Le web scraping est utilisé dans différents activités telles que :

  • Utilisation privée : par exemple dans le cas de services online qui permettent d'agréger des éléments provenant de différents sites (exemple : Netvibes)
  • Recherche académique : le web est une source de données qui concerne plusieurs domaines et le grand nombre de données disponibles permettent, parfois, de combler les biais méthodologiques liés aux informations disponibles sur le web (véridicité, authenticité, etc.)
  • Utilisation commerciale : comparaison entre informations disponibles entre sites concurrents (exemple : billets d'avion de différentes compagnie pour le même trajet)
  • Analyse marketing : les "traces" laissées sur internet sont de plus en plus nombreuses et permettent de fournir une idée de nos préférences, habitudes, etc. - ces données peuvent très bien être exploitées pour des analyses de marketing (dans le cadre notamment de la publicité online)

Modalités d'extraction

On peut faire une distinction de base concernant le web scraping selon la modalité d'extraction des données :

  • Extraction manuelle : une personne navigue le web pour extraire informations pertinentes aux intérêts depuis les pages qu'elle visite. La pratique la plus commune pour ce type d'extraction et le simple copier/coller.
  • Extraction sémi-automatique : une personne utilise un logiciel ou une application web pour aspirer/nettoyer les éléments d'une ou plusieurs pages web pertinents aux intérêts.
  • Extraction automatique : l'extraction se fait de manière totalement automatique grâce à l'émulation, par une machine, d'une navigateur web qui visite des pages et qui est capable de suivre les différents liens afin de générer automatiquement un corpus de pages liées entre elles.

Modalités de traitement

Dans les cas d'extraction automatique ou sémi-automatique on peut distinguer ultérieurement par rapport au traitement des données recueilles :

  • Aucun traitement : les données recueillies ne sont pas traitées et sont tout simplement rendues disponibles - par exemple à travers un fichier de texte ou un spreadsheet - pour une analyse successive, à travers notamment un autre logiciel spécialisé (e.g. analyse de texte)
  • Visualisation des données brutes : les données ne sont pas traitées mais seulement organisées selon des critères et les résultats sont affichés à l'aide de représentations graphiques similaires au format original (e.g. news feed, mash-up)
  • Traitement des données : les données sont traitées à travers des algorithmes qui déterminent un certain résultat sur la base des analyses (e.g. comparaison de prix entre marchants online)
  • Traitement des données et visualisation : les données sont traitées et, en plus, une représentation graphique adéquate à l'analyse des données et également fournie (e.g. nuages de mots-clés, cartes conceptuelles)

Techniques d'extraction

Dans le cadre d'extractions automatiques ou semi-automatiques, il est nécessaire d'identifier dans les documents analysés les données d'intérêt afin de les séparer de l'ensemble du contenu. Voici une liste non exhaustive de techniques qui peuvent être utilisées :

  • Expressions régulières
  • XPath
  • Traverser le DOM

Expressions régulières

Les expressions régulières sont une fonctionnalité disponible pratiquement dans tout langage de programmation et qui permet d'identifier des patterns à l'intérieur de contenu textuel. Grâce à une syntaxe qui permet de combiner plusieurs règles d'analyse en même temps, il est possible d'extraire de manière ponctuelle des éléments qui correspondent aux critères définis dans l'expression régulière. Le mécanisme consiste à rechercher toutes les ressemblances entre la chaîne de caractères à trouver (le pattern) à l'intérieur du contenu cible de l'analyse. Les expressions régulières sont une technique très puissante d'extraction de contenu car elles s'appliquent indépendamment de la structure du document analysé. Cette puissance nécessite cependant une syntaxe assez complexe qui n'est pas très intuitive.

XPath

XPath est un standard du W3C (l'organisme qui s'occupe des standards du Web) pour trouver des éléments dans un document XML. Ce langage exploite la structure hiérarchique des nœuds (et attributs) d'un document XML et nécessite par conséquent une structure de document très précise, ce qui n'est pas forcément le cas dans les pages HTML (voir plus bas dans la section HTML et web scraping).

Traverser le DOM

Cette technique est similaire à XPath car elle exploite également la structure hiérarchique d'une page web à travers le DOM (Document Object Model). Il s'agit encore une fois d'un standard W3C qui permet d'accéder au contenu des différentes balises d'une page HTML grâce à leur positionnement hiérarchique dans la page. Pour accéder au contenu d'intérêt, on peut utiliser par exemple la notation des CSS (feuilles de style).

Web scraping et web sémantique

Le web scraping assume une grande importance en fonction de l'évolution progressive du web qui est passé d'un énorme réseau hypermedia de contenu (c'est-à-dire de documents) créés par des humains, à un système d'intégration de contenu généré par différents agents. Ces agents sont bien sûr parfois encore des humains, mais ils sont désormais de plus en plus d'autres dispositifs tels que des bases de données, des senseurs de température, webcams, lecteurs optiques, etc. Les données mises à disposition par ces dispositifs peuvent être analysées ultérieurement par d'autres dispositifs encore. On parle dans ce cas de "communication entre machines". Ce type de communication nécessite de paramètres beaucoup plus stricts par rapport à la communication humaine : les dispositifs n'ont évidemment pas la même capacité d'abstraction pour faire des inférences sur le contenu si ce n'est pour la structure de l'information. Pour faciliter la communication entre machines à travers le web, plusieurs initiatives ont été essayées. Parmi ces initiatives on retrouve :

  • Les API (Application Programming Interface) : dans le cadre des applications web, les API représentent des interfaces qui permettent d'obtenir le contenu dans des formats différents par rapport à l'HTML standard des pages mises à disposition pour les navigateurs web. Ces formats alternatifs sont souvent des formats exclusivement textuels (donc sans balises), JSON ou XML. Ce même Wiki dispose par exemple d'une API
  • Les RSS : la syndication de contenu web se fait à travers des documents XML utilisés souvent dans le cadre de blog ou sites de news pour faciliter la diffusion des nouvelles informations disponibles. Les RSS sont un bon exemple des difficultés de trouver des standards adéquats dans la communication machine-machine car il existe plusieurs formats RSS et aucun ne peut se considérer officiel.
  • Metadonnées, microformats, microdata, ... : tous ces éléments partagent l'idée de créer des schémas pour identifier facilement du contenu particulier à l'intérieur des pages web. Cependant, chacun de ses éléments est basé sur l'acceptation des ces schémas en tant que standards partagés, et jusqu'à présent aucun standard ne s'est jamais imposé.

Malgré ces tentatives, le véhicule principale des données à travers le web reste le langage HTML. Le rapport entre Web scraping et HTML est traité dans la section suivante.

Web scraping et HTML

Les difficultés dans l'extraction de données à partir d'une page web sont liés au langage HTML lui-même. En effet, ce langage a représenté différentes fonctions dans le temps et ceci en dépit du fait que sa structure est restée relativement intacte : on peut très bien accéder aujourd'hui aux premières pages mises en ligne dans le Web. Cette compatibilité dans le temps a sans doute des avantages, mais représente également une limite notamment en ce qui concerne la structuration des documents HTML. Pour limiter cette problématique, en 1998 le W3C (l'organisme qui s'occupe des standards du Web) abandonne le format HTML (arrivé à ce point à la version 4) et entame un processus qui vise à rapprocher le langage HTML aux formats XML : c'est le format XHTML 1.0. Ce format implique des règles plus strictes par rapport au format HTML, notamment en ce qui concerne l'emboitement et la fermeture des balises. Ces règles sont censées faciliter la communication entre machine (et par conséquent aussi le web scraping) grâce à une structure plus organisée des données. Cependant, cette organisation ne concerne que la disposition des balises : les documents peuvent être structurées de plusieurs manières à condition qu'ils respectent un certain ordre dans l'ouverture et fermeture des balises. De plus, les producteurs des navigateurs web n'ont jamais vraiment adhéré aux standards plus strictes en privilégiant une approche pragmatique : montrer le contenu de la page, même avec des erreurs dans le code. Ces aspects sont à la base de l'échec de renforcer les standards dans la version XHTML 2.0. À la place de continuer dans le sillage du XHTML, le W3C a plutôt décidé de poursuivre un projet alternatif, appelé HTML5. À la base de cette nouvelle version du langage il y a un changement de paradigme radical :

  • Le HTML a longtemps été considéré comme un langage de mise en forme des documents web, c'est-à-dire que les balises étaient choisies en fonction du layout final affiché à l'écran. Si on voulait un texte en gras on utilisait la balise b, pour une liste à puces la combinaison ul > li et ainsi de suite.
  • Grâce à l'introduction des feuilles de style CSS, la structure graphique de la page est prise en charge par les propriétés de style, ce qui permet notamment de faire apparaitre deux balises différentes exactement de la même manière à l'écran. Cette constatation implique que les balises HTML perdent leur intérêt graphique, car le comportement de toute balise peut être achevé par une autre balise avec les mêmes propriétés de style.
  • Libéré de sa fonction graphique, le langage HTML peut donc être utilisé en tant que véritable langage de démarcation (c'est-à-dire mark-up) selon des critères d'association balise > contenu plutôt que balise > forme.

Cette constatation est à la base de la philosophie "sémantique" de HTML5

HTML5 et le web sémantique

HTML5 introduit des nouvelles balises qui ont principalement un intérêt sémantique. Ces balises peuvent se diviser en deux catégories :

  • Les balises de structuration du contenu
  • Les balises de marquage

Les balises de structuration du contenu

Dans la perspective des développeurs de pages web il y a souvent des éléments qui sont présents dans la plupart des sites : une entête qui suggère l'argument du site, un menu de navigation qui permet d'accéder aux différentes ressources disponibles, le contenu principal de la page (c'est-à-dire ce qui la rend "unique" par rapport aux autres pages du site), et ainsi de suite. Avant l'introduction de balises spécifiques en HTML5, les développeurs utilisaient pour chacun de ces éléments récurrents une balise div à laquelle ils associaient une classe souvent avec une relation sémantique avec le contenu, par exemple div class="header" pour l'entête, div class="navigation" pour le menu, et ainsi de suite. Cette pratique était cependant loin de représenter un standard : d'une part, chaque développeur pouvait choisir son propre nom de classe (par exemple dans sa propre langue maternelle), et de l'autre les classes sont des éléments de style et en accord avec les bonnes pratiques de développement, il faudrait séparer le contenu de la forme. Dans cette perspective, HTML5 introduit des balises telles que :

  • header
  • nav
  • aside
  • footer
  • main
  • article
  • section

Pour plus de détails consulter la page HTML5.

Les balises de marquage

D'autres balises ont été introduites mais cette fois-ci dans la perspective de structurer les informations ponctuelles plutôt que la structure générale de la page. Parmi ces balises on trouve time, output, mark, del, ou ins. Prenons l'exemple de la balise time qui sert à signaler la présence dans le code d'une date. Cette balise n'est pas associée à aucune structure graphique, c'est-à-dire que le contenu affiché à l'intérieur de la balise n'a pas de formatage particulier si aucune déclaration CSS explicite n'a été déclarée. Son rôle est de signaler la présence d'une date et, à travers l'attribut datetime, rendre disponible la date dans un format compréhensible pour une machine, tandis que le contenu de la balise peut être affiché en fonction des humains. Voici un exemple :

<p>La conférence est prévue pour <time datetime="2014-10-30 18:30:00">jeudi 30 novembre à 18:30</time></p>

Limites du web scraping

Il existe deux types de limites en ce qui concerne la pratique du web scraping :

  • Limites techniques
  • Limites déontologiques/légales

Limites techniques

Selon la modalité d'extraction choisie (voir plus haut dans la page), différentes restrictions techniques peuvent s'appliquer.

Limites de l'extraction manuelle

Les limites techniques de ce type d'extraction concernent principalement le temps et l'effort nécessaires pour extraire une grande quantité de données. Ce type d'extraction est adéquat pour des informations ciblées et avec des critères de choix qui seraient difficiles à traduire de manière formelle, mais ne s'adapte pas à une recherche systématique.

Limites des extractions automatique et sémi-automatique

Les extractions automatiques et sémi-automatiques sont similaires en ce qui concerne les limites techniques, mais se différencient notamment sur deux plans :

  • La taille et le temps d'extraction : la recherche automatique permet d'extraire beaucoup plus d'information et de plusieurs sources en moins de temps
  • Le degré d' "envahissement" sur la source de données extraites : la recherche automatique est généralement beaucoup plus chargée en termes d'impact sur les serveurs hébergeant les sites analysés

Dans les deux cas, les limites techniques suivantes peuvent s'appliquer :

  • Organisation de l'information inconsistente ou chaotique : l'extraction sémi-automatique ou automatique nécessite l'utilisation de critères d'extraction qui impliques la possibilité d'identifier les informations à retenir par rapport aux informations inutiles aux finalités de l'analyse. L'information d'intérêt pourrait dans ce sens être présentée de manière différente selon le site d'appartenance, ou même au sein du même site (voir à ce propos la section Web scraping et HTML).
  • Changement de la structure de l'information : même si des critères adéquats pour l'extraction des informations pertinents sont établis, dans le cadre d'une analyse qui s'étale dans le temps, il y a la possibilité que les sites analysés changent de structure et par conséquent les critères utilisés auparavant ne soient plus valides
    • Ce phénomène s'applique surtout aux sites qui utilisent des systèmes de gestion de contenu (e.g. WordPress, mais également Moodle) qui permettent de changer de thème graphique : le changement du thème implique très souvent aussi un changement de la structure de la page
  • Accès restreint à la page : certains contenus d'un site sont disponibles exclusivement à travers un système d'authentification (exemple : login). Même s'il existe des outils qui permettent d'émuler un mécanisme de login, il faudrait en tout cas disposer d'un accès et, surtout, fournir ses propres informations d'accès (username et password) à l'outil d'extraction, c'est-à-dire exposer ses propres droits d'accès
  • Contenu généré dynamiquement : certaines pages ne téléchargent pas tout le contenu à la première requête, mais intègrent du contenu en fonction des actions du navigateur. Même si certains outils avancés permettent d'émuler des interactions de ce type, dans la plupart des cas, l'analyse est faite sur le contenu HTML disponible lors de la première requête, sans interactions successives.
  • Pour analyser le contenu d'une page web il faut la "visiter", c'est-à-dire générer du traffic pour le server qui l'héberge. Ce type de traffic "non humain" n'est souvent pas très bien accepté par les administrateurs des sites qui disposent de quelques instruments techniques pour le limiter :
    • Limitation des requêtes dans un délais de temps : les administrateurs peuvent limiter le nombre de "hit" (i.e. les fois que l'on accède à une page spécifique ou à n'importe quelle page sur un même domain) provenant de la même source, justement parce que un navigateur "humain" nécessite normalement d'un certain temps pour passer d'une page à l'autre
    • Bloque des adresses IP : si un site reçoit trop de requêtes en même temps, il y a le risque d'enchainer un Denial of Service (DoS), c'est-à-dire que le server ne peut satisfaire toutes les requêtes qu'il reçoit et pour éviter des problèmes il préfère couper les services (ce phénomène est souvent utilisé dans les attaques informatiques). Les administrateur peuvent identifier des adresse IP qui sont la source de nombreuses requêtes et leur empêcher l'accès.
    • Limitation de la bande passante : visiter un site signifie télécharger son contenu, ce qui implique la "consommation" de bande passante d'un server. Dans le cas de petit server et hébergement mutualisés, cette bande peut être limitée sur le mois et une fois dépassée, le site n'est plus disponible jusqu'au mois prochain.
    • Obligation de saisir des données pour acceder à un contenu : surtout dans le cadre d'ouverture de compte online, les sites demandent de saisir des champs qu'une machine ne peut pas remplir (e.g. saisir le texte tiré d'une image, CAPTCHA, etc.)

En conclusion, il faut être très attentif à l'utilisation de systèmes d'extraction, surtout dans le cas d'une extraction massive et répétée dans le temps.

Limites déontologiques/légales

À présent, le cadre légal qui régule les droits de reproduction du contenu web sont difficilement interprétables même pour les experts du secteur et peuvent varier considérablement selon les pays. Un exemple concerne la reproduction des articles de journaux et magazines online dans des news agregator (site d'agrégation de nouvelles) : est-il suffisant de citer la source de l'article pour pouvoir l'afficher sur un autre site ? D'une part, les droits d'auteurs sont en partie respectés parce que la propriété intellectuelle de l'article est citée ; mais d'autre part les éditions online des journaux ont intérêt à ce que l'article soit lus sur leur site, où il est souvent accompagné de publicité online, plutôt que sur un autre site.

Les problèmes de ce type concernent principalement des situations commerciales, mais même dans le cadre de la recherche certaines "bonnes pratiques" pourraient être adoptées pour éviter des problèmes. Par exemple, il serait bien d'avertir les administrateurs d'un site si on a l'intention d'analyser du contenu présent dans leurs pages. Même s'il s'agit de contenu public et donc il ne faudrait pas d'autorisation formelle, informer les administrateurs du site à un double intérêt :

  • D'une part, le fait qu'ils en soient au courant évite le risque de limitation technique (voir plus haut dans la page)
  • De l'autre, les administrateurs peuvent vous donner des informations utiles sur des moyens pour analyser le contenu de la page, notamment à travers l'accès à des API (voir plus haut dans la page)

Outils de Web scraping

Il existe plusieurs logiciels et techniques pour faire du web scraping (voir à ce propos Outils text mining). La liste suivante illustre seulement des outils de "bas niveau" (c'est-à-dire qui ne prévoient pas une finalité plus ou moins explicite, mais qui intègrent le scraping dans une logique de programmation plus étendue) :

Outil Langage Description
rvest R Paquet de R qui permet d'importer facilement des données depuis des pages web
Goutte PHP Bibliothèque PHP pour web scraping/crawling
jQuery JavaScript Bibliothèque qui permet, notamment grâce à les requêtes asynchrones (AJAX), de faire du scraping côté client
Scrapy Python Bibliothèque python pour le web scraping/crawling

Références

  • Berners-Lee, T. (2001). The semantic web. Scientific American, 21.
  • MacDonald, M. (2013). HTML5 the missing manual (2nd edition.). Sebastopol, CA: O’Reilly.
  • McIlraith, S. A., Son, T. C., & Zeng, H. (2001). Semantic web services. IEEE intelligent systems, 16(2), 46-53
  • Shadbolt, N., Hall, W., & Berners-Lee, T. (2006). The semantic web revisited. Intelligent Systems, IEEE, 21(3), 96-101.

Liens