Voilà, le sujet est peut être pas explicite pour tout le monde, alors je m'explique.
Je travaille souvent, et en majorité de mon temps, à construire des bases de données issues d'extractions faites sur des sites Internet.
Ces BDD sont en général de type annuaires ou similaires.
Comme mes outils ne sont pas encore aboutis, je ne propose pas de code dans un premier temps. Mais je le ferai peut-être par la suite.
Le problème posé consiste à parcourir sur Internet une multitude de sources d'informations pour les remonter de manière construite dans une base de données centrale.
Sur différents sites je peux collecter de l'information sur une entreprise par exemple et j'ai besoin d'en faire une synthèse. Le nom, l'adresse, le numéro de téléphone, l'activité peuvent venir d'un annuaire général.
Les données légales et économiques peuvent provenir des sources d'information des greffes des tribunaux de commerce.
Certaines informations de contacts peuvent provenir d'autres sites ou annuaires spécifiques.
Une fois que je vois l'information, je peux choisir de me rentrer tout celà à la main. C'est long.
Une possibilité intéressante est de passer les pages cibles dans la moulinette d'un programme qui les télécharge pour les stocker provisoirement avant traitement.
Seulement là on bute sérieusement sur la disparité des formats, la difficulté d'identifier des contenus dans des sources de pages Web, et la systématique disparité de contenu des pages de même type.
Par contre, même si le source des pages est assez peu facile à traiter pour retrouver les informations qui m'intéresse, je pars du principe que si je découvre des séquences communes à une série de pages, c'est qu'il s'agit probablement de zones qui précèdent des contenus utiles, qui eux sont variables.
Première hypothèse posée.
La seconde, c'es que le contenu utile est en général stocké dans des zones qui ne sont pas délimitées par un jeu de balises.
Ma technique consiste donc à lancer des requêtes pour récupérer les pages à la file, en général, je travaille sur des nombres assez impressionnants pour préciser que ce type de requêtes automatisées est à la limite du raisonnable (pas autorisé).
En utilisant un système du type URLDownloadToFile() ou qq chose de plus profond quand c'est nécessaire, on arrive à remonter au moins 1 page par seconde si ce n'est plus. Enfin pas avec un modem 56K quand même.
Ensuite je passe les pages dans un parser qui vire tous les tags et les systèmes de balises, de manière à ne conserver que le contenu texte.
Là, je sais que dans certains cas, je peux perdre de l'information utile (dans les balises <A HREF...> par exemple). Mais tant pis. Il faut se simplifier les choses.
La moulinette en question peut parser ça très rapidement et j'arrive à l'étape suivante, qui consiste à mettre le résultat en forme dans un fichier délimité TAB. J'ai choisi TAB pour pouvoir facilement vérifier la qualité du résultat sous Excel ou autre chose, et pouvoir ensuite repérer facilement les champs avec mes outils Purebasic.
La dernière étape, et c'est la raison pour laquelle je fais ce post, consiste à réaligner tout ça pour pouvoir faire une insertion sans douleur dans une base de données.
La dernière étape respecte le processus suivant :
Je lis le fichier résultat une première fois pour détecter les champs dont le contenu est constant pour tous les enregistrements.
Je note pour chaque champ constant la position maximale de ce champ dans les enregistrements. Oui car ces champs constants peuvent ne pas être à la même place d'un enregistrement, en raison de ce que les pages originales ne contiennent pas toutes les mêmes informations. Et donc le source HTML peut ne pas contenir certains champs, ou certaines réponses à des champs de formulaire par exemple.
Une fois repérés les champs constants et leur position maximale, je relis le fichier délimité TAB, et je déplace toutes les informations de manière à ne rien perdre en route, et à parvenir à aligner les champs constants en colonnes. Donc toutes les informations variables contenues sont alors à peu près alignées.
Et les champs constants me permettent de savoir à quoi correspondent les informations variables.
J'ai fait l'expérience avec mes petits outils. J'avais besoin de remonter environ 25.000 enregistrements, donc 25.000 pages.
Pour parvenir à un résultat satisfaisant, et hors développements des outils, celà fait des années que j'avance sur le sujet, il m'en a couté 4 heures de temps.
Voilà. Je mets ça en discussion générale dans un premier temps, au cas où le partage de ce genre de technique intéresse quelqu'un. Et dans ce cas, je veux bien partager expérience et outils.
La description de la phase d'alignement que j'ai fait ici permet de trouver une solution efficace, et c'est un truc que l'on ne trouve pas trop dans les livres.
Les techniques d'extraction de données, de datamining, etc, sont plutôt réservées à des outils hors de prix. J'ai été partenaire et expert Oracle entre autre sur ce genre de sujets.
Mais j'aime bien l'idée de mettre à la disposition des gens des solutions qui tournent sur des PC abordables.
Notez que les sujets sur lesquels je travaille concernent plutôt des données économiques, mais que l'on peut appliquer al méthode à plein de sujets plus ludiques.
Extraction et alignement de données Internet (BDD)
Extraction et alignement de données Internet (BDD)
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Moi quand je pose le problème je vois surtout un paquet de difficultés.
Les premières sont de type technique, là je parle des contenus interactifs (flash, java etc...), des images (souvent avec un petit plan routier) sans oublier les liens pour arriver à l'information et l'information elle-même qui peut être "cachée" ou tronquée (javascript pour écrire l'adresse email sur la page).
Sans même songer à analyser les données, pour moi c'est un boulot titanesque que de vouloir faire ça.
Maintenant si on part d'informations connues comme par exemple une liste de liens qui pointent sur les données brutes cela devient nettement plus envisageable.
La grande difficulté est d'avoir des données cohérentes et une méthode générique, faut faire un compromis.
Mais j'ai une question indiscrète, pourquoi faire cela ?
Les premières sont de type technique, là je parle des contenus interactifs (flash, java etc...), des images (souvent avec un petit plan routier) sans oublier les liens pour arriver à l'information et l'information elle-même qui peut être "cachée" ou tronquée (javascript pour écrire l'adresse email sur la page).
Sans même songer à analyser les données, pour moi c'est un boulot titanesque que de vouloir faire ça.
Maintenant si on part d'informations connues comme par exemple une liste de liens qui pointent sur les données brutes cela devient nettement plus envisageable.
La grande difficulté est d'avoir des données cohérentes et une méthode générique, faut faire un compromis.
Mais j'ai une question indiscrète, pourquoi faire cela ?
Vive le thread-safe !
LeCyb,
C'est un des postulats que je prends au départ. Les contenus actifs sont trop "aléatoires" à récupérer et analyser.
Donc lorsque je sniffe une cible, je procède simplement à une première analyse des URL construites avec du contenu non actif.
Je veux dire par là que dans la plupart des cas, il s'agit de dépasser ce que les serveurs proposent comme informations dynamiques pour arriver aux URL de pages (y compris dynamiques) qui renvoient un contenu élaboré de manière statique.
Une fois gagné ce type d'information il devient assez facile de récupérer des "fiches" d'informations basées sur une requête construite avec l'ID de la fiche.
Et tout devient alors facile.
Disons que par la pratique, j'arrive à des résultats tangibles.
C'est un des postulats que je prends au départ. Les contenus actifs sont trop "aléatoires" à récupérer et analyser.
Donc lorsque je sniffe une cible, je procède simplement à une première analyse des URL construites avec du contenu non actif.
Je veux dire par là que dans la plupart des cas, il s'agit de dépasser ce que les serveurs proposent comme informations dynamiques pour arriver aux URL de pages (y compris dynamiques) qui renvoient un contenu élaboré de manière statique.
Une fois gagné ce type d'information il devient assez facile de récupérer des "fiches" d'informations basées sur une requête construite avec l'ID de la fiche.
Et tout devient alors facile.
Disons que par la pratique, j'arrive à des résultats tangibles.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.