| Accueil |
| dossier | cerig.efpg.inpg.fr | |||||
|---|---|---|---|---|---|---|
|
Page précédente |
Site Web : analyse du trafic et mesure de l'audience |
Page suivante |
| Florent BERLIAT et Jean-Claude SOHM (CERIG-EFPG) (07 juin 2004) |
||
L'audience correspond au nombre de pages vues par les internautes, quel que soit leur format (HTML, PDF, PHP, ASP, etc.). Mesurer l'audience suppose que l'on surmonte les deux difficultés suivantes :
Par "internaute" il faut comprendre les personnes qui interrogent le Web directement via leur navigateur, et celles qui utilisent un aspirateur de site et examinent les pages correspondantes en temps différé.
Les robots sont des logiciels qui parcourent le Web en suivant des liens et/ou qui utilisent des listes de sites référencés. La plupart des robots téléchargent les pages à des fins d'indexation publique (moteurs de recherche) ou privée (site recherchant de l'information à façon pour leurs clients).
Il existe plusieurs méthodes pour séparer les requêtes des robots de celles des internautes :
Pour qui crée sa propre application, et n'a pas les moyens de tenir une liste à jour, la troisième méthode est la seule applicable. Elle n'est pas parfaite (aucune méthode ne l'est), les principales causes d'erreur étant :
Ayant choisi de séparer les robots des internautes sur le critère des images, nous avons vérifié que la table contenant les requêtes des robots comportait très peu d'erreurs.
Pour s'affranchir de l'erreur créée par les mémoires caches, il faut utiliser la méthode des marqueurs. Les entreprises spécialisées dans la mesure d'audience (laquelle fixe le niveau de redevance des bannières publicitaires) pratiquent une méthode complexe basée sur l'utilisation simultanée d'une image de comptage, d'un cookie et d'un script côté client. Au CERIG, nous nous contentons d'utiliser les images de comptages (une image distincte par page Web). Une image de comptage possède une durée de vie nulle, si bien qu'elle n'est pas mise en cache (sauf par les proxys mal configurés). Chaque fois que l'internaute consulte une page du site, l'image de comptage est requise, et cela s'inscrit dans le fichier journal. Nous procédons ensuite à un regroupement sur un niveau (pour les documents s'étalant sur plusieurs pages), ou sur deux niveaux (pour les documents à périodicité mensuelle couvrant plusieurs années). Nous avons exposé dans une note technique le fonctionnement détaillé des images de comptage.
Cette technique nous permet de mesurer l'erreur due aux mémoires caches : pour le site du CERIG, elle est comprise entre 20 et 30 % en moyenne. Mais cette moyenne cache de grosses disparités : l'erreur peut atteindre 50 % pour une page servant de pivot pour la navigation, telle que la page d'accueil du site, une page de premier niveau, ou le sommaire d'un document.
En résumé, nous utilisons :
La somme de ces deux chiffres fournit le trafic global du CERIG, trafic qui atteint actuellement (janvier 2005) les valeurs suivantes :
En utilisant dans Access le sous-menu "Opérations courantes de comptage" que nous avons présenté au chapitre précédent, nous saisissons l'année (ex : 2005), le mois (ex : février) et le jour (ex : 18). Puis, sur la ligne "Fréquentation", nous cliquons sur le bouton "sur une journée". Quelques secondes plus tard, le résultat suivant s'affiche :
![]() |
Nous allons maintenant examiner la manière dont ce résultat a été obtenu.
Première opération : vérification de la saisie. Lorsque nous déclanchons le comptage en cliquant sur un bouton, cet événement "On Click" déclenche une procédure en VBA dont le rôle consiste à vérifier que les trois champs précités ont bien été remplis, puis à lancer la suite des opérations. Le code de cette procédure est représenté ci-dessous.
Private Sub Commande46_Click()
On Error GoTo Err_Commande46_Click
If DCount("*", "pbjours") <> 0 Then
DoCmd.CancelEvent
MsgBox "veuillez remplir le champ jour, mois et annee"
SendKeys "{Esc}"
Else:
Dim stDocName As String
stDocName = "frequentation_jours"
DoCmd.RunMacro stDocName
End If
Exit_Commande46_Click:
Exit Sub
Err_Commande46_Click:
MsgBox Err.Description
Resume Exit_Commande46_Click
End Sub
|
L'opération de vérification utilise une requête de sélection (intitulée "pbjours"), dont le code est représenté sur la figure ci-dessous. Cette requête opère sur une table quelconque de la base, pourvue que ladite table soit de petite taille et ne soit pas vide (dans le cas présent, cette table s'appelle "freq_semaine" ; elle n'est jamais vide -- sauf au départ de l'application -- et elle ne comporte que sept lignes).
SELECT * FROM freq_semaine WHERE ((([forms]![COURANTE]![jours]) Is Null)) OR ((([forms]![COURANTE]![mois]) Is Null)) OR ((([forms]![COURANTE]![annee]) Is Null)); |
Les critères de sélection portent sur le fait que les trois champs requis (année, mois, jour), dans le sous-menu représenté par le formulaire nommé "COURANTE", ont été saisis ou non. Le résultat de la requête est une feuille de données non vide si l'un au moins des trois champs n'est pas renseigné. La fonction DCount de la procédure, qui compte le nombre de lignes de cette feuille de données, donne alors un résultat non nul, et une boîte de message prévient l'opérateur. Dans le cas contraire, la feuille de données est vide, la fonction DCount renvoie un résultat nul, et la procédure enclenche la suite des opérations de comptage, grâce à la macro d'Access intitulée "frequentation_jours".
Deuxième opération : lancer et afficher les comptages. La structure de la macro ("frequentation_jours") qui pilote le comptage est représentée sur la figure ci-dessous.
Avertissements ExécuterSQL OuvrirRequête OuvrirFormulaire ArrêtMacro |
Cette macro fonctionne de la manière suivante :
delete * from table_liaison |
INSERT INTO table_liaison ( annee, mois, semaine, jours, trimestre, periode_debut, periode_fin ) SELECT forms!COURANTE!annee AS Expr1, forms!COURANTE!mois AS Expr2, forms!COURANTE!semaine AS Expr3, forms!COURANTE!jours AS Expr4, forms!COURANTE!trimestre AS Expr5, forms!COURANTE!debut_periode AS Expr6, forms!COURANTE!fin_periode AS Expr7; |
Troisième opération : effectuer les comptages. La structure de la vue "frequentation_jours" est représentée ci-dessous. Cette vue rassemble (en effectuant un produit vectoriel) les données de trois vues calculant respectivement l'audience due aux internautes (via les pages HTML et PDF), celle due aux internautes (via les marqueurs) et la fréquentation des robots. De plus, elle calcule la fréquentation totale (marqueurs + robots).
![]() |
L'imbrication du formulaire d'Access et des vues de SQL Server est représentée sur la figure ci-dessous. Cette structure fait que l'ouverture du formulaire dans Access déclenche l'exécution des vues dans SQL Server.
![]() |
A titre d'exemple, voici comment se présente la vue (intitulée "frequentation_jours2") qui calcule la fréquentation des internautes, basée sur l'utilisation des marqueurs (le terme "date" est mis entre crochets parce qu'il s'agit d'un mot réservé du langage SQL) :
![]() |
En résumé. Le mécanisme qui fournit la fréquentation du site Web pour un jour donné est le suivant :
C'est l'affichage des résultats dans Access qui déclanche les calculs effectués dans SQL Server. On notera que la seule opération lourde -- le calcul des fréquentations, qui met en jeu des tables comportant plusieurs millions de lignes -- s'effectue dans SQL Server et non dans Access.
Grâce au sous-menu Access intitulé "Opérations courantes de comptage", déjà utilisé au paragraphe précédent, nous saisissons l'année (ex : 2005) et le mois (ex : février). Puis, sur la ligne "Consultation", nous cliquons sur le bouton "sur un mois". Quelques secondes plus tard, le résultat suivant s'affiche :
![]() |
Comme on peut le constater sur le bas de la figure, les pages du présent dossier ont été consultées 3301 fois au mois de janvier 2005, ce qui place ce document en en vingtième position. Ce chiffre (3301) représente la somme des fréquentations de toutes les pages constituant le dossier. C'est pour rappeler qu'il s'agit d'un regroupement de fréquentations au niveau du document que nous utilisons le terme "consultation".
Le fonctionnement des images de comptage. Pour permettre le regroupement de la fréquentation au niveau du document, les images de comptage relatives aux pages d'un même document ont une racine commune, comme le montre le tableau ci-dessous, relatif au présent dossier.
| Nom de l'image de comptage | Page du document |
|---|---|
| dossier_analyse-trafic-00.gif | Sommaire |
| dossier_analyse-trafic-01.gif | Page 01 |
| dossier_analyse-trafic-02.gif | Page 02 |
| ........................... | ............... |
| dossier_analyse-trafic-13.gif | Page 13 (ce chapitre) |
| ........................... | ............... |
| dossier_analyse-trafic-16.gif | Annexe 01 |
| ........................... | ............... |
En tronquant les sept derniers caractères du nom de chaque image, on obtient une chaîne de caractères caractéristique du document. Dans la table des marqueurs, une requête de regroupement avec comptage sur les noms d'image tronqués permet de mesurer la consultation de chaque document. La même opération sur les noms d'image non tronqués fournit la fréquentation de chaque page individuellement.
On notera que, dans la table ci-dessus, chaque document apparaît avec un certain nombre d'attributs : son titre, le nom de la rubrique à laquelle il appartient, et son type dans la rubrique. Toutes ces informations sont stockées dans une table intitulée "reference", qui établit la correspondance entre ces attributs et le nom de l'image de comptage tronqué.
Première opération : vérification de la saisie. Le fonctionnement de cette opération est similaire à celui de l'exemple précédent. La procédure correspondante, et la structure de la requête "pbmois", sont représentées ci-dessous dans cet ordre.
Private Sub Commande40_Click()
On Error GoTo Err_Commande40_Click
If DCount("*", "pbmois") <> 0 Then
DoCmd.CancelEvent
MsgBox "veuillez remplir le champ mois et annee"
SendKeys "{Esc}"
Else:
Dim stDocName As String
stDocName = "consultation_mois"
DoCmd.RunMacro stDocName
End If
Exit_Commande40_Click:
Exit Sub
Err_Commande40_Click:
MsgBox Err.Description
Resume Exit_Commande40_Click
End Sub
|
SELECT * FROM freq_semaine WHERE ((([forms]![COURANTE]![mois]) Is Null)) OR ((([forms]![COURANTE]![annee]) Is Null)); |
Deuxième opération : lancer et afficher les comptages. La structure de la macro d'Access (intitulée "consultation_mois") qui pilote le comptage est représentée sur la figure ci-dessous.
Avertissements ExécuterSQL OuvrirRequête ExécuterSQL CopierObjet OuvrirRequête OuvrirFormulaire ArrêtMacro |
Comme précédemment, la commande "Avertissements" rend la macro silencieuse et la première commande "ExécuterSQL" vide la table "table_liaison". La première commande "OuvrirRequête" introduit dans cette table les coordonnées du mois (année, mois).
La seconde commande "ExécuterSQL" supprime la table "consultation", que la commande "CopierObjet" reconstitue vide à partir d'un modèle. Cette opération est nécessaire, pour faire repartir à un le compteur du champ dont le type de donnée est "Numauto". Ce champ est utilisé pour établir un classement des documents par ordre de fréquentation décroissante. Un simple nettoyage de la table ne remettrait pas à zéro le compteur de la numérotation automatique ; en effet, quand une ligne est supprimée, Access ne récupère pas le numéro correspondant.
La seconde commande "OuvrirRequête" lance une requête ajout intitulée "consultation_mois", qui fonctionne dans Access, et dont la structure est représentée ci-dessous.
![]() |
Cette requête récupère les données de consultation calculées par SQL Server et présentes dans la vue "dbo_consultation_mois", rajoute les attributs puisés dans la table de référence, classe le tout par ordre de consultation décroissante, et l'introduit dans la table "consultation" nouvellement créée. Le contenu de la colonne classement, de type Numauto, est rempli par le SGBD Access lui-même.
On note que la relation entre les deux tables sur lesquelles porte la requête, est pourvue d'une jointure externe. Cela tient au fait qu'une image de comptage -- qui vient d'être créée lorsqu'une nouvelle page Web est mise en ligne -- n'a pas encore été introduite dans la table "reference", mais donne déjà naissance à des enregistrements dans la vue "dbo_consultation_mois". Grâce à la jointure externe, une ligne presque vide apparaît dans la table "consultation", ce qui attire l'attention de l'opérateur, et l'incite à compléter la table "reference".
Pour terminer, la macro déclanche l'ouverture du formulaire qui affiche le contenu de la table "consultation".
Troisième opération : effectuer les comptages. SQL Server, qui reçoit d'Access l'information mois+année, doit la transformer en une liste de jours pour pouvoir l'exploiter. C'est le rôle de la vue intitulée "req_mois", dont la structure est représentée ci-dessous. On notera qu'avant de l'utiliser, SQL Server copie la table de liaison en provenance d'Access, et la renomme "table_liaison_1".
![]() |
Le calcul des consultations est effectué par la vue "consultation", dont la structure est représentée ci-dessous. (NB : le terme "opérations" dans la colonne éponyme signifie "regroupement". Qu'on se le dise !)
![]() |
Le déclanchement de l'exécution la requête "consultation_mois" dans Access entraîne celui de la vue "dbo_consultation_mois" dans SQL Server. La figure ci-dessous représente l'emboîtement correspondant.
![]() |
Les deux exemples qui sont exposés dans cette page montrent de manière pratique comment un peut gérer une grosse base de données dans un SGBD lourd tel que SQL Server, tout en pilotant l'interface utilisateur via un SGBD convivial tel qu'Access. L'expérience montre que les performances sont au rendez-vous, parce que nous avons pris soin d'effectuer les opérations lourde dans le SGBD le plus puissant.
Dans le premier exemple, le calcul d'une fréquentation quotidienne du site Web met en jeu trois grandes tables, dont la taille est actuellement (25 février 2005) :
et l'opération s'effectue en six secondes environ.
Dans le second exemple, le calcul des consultations de tous les documents du site Web met en jeu la table de marqueurs (5 millions d'enregistrements), et l'opération s'effectue en trois secondes environ.
|
||||||||||||
| Mise en page : J.C. Sohm | ||||||||||||