Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Парсинг поискового запроса Yandex Google Rambler
цитата
09/05/08 в 14:51
 Zhidrons
Надо парсить (php) русские запросы с основных поисковиков.
кто подскажет решение?

видел класс word-stat.class.php (wm-help.net) - не очень корректно распознает.
цитата
10/05/08 в 07:51
 _s_[sov]
Стукнись, могу написать парсер icon_smile.gif
цитата
10/05/08 в 15:24
 localhost
мой работающий парсер:

Код:

<?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 раз
цитата
10/05/08 в 15:26
 localhost
ну и само собой, при необходимости конвертить 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);
}
?>
цитата
10/05/08 в 18:31
 Gourad
А iconv не судьба использовать?
цитата
10/05/08 в 23:44
 localhost
в случае виртуального хостинга, iconv может быть не везде вкомпилен, поэтому иногда проще использовать свою функцию перекодировки.


Эта страница в полной версии