2009-07-29 11 views
7

Jaki jest dobry sposób na wprowadzenie licznika stron internetowych?Jak wdrożyć niezawodny licznik stron internetowych?

Z pozoru jest to prosty problem, ale w przypadku robotów wyszukiwarek i robotów pojawia się problem, wielokrotne kliknięcia tego samego użytkownika, odświeżanie kliknięć.

Co to jest dobry sposób na zapewnienie, że linki nie są po prostu "kliknięte" przez użytkownika przez wielokrotne kliknięcie? Adres IP? Ciasteczka? Oba mają kilka wad (adresy IP niekoniecznie są unikatowe, pliki cookie mogą być wyłączone).

Jaki jest najlepszy sposób przechowywania danych? Zwiększaj licznik indywidualnie lub przechowuj każde kliknięcie jako rekord w tabeli dziennika, a następnie podsumuj sporadycznie.

Wszelkie doświadczenia żywo byłoby pomocne,

+++ Rick ---

+1

Zadajesz bardzo trudne pytanie. Wystarczy pomyśleć o tym, jak Google radzi sobie z problemem mfraud click, a dowiesz się, jak duży może być odpowiedź na twoje pytanie. – backslash17

+0

Zgadzam się .. nie jest to łatwy problem .. chociaż zawsze zastanawiałem się dlaczego serwery sieciowe nie oferują dobrych rozwiązań analitycznych. Mówię "policz" Google Analytics i zadzwoń do niego, chyba że próbujesz odkryć na nowo złamane koło. – madcolor

+0

Zrozumiałem, ale właśnie dlatego proszę tutaj: -}. Naprawdę nie jestem tu po analizie, ale licznik podobny do tego na SO, aby pokazać liczbę wyświetleń przynajmniej częściowo niezawodnie. –

Odpowiedz

2

Więc grałem z tym trochę na podstawie komentarzy tutaj. To, co wymyśliłem, polega na liczeniu kontuaru w prostej dziedzinie. W mojej aplikacji mam elementy kodu ułamkowego z właściwością Wyświetlenia.

Kiedy fragment jest postrzegane metodę odfiltrowuje (biała lista) właśnie co powinno miejmy nadzieję przeglądarek:

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); 
} 

Procedura składowana następnie wykorzystuje oddzielny stolik tymczasowo posiadają najnowsze poglądy, które przechowują fragment Id , wprowadzona data i adres IP. Każdy widok jest rejestrowany i kiedy pojawia się nowy widok, jest on sprawdzany, aby sprawdzić, czy ten sam adres IP uzyskał dostęp do tego fragmentu w ciągu ostatnich 2 minut. jeśli tak, nic nie jest rejestrowane.

Jeśli jest to nowy widok, widok jest rejestrowany (ponownie SnippetId, IP, Wprowadzony), a rzeczywiste pole Widoki jest aktualizowane w tabeli Snippet.

Jeśli nie jest to nowy widok, tabela jest czyszczona przy wszystkich zarejestrowanych widokach starszych niż 4 minuty. Powinno to spowodować w dowolnym momencie minimalną liczbę wpisów w tabeli dziennika widoku.

Oto przechowywane proc:

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 

Wydaje się to dość dobrze. Jak wspomnieli inni, nie jest to doskonałe, ale wygląda na to, że jest wystarczająco dobre w początkowych testach.

0

Jeśli masz używać PHP, można użyć sesje do śledzenia aktywności z poszczególnych użytkowników. W połączeniu z bazą danych możesz śledzić aktywność z konkretnych adresów IP, które możesz założyć, że są tym samym użytkownikiem.

Stosuj znaczniki czasu, aby ograniczyć liczbę trafień (na przykład nie więcej niż 1 trafienie na 5 sekund) i powiedz, kiedy pojawią się nowe "wizyty" w witrynie (jeśli ostatnie trafienie było na przykład ponad 10 minut) .

Możesz znaleźć właściwości $ _SERVER [], które ułatwiają wykrywanie botów lub trendów odwiedzających (takich jak użycie przeglądarki).

edit: mam śledzone uderza & razy wcześniej, licząc widok strony jako hit i +1 do wizyt kiedy nowa sesja jest tworzony. Był dość niezawodny (więcej niż wystarczająco wiarygodny dla celów, których używałem). Przeglądarki, które nie obsługują plików cookie (i dlatego nie obsługują sesji) i użytkownicy, którzy wyłączają sesje, są dość rzadkie w dzisiejszych czasach, więc nie martwiłbym się o tym, chyba że istnieje powód do nadmiernej dokładności:

+0

Adresy IP nie są niezawodne w dłuższej perspektywie. – Cameron

+0

Korzystanie z ASP.NET (MVC) i chociaż opcja Sesja jest opcją, nie pomoże w uzyskaniu dostępu do plików cookie z robotów. Sesja Plus ma nieco narzutów, że w przeciwnym wypadku ta aplikacja nie byłaby potrzebna. –

4

Używaj adresów IP w połączeniu z sesjami Zliczaj każdą nową sesję dla adresu IP jako jedno trafienie przeciw licznikowi. Możesz przechowywać te dane w bazie danych dzienników, jeśli myślisz musisz go przejrzeć. Może to być przydatne do obliczenia, kiedy Twoja witryna uzyskuje największy ruch, ile ruchu dziennie, na adres IP itd.

0

Gdybym był tobą, dałbym sobie spokój mój licznik jest dokładny w pierwszej kolejności, każde rozwiązanie (np. ciasteczka, adresy IP itp.), tak jak powiedziałeś, wydaje się być niewiarygodny. Więc myślę, że najlepiej jest użyć nadmiarowości w swoim systemie: używaj ciasteczek, "Flash-cookies" (obiektów wspólnych), adresów IP (być może w połączeniu z agentami użytkownika) i identyfikatorów użytkowników dla zalogowanych.

Może zaimplementować jakiś schemat, w którym każdy nieznany klient otrzyma unikalny identyfikator, który zostanie zapisany (na szczęście) na komputerze klienta i ponownie przesłany z każdym żądaniem. Następnie możesz powiązać adres IP, klienta użytkownika i/lub ID użytkownika (oraz wszystko, co możesz wymyślić) z każdym unikalnym identyfikatorem i na odwrót. Znacznik czasu i unikalny identyfikator każdego kliknięcia mogą być rejestrowane gdzieś w tabeli bazy danych, a każde kliknięcie (przynajmniej każde kliknięcie w stronę witryny) może zostać przepuszczone lub odrzucone w zależności od ostatniego ostatniego kliknięcia tego samego niepowtarzalnego identyfikatora. Jest to prawdopodobnie wystarczająco wiarygodne dla krótkoterminowych serii kliknięć, a długoterminowe nie miałoby to większego znaczenia (dla problemu kliknięcia, a nie licznika stron).

Przyjazne roboty powinny mieć ustawiony odpowiedni agent użytkownika i mogą być sprawdzane na liście znanych agentów użytkownika robota (znalazłem jeden kod here po prostym wyszukiwaniu Google), aby można go było odpowiednio zidentyfikować i osobno rozwiązać od prawdziwych ludzi.

+0

Dzięki Cameron. To jest miejsce, w którym jestem w tym momencie. Punktem pytania było sprawdzenie, czy dostępne są lepsze metody. –

Powiązane problemy