Реклама на сайте Advertise with us

Парсинг поискового запроса Yandex Google Rambler

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 12.05.06
Сообщения: 132
Рейтинг: 29

Ссылка на сообщениеДобавлено: 09/05/08 в 14:51       Ответить с цитатойцитата 

Надо парсить (php) русские запросы с основных поисковиков.
кто подскажет решение?

видел класс word-stat.class.php (wm-help.net) - не очень корректно распознает.

0
 

php

С нами с 09.10.06
Сообщения: 3706
Рейтинг: 2410


Передовик Master-X (16.01.2010)
Ссылка на сообщениеДобавлено: 10/05/08 в 07:51       Ответить с цитатойцитата 

Стукнись, могу написать парсер icon_smile.gif

IPhosters.com - любые решения для Вас (виртуалы от $4.99, vps от $11.99, дедики от $95)

0
 

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 раз

3
 

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);
}
?>

3
 

саблезубый кролик

С нами с 02.07.05
Сообщения: 2966
Рейтинг: 993

Ссылка на сообщениеДобавлено: 10/05/08 в 18:31       Ответить с цитатойцитата 

А iconv не судьба использовать?

.

1
 

127.0.0.1

С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557

Ссылка на сообщениеДобавлено: 10/05/08 в 23:44       Ответить с цитатойцитата 

в случае виртуального хостинга, iconv может быть не везде вкомпилен, поэтому иногда проще использовать свою функцию перекодировки.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »