2016-09-24 81 views
-4

我有數據收集軟件。檢測URl模式

數據:網站訪問量/瀏覽量。

所以我有很多意見的數據:頁面的URL,日期,遊客信息。

大多數網址只是不同的過濾器或類似的東西。即網址相同,但具有動態參數。

例如:

  • site1.com/?search=something
  • site1.com/?search=some_word
  • site1.com/?search=hello
  • site1.com/ ?搜索=世界

應該是 「檢測」 作爲site1.com/?search={variable}

所以這是一個問題:

任何算法到自動檢測 URL的模式?

或者某些分析類/函數?任何編程語言。

需要可以處理大批量URL的解決方案。

Wihout沒有任何手動模式定義(因爲我不知道它,不能手動執行許多不同的網站)。例如: 我有很多不同的URL。來自很多網站。我不知道這些網站是如何工作的。因此,我需要從一個網站獲取500個網址,然後通過共同部分進行比較和分組,以獲得10個獨特的網址。這應該通過替換{var}任何動態URL部分來自動合併。

+0

_「任何算法來自動檢測URL的模式?」 _你是什麼意思的「自動偵測模式」嗎? – guest271314

+0

什麼是「幾乎相同」?不確定你想要達到什麼目的? – guest271314

+0

我認爲OP希望瀏覽URL並找到其中的靜態部分,例如,它們都以'site1.com/?search ='開頭,然後找到更改的部分,例如搜索字符串。 – vlaz

回答

0

以下是一些概念驗證:)

通過「?」分割URL的示例

  • 解析參數。

  • 計算唯一參數值的頻率。

  • 獲得第N百分位數。

  • 生成URL和替換參數,其頻率大於第N百分

對於像在這裏sandbox 50百分小數據是足夠將一些URL。

對於「大實數據」90-95百分位。 例如:我用90百分位爲5000頁的鏈接 - >result ~200 links

<?php 
$stats = []; 

$pages = [ 
    (object)['page' => 'http://example.com/?page=123'], 
    (object)['page' => 'http://example.com/?page=123'], 
    (object)['page' => 'http://example.com/?page=123'], 
    (object)['page' => 'http://example.com/?page=321'], 
    (object)['page' => 'http://example.com/?page=321'], 
    (object)['page' => 'http://example.com/?page=321'], 
    (object)['page' => 'http://example.com/?page=qwas'], 
    (object)['page' => 'http://example.com/?page=safa15'], 
]; // array of objects with page property = URL 

$params_counter = []; 
foreach ($pages as $page) { 
    $components = explode('?', $page->page); 

    if (!empty($components[1])) { 
     parse_str($components[1], $params); 
     foreach ($params as $key => $val) { 
      if (!isset($params_counter[$key][$val])) { 
       $params_counter[$key][$val] = 0; 
      } 
      $params_counter[$key][$val]++; 
     } 
    } 
} 

function procentile($percentile, $array) 
{ 
    sort($array); 
    $index = ($percentile/100) * count($array); 
    if (floor($index) == $index) { 
     $result = ($array[$index-1] + $array[$index])/2; 
    } else { 
     $result = $array[floor($index)]; 
    } 
    return $result; 
} 


$some_data = []; 
foreach ($params_counter as $key => $val) { 
    $some_data[$key] = count($val); 
} 

$procentile = procentile(90, $some_data); 

foreach ($pages as $page) { 
    $components = explode('?', $page->page); 

    if (!empty($components[1])) { 
     parse_str($components[1], $params); 
     arsort($params); 
     foreach ($params as $key => $val) { 
      if ($some_data[$key] > $procentile) { 
       $params[$key] = '$var'; 
      } 
     } 
     arsort($params); 

     $pattern = http_build_query($params); 

     $new_url = urldecode('?'.$pattern); 

     if (!isset($stats[$new_url])) { 
      $stats[$new_url] = 0; 
     } 
     $stats[$new_url]++; 
    } 
} 

arsort($stats); 
0

我覺得OP要的是正則表達式,首先你會發現在URL中的域名部分使用正則表達式,那麼你可以匹配的零件後刪除域部分和任何將保持(又名模式)。

例如,

/^\w*.\w*(.\w*)?/\?search=/

將域部分的URL匹配的?搜索=部分,那麼如果你從整個Url中刪除它們,你會得到這個模式。

但我認爲這將匹配在URL中的所有領域,例如字符串,所以你可能要改變這種做法,不刪除所需要的部分

編輯語法和東西

+0

根本不是。 我有許多不同的網址。來自很多網站。我不知道這個網站是如何工作的。所以我需要獲得例如500個URL,並通過公共部分對其進行比較和分組,以得到10個獨特的URL作爲結果。這應該通過替換{var}任何動態URL部分來自動合併。 –

0

不幸的是,我如果沒有使用模式匹配,你會覺得很失敗。您現在可以使用庫或其他人的代碼,但是有太多的變體來解決這個問題。試試這個關於大小:

function getURLQueryString(url) { 
    var query_list = {}; 
    var query_strings = url.match(/.*\?(.*)/)[1].split('&'); 
    var i, param; 

    for(i in query_strings) { 
     param = query_strings[i].split('='); 
     query_list[ param[0] ] = param[1]; 
    } 

    return query_list 
} 

你會得到一個對象,其中的每一個鍵值對是從查詢字符串參數。

+0

(我不能評論上面或我會問,但)這取決於你已經知道這個URL列表,以及他們將在查詢字符串中接受的參數。如果您不確定哪個參數是允許的,那麼您將需要訪問服務器文件來查找。此外,我假設這些都是GET請求 – Duco

1

我想你不會得到太多出一個簡單的模式,而必須寫沿線部分複雜的算法的東西:

  1. 休息每個URI到它的部分:域名,頁面,查詢 - 字符串(作爲鍵值)
  2. 將來自同一個域的所有URI組合起來
  3. 如果有頁面,也由此組分組。 (現在大多數網站使用的URL重寫規則,所以沒有真正的「PAGE」)
  4. 這裏來了「困難的部分」:
    • 匹配查詢字符串中的分組之間的URI變量
    • 如果無功是匹配所有(幾乎所有)uris,它可能對內容有意義。
    • 如果所有(幾乎)具有相同的值,它可能是不便意義不大...
    • 記:你也應該事先檢查一些常見VarIds,如:搜索,Q,查詢,ID的itemId,等等。 ..

最後一件事,今天,當我提到的,URL(除了的queryString)的部分可以推斷動態參數(如易趣物品:www.ebay.com/itm/9125483; WWW .ebay.com/itm/{itemId})

但是,嘿,這就是爲什麼你付出代價,想想所有這些問題:p
祝你好運。

+0

已經做了+/-像你寫的。但任何方式謝謝你:) –