检测URl模式

时间:2016-09-24 20:45:21

标签: javascript php node.js algorithm pattern-matching

我有数据收集软件。

数据:网站访问/观看次数。

所以我有很多观点数据:页面网址,日期,访客信息。

大多数网址只是不同的过滤器或类似的东西。即URL相同,但它有动态参数。

例如:

  • site1.com/?search=something
  • site1.com/?search=some_word
  • site1.com/?search=hello
  • site1.com/?search=world

应“检测”为site1.com/?search={variable}

这是一个问题:

自动检测网址模式的任何算法?

或者某些分析类/功能?任何编程语言。

需要可以处理大批量网址的解决方案。

没有任何手动模式定义(因为我不知道它并且无法手动为许多不同的网站进行操作)。

UPD 例如: 我有很多不同的网址。来自许多网站。我不知道这些网站是如何运作的。因此,我需要从一个站点获取500个URL然后比较并按公共部分对其进行分组,以获得10个唯一的URL作为结果。哪个应该通过替换{var}任何动态URL部分自动合并。

4 个答案:

答案 0 :(得分:1)

我认为你不会从一个简单的模式中得到很多东西,并且必须按照以下方式编写部分复杂算法:

  1. 将每个URI分解为它的部分:domain,page,Query-String(作为键值)
  2. 对来自同一域的所有URI进行分组
  3. 如果有页面,也可以分组。 (今天大多数网站都使用网址重写规则,因此没有真正的“PAGE”)
  4. 这里来了“困难的部分”:
    • 在分组的URI之间匹配查询字符串变量
    • 如果Var匹配所有(几乎全部)uris,则对内容可能有意义。
    • 如果所有(几乎)都具有相同的值,那么它可能会变得不那么有意义......
    • 注意:您还应该预先检查一些常见的VarId,例如:search,q,query,id,itemId等......
  5. 最后一件事,就像我提到的那样,URL的一部分(除了queryString)可以推断出动态参数(例如Ebay项目:www.ebay.com/itm/9125483; www.ebay.com/itm/ {的itemId})

    但是,嘿,这就是为什么你得到报酬,考虑所有这些问题:p
    祝你好运。

答案 1 :(得分:0)

我认为OP想要的是正则表达式,首先你使用正则表达式在网址中找到域名部分,然后你可以在匹配的部分保留之后删除域部分和任何东西(也就是模式)。

例如,

/ ^ \ W *。\ W *(\ W *)/?\?搜索= /

会将网址中的域名部分与?search =部分匹配,然后如果您从整个网址中删除它们,您将获得该模式。

但我认为它会匹配网址中所有类似字符串的字符串,因此您可能需要更改此内容,以免删除必要的部分

编辑语法和内容

答案 2 :(得分: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
}

您将获得一个对象,其中每个键值对都是查询字符串中的参数。

答案 3 :(得分:0)

这是一种概念证明:)

按“?”分割网址的示例

  • 解析参数。

  • 计算唯一参数值的频率。

  • 获得第N百分位。

  • 构建网址并替换频率超过第N个百分位数的参数

对于像sandbox这样的小数据,50百分位就足以对某些网址进行分组。

对于“大的真实数据”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);