2009-07-29 11 views
7

Quel est un bon moyen de mettre en œuvre un compteur de pages Web?Comment implémenter un compteur de pages Web fiable?

Sur la surface c'est un problème simple, mais il devient problématique lorsqu'il s'agit de robots de moteur de recherche et de robots, plusieurs clics par le même utilisateur, rafraîchir les clics.

Plus précisément, quel est un bon moyen de s'assurer que les liens ne sont pas simplement «cliqués» par l'utilisateur en cliquant plusieurs fois? Adresse IP? Biscuits? Les deux ont quelques inconvénients (les adresses IP ne sont pas nécessairement uniques, les cookies peuvent être désactivés).

De même, quel est le meilleur moyen de stocker les données? Incrémenter un compteur individuellement ou stocker chaque clic en tant qu'enregistrement dans une table de journal, puis résumer de temps en temps.

Toute expérience en direct serait utile,

+++ --- Rick

+1

Vous posez une question très difficile. Réfléchissez à la façon dont Google traite le problème du clic sur mfraud et vous aurez une idée de la taille de votre question. – backslash17

+0

Je suis d'accord .. pas un problème facile .. bien que je me suis toujours demandé pourquoi les serveurs Web n'offrent pas de bonnes solutions d'analyse. Je dis gifler Google Analytics dessus et l'appeler fait .. sauf si vous essayez de réinventer la roue certes cassée. – madcolor

+0

Compris, mais c'est pourquoi je demande ici: -}. Je ne suis pas vraiment après l'analyse ici, mais un compteur similaire à ici sur SO pour afficher le nombre de vues au moins semi-fiable. –

Répondre

2

J'ai donc joué un peu avec ça en me basant sur les commentaires ici. Ce que j'ai trouvé est de compter un compteur dans un champ simple. Dans mon application, j'ai des entités de fragment de code avec une propriété Views.

Lorsqu'un extrait est considéré une méthode filtres sur (liste blanche) juste ce qui devrait, espérons-être les navigateurs:

public bool LogSnippetView(string snippetId, string ipAddress, string userAgent) 
{ 
    if (string.IsNullOrEmpty(userAgent)) 
     return false; 

    userAgent = userAgent.ToLower(); 

    if (!(userAgent.Contains("mozilla") || !userAgent.StartsWith("safari") || 
     !userAgent.StartsWith("blackberry") || !userAgent.StartsWith("t-mobile") || 
     !userAgent.StartsWith("htc") || !userAgent.StartsWith("opera"))) 
     return false; 

    this.Context.LogSnippetClick(snippetId, IpAddress); 
} 

La procédure stockée utilise ensuite une table séparée pour maintenir temporairement les dernières vues qui stockent l'extrait Id , date d'entrée et adresse IP. Chaque vue est enregistrée et lorsqu'une nouvelle vue arrive, elle est vérifiée pour voir si la même adresse IP a accédé à cet extrait au cours des 2 dernières minutes. si c'est le cas, rien n'est enregistré. S'il s'agit d'une nouvelle vue, la vue est enregistrée (à nouveau SnippetId, IP, Entered) et le champ Views est mis à jour dans la table Snippets.

Si ce n'est pas une nouvelle vue, la table est nettoyée avec toutes les vues enregistrées datant de plus de 4 minutes. Cela devrait entraîner un nombre minmal d'entrées dans la table de journal View à tout moment.

Voici le proc stocké:

ALTER PROCEDURE [dbo].[LogSnippetClick] 
    -- Add the parameters for the stored procedure here 
    @SnippetId AS VARCHAR(MAX), 
    @IpAddress AS VARCHAR(MAX)   
    AS 
    BEGIN 

    SET NOCOUNT ON; 

    -- check if don't allow updating if this ip address has already 
    -- clicked on this snippet in the last 2 minutes 
    select Id from SnippetClicks 
     WHERE snippetId = @SnippetId AND ipaddress = @IpAddress AND 
       DATEDIFF(minute, Entered, GETDATE()) < 2  

    IF @@ROWCOUNT = 0 
    BEGIN    
     INSERT INTO SnippetClicks 
      (SnippetId,IpAddress,Entered) VALUES 
      (@SnippetId,@IpAddress,GETDATE())   
     UPDATE CodeSnippets SET VIEWS = VIEWS + 1 
      WHERE id = @SnippetId 
    END 
    ELSE 
    BEGIN 
     -- clean up 
     DELETE FROM SnippetClicks WHERE DATEDIFF(minute,Entered,GETDATE()) > 4 
    END 
END 

Cela semble fonctionner assez bien. Comme d'autres l'ont mentionné, ce n'est pas parfait, mais il semble que ce soit assez bon pour les tests initiaux.

0

Si vous arrivez à utiliser PHP, vous pouvez utiliser des sessions pour suivre l'activité des utilisateurs particuliers. En conjonction avec une base de données, vous pouvez suivre l'activité à partir d'adresses IP particulières, que vous pouvez supposer être le même utilisateur. Utilisez les horodatages pour limiter les accès (par exemple, pas plus de 1 appel par 5 secondes) et pour savoir quand de nouvelles "visites" du site se produisent (si le dernier accès a eu lieu il y a plus de 10 minutes, par exemple) .

Vous pouvez trouver les propriétés $ _SERVER [] qui vous aident à détecter les bots ou les tendances des visiteurs (telles que l'utilisation du navigateur).

éditer: J'ai déjà enregistré des visites & visites, en comptant une page vue comme un hit, et +1 aux visites lorsqu'une nouvelle session est créée. C'était assez fiable (plus que suffisamment fiable pour les raisons pour lesquelles je l'ai utilisé.) Les navigateurs qui ne supportent pas les cookies (et donc pas les sessions) et les utilisateurs qui désactivent les sessions sont assez rares de nos jours, donc je ne m'inquiéterais pas à moins qu'il y ait une raison d'être excessivement précis

+0

Les adresses IP ne sont pas fiables à long terme. – Cameron

+0

L'utilisation d'ASP.NET (MVC) et bien que Session soit une option ne va pas aider avec l'accès sans cookie des robots. Plus session a un peu de frais généraux que cette application n'aurait pas besoin autrement. –

4

Utilisez les adresses IP en conjonction avec les sessions Comptez chaque nouvelle session pour une adresse IP en une seule fois contre votre compteur. Vous pouvez stocker ces données dans une base de données de journal si vous pensez Cela peut être utile pour calculer quand votre site obtient le plus de trafic, combien de trafic par jour, par IP, etc.

0

Si j'étais vous, j'abandonnerais mon compteur étant précis en premier lieu, toutes les solutions (par exemple les cookies, les adresses IP, etc.), comme vous l'avez dit, a tendance à être peu fiable. Donc, je pense que votre meilleur pari est d'utiliser la redondance dans votre système: utiliser des cookies, des "cookies Flash" (objets partagés), des adresses IP (éventuellement en conjonction avec des user-agents) et des ID utilisateur pour les personnes connectées.

Vous pouvez implémenter une sorte de schéma dans lequel un client inconnu reçoit un ID unique, qui est stocké (espérons-le) sur la machine du client et retransmis à chaque requête. Vous pouvez ensuite associer une adresse IP, un agent utilisateur et/ou un ID utilisateur (plus tout ce que vous pouvez imaginer) à chaque ID unique et vice-versa. L'horodatage et l'ID unique de chaque clic peuvent être enregistrés dans une table de base de données quelque part, et chaque clic (au moins, chaque clic sur votre site Web) peut être autorisé ou refusé selon la date du dernier clic pour le même ID unique. C'est probablement assez fiable pour les clics de courte durée, et à long terme, peu importe de toute façon (pour le problème du clic, pas le compteur de page).

Les robots amis doivent être correctement configurés et peuvent être comparés à une liste d'agents utilisateurs de robots connus (j'ai trouvé un here après une simple recherche sur Google) afin d'être correctement identifiés et traités par de vraies personnes.

+0

Merci Cameron. C'est où je suis à ce stade. Le point de la question a été de voir s'il y a de meilleures approches disponibles. –

Questions connexes