我有数据收集软件。
数据:网站访问/观看次数。
所以我有很多观点数据:页面网址,日期,访客信息。
大多数网址只是不同的过滤器或类似的东西。即URL相同,但它有动态参数。
例如:
应“检测”为site1.com/?search={variable}
这是一个问题:
自动检测网址模式的任何算法?
或者某些分析类/功能?任何编程语言。
需要可以处理大批量网址的解决方案。
没有任何手动模式定义(因为我不知道它并且无法手动为许多不同的网站进行操作)。
UPD 例如: 我有很多不同的网址。来自许多网站。我不知道这些网站是如何运作的。因此,我需要从一个站点获取500个URL然后比较并按公共部分对其进行分组,以获得10个唯一的URL作为结果。哪个应该通过替换{var}任何动态URL部分自动合并。
答案 0 :(得分:1)
我认为你不会从一个简单的模式中得到很多东西,并且必须按照以下方式编写部分复杂算法:
最后一件事,就像我提到的那样,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);