С нами с 12.05.06
Сообщения: 132
Рейтинг: 29
|
Добавлено: 09/05/08 в 14:51 |
Надо парсить (php) русские запросы с основных поисковиков.
кто подскажет решение?
видел класс word-stat.class.php (wm-help.net) - не очень корректно распознает.
|
|
|
|
php
С нами с 09.10.06
Сообщения: 3706
Рейтинг: 2410
|
Добавлено: 10/05/08 в 07:51 |
Стукнись, могу написать парсер
|
|
|
|
127.0.0.1
С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557
|
Добавлено: 10/05/08 в 15:24 |
мой работающий парсер:
Код: |
<?php
$known_bots="Googlebot|Yahoo|Mail\.Ru|msnbot|Yandex";
#queries
$query=array(
"google" =>"q=(.*)(\&.*)?$",
"yahoo" =>"p=(.+)(\&.*)?$",
"yandex" =>"text=(.*)(\&.*)?$",
"msn" =>"q=(.*)(\&.*)?$",
"rambler"=>"words=(.*)(\&.*)?$",
);
#bots
$bots=array(
"Googlebot"=>"g",
"Yahoo" =>"h",
"Yandex" =>"y",
"Mail.ru" =>"m",
"msnbot" =>"n",
"Rambler" =>"r"
);
#from
$hits=array(
"google" =>"G",
"yahoo" =>"H",
"yandex" =>"Y",
"mail.ru"=>"M",
"msn" =>"N",
"rambler"=>"R",
"unknown"=>"-"
);
#---------------------------------------------------------------
function check_query() {
global $v,$bots,$hits,$query;
#direct hit
if (!isset($_SERVER['HTTP_REFERER'])) {return;}
#check SE
foreach($hits as $hit=>$i) {
if (stristr($_SERVER['HTTP_REFERER'],$hit)) {$id=$i;break;}
}
#if not from search engines?
if ($i=="-"){return;}
#if, yes
$v[6]=$i;
#try parsing url
$r=parse_url($_SERVER['HTTP_REFERER']);
#then checking
if (!isset($r['host'])||!isset($r['query'])||!isset($r['path'])){return;}
$v[7]=trim($r['host'],"www.");
$str='';
#try to find SE query pattern
foreach($query as $u=>$q) {if (stristr($v[7],$u)) {$str='?';break;} }
#if not found
if (empty($str)) {return;}
#try to parse query string
if (!preg_match("/{$q}/iUs",$r['query'],$a)) {return;}
$v[5]=$a[1];
}
#------------------------------
# 0 - domain
# 1 - ip
# 2 - botname or -
# 3 - geoip or -
# 4 - requested page
# 5 - query string or -
# 6 - hit type (bot or from SE)
# 7 - from site
$v=array('-','127.0.0.1','-','-','-','-','-');
#---[0:host]---
if (isset($_SERVER['HTTP_HOST'])) {$v[0]=ltrim($_SERVER['HTTP_HOST'],"www.");}
#---[1:ip]---
if(isset($_SERVER['REMOTE_ADDR'])) {$v[1]=$_SERVER['REMOTE_ADDR'];}
#---[2:agent]---
if (isset($_SERVER['HTTP_USER_AGENT'])) {
foreach($bots as $b=>$i) {
if(stristr($_SERVER['HTTP_USER_AGENT'],$b)) {$v[2]=$i;break;}
}
}
#---[3:geip]---
if(isset($_SERVER['GEOIP_COUNTRY_CODE'])) {$v[3]=$_SERVER['GEOIP_COUNTRY_CODE'];}
#---[4:request uri]---
if (isset($_SERVER['REQUEST_URI'])) {
$v[4]=trim($_SERVER['REQUEST_URI'],"/");
if (empty($v[4])) {$v[4]='-';}
}
#---[5:checking query]---
check_query();
$str=mktime().":".join(":",$v);
unset($v);
?>
|
на выходе строка для статистики в виде:
1210050125:domain.com:192.168.100.1:-:RU:porno124.html:бесплатно порнофильм посмотреть:R
или массив $v()
Последний раз редактировалось: localhost (10/05/08 в 15:26), всего редактировалось 1 раз
|
|
|
|
127.0.0.1
С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557
|
Добавлено: 10/05/08 в 15:26 |
ну и само собой, при необходимости конвертить UTF8->cp1251
посредством функции:
Код: |
<?php
function utf8_cp1251($str) {
$table = array(
"\xD0\x81" => "\xA8",
"\xD1\x91" => "\xB8",
"\xD0\x8E" => "\xA1",
"\xD1\x9E" => "\xA2",
"\xD0\x84" => "\xAA",
"\xD0\x87" => "\xAF",
"\xD0\x86" => "\xB2",
"\xD1\x96" => "\xB3",
"\xD1\x94" => "\xBA",
"\xD1\x97" => "\xBF",
"\xD3\x90" => "\x8C",
"\xD3\x96" => "\x8D",
"\xD2\xAA" => "\x8E",
"\xD3\xB2" => "\x8F",
"\xD3\x91" => "\x9C",
"\xD3\x97" => "\x9D",
"\xD2\xAB" => "\x9E",
"\xD3\xB3" => "\x9F",
);
return preg_replace('#([\xD0-\xD1])([\x80-\xBF])#se', 'isset($table["$0"]) ? $table["$0"] : chr(ord("$2")+("$1" == "\xD0" ? 0x30 : 0x70))', $str);
}
?>
|
|
|
|
|
саблезубый кролик
С нами с 02.07.05
Сообщения: 2966
Рейтинг: 993
|
Добавлено: 10/05/08 в 18:31 |
А iconv не судьба использовать?
|
|
|
|
127.0.0.1
С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557
|
Добавлено: 10/05/08 в 23:44 |
в случае виртуального хостинга, iconv может быть не везде вкомпилен, поэтому иногда проще использовать свою функцию перекодировки.
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |
|
Спонсор раздела
|