2009-07-29 59 views
7

什麼是實現網頁計數器的好方法?如何實現可靠的網頁計數器?

從表面上看,這是一個簡單的問題,但在處理搜索引擎抓取工具和機器人時,同一用戶的多次點擊,刷新點擊時,會產生問題。

具體什麼是確保鏈接不僅僅是用戶通過反覆點擊'點擊'的好方法? IP地址?餅乾?這兩種方法都有一些缺點(IP地址不一定是唯一的,cookie可以關閉)。

什麼是存儲數據的最佳方式?單獨增加計數器或將每次點擊作爲記錄存儲在日誌表中,然後偶爾進行彙總。

任何現場體驗將是有益的,

+++裏克---

+1

你在問一個很難的問題。只要想一想Google如何處理點擊錯誤問題,您就會了解到問題的嚴重程度。 – backslash17 2009-07-29 17:56:01

+0

我同意..不是一個簡單的問題..雖然我一直想知道爲什麼Web服務器不提供良好的分析解決方案。我說巴掌谷歌分析,並稱之爲完成..除非你試圖重新發明承認破碎的車輪。 – madcolor 2009-07-29 19:04:25

+0

瞭解,但這就是爲什麼我在這裏問: - 。我並不是真的在這裏進行分析之後,而是一個類似於SO的計數器,以至少半可靠地顯示觀看次數。 – 2009-07-29 20:44:47

回答

2

所以我基於這裏的評論玩了一下。我想到的是在一個簡單的領域裏計數櫃檯。在我的應用程序中,我有具有Views屬性的代碼片段實體。

當一個片段被視爲一種方法過濾掉(白名單)正是應可望成爲瀏覽器:

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

然後,存儲過程使用一個單獨的表暫時保持其存儲代碼段ID的最新觀點,輸入日期和IP地址。每個視圖都會被記錄下來,當一個新的視圖進入時,它會被檢查以查看在最後2分鐘內是否有相同的IP地址訪問了這個片段。如果沒有記錄的話。

如果是新視圖,則會記錄視圖(再次顯示SnippetId,IP,Entered),並在片段表上更新實際的視圖字段。

如果這不是一個新視圖,那麼表格會被記錄日誌超過4分鐘的任何視圖清除。這會在任何時候在查看日誌表中產生最少數量的條目。

這裏的存儲過程:

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 

這似乎是工作得相當好。正如其他人提到的,這不是完美的,但它看起來在初始測試中足夠好。

0

如果你使用PHP,你可以使用會話從特定用戶跟蹤活動。結合數據庫,您可以跟蹤特定IP地址的活動,您可能認爲這些IP地址是同一個用戶。

使用時間戳來限制命中(例如,假設每5秒不超過1次命中),並告知何時發生了新的「訪問」(例如,如果最後一次命中超過10分鐘前) 。

您可能會發現$ _SERVER []屬性可幫助您檢測漫遊器或訪問者趨勢(如瀏覽器使用情況)。

編輯: 我之前跟蹤過點擊次數&,將頁面視圖計爲點擊次數,並在新會話創建時訪問+1。這是相當可靠的(對於我用它的目的來說足夠可靠)。不支持cookie(因此不支持會話)的瀏覽器和禁用會話的用戶現在很少見,所以我不擔心關於它,除非有理由過分準確

4

結合使用IP地址與會話計數每個新會話的IP地址作爲一個命中您的計數器如果您認爲您可以將這些數據存儲在日誌數據庫中你需要仔細觀察它,這對於計算你的網站獲得最多的流量,每天的IP流量,每IP的流量等有用。

0

如果我是你,我會放棄我的櫃檯首先是準確的。每個解決方案(如cookies,IP地址等),就像你說的,往往是不可靠的。所以,我認爲你最好的選擇是在你的系統中使用冗餘:使用cookies,「Flash-cookies」(共享對象),IP地址(可能與用戶代理結合)以及登錄用戶的用戶ID。

你可以實現某種方案,其中任何未知的客戶端都被賦予一個唯一的ID,該ID被存儲(希望)存儲在客戶端的機器上,並隨每個請求重新傳輸。然後,您可以將IP地址,用戶代理和/或用戶ID(以及任何您能想到的內容)綁定到每個唯一ID,反之亦然。每次點擊的時間戳和唯一ID可以記錄在某個數據庫表中,並且每次點擊(至少每次點擊到您的網站)都可以通過或拒絕,具體取決於最近一次點擊針對相同唯一ID的最近時間。對於短期點擊爆發來說,這可能足夠可靠,並且長期來看,無論如何(對於點擊問題而言,並非頁面計數器)都無關緊要。

友好的機器人應該設置適當的用戶代理,並且可以根據已知的機器人用戶代理列表(我在簡單的Google搜索後發現一個here)進行檢查,以便正確識別並與真人分開處理。