// Если все поля в форме заполнены, то вызывается функция
// siteposition() для проведения мониторинга
if (($server!="") && ($phrase!="") && ($site!=""))
{
siteposition($server, $site, $phrase);
}
function siteposition($server, $site, $phrase)
{
// numberpage — переменная определяющая номер просматриваемой страницы
$numberpage=0;
// Присваиваем переменным phrase, total и numberpage значения,
// определяемые индивидуально для каждой поисковой системы.
// phrase — поисковая фраза
// total — переменная, определяющая максимальное число страниц
// по которым будет произведен поиск. Для разных поисковых систем
// оно разное и подобрано таким образом, чтобы число просматриваемых
// страниц составило 10 штук.
switch($server)
{
case YANDEX:
// Обрезка пробелов в начале и конце поисковой фразы
$phrase = trim($phrase);
// URL-кодирование поисковой фразы
// неалфавитно-числовые символы заменяются
// на знак % и соответствующую 16-ричную последовательность
$phrase = rawurlencode($phrase);
// 16-ричный знак пробела, появившийся после применения
// функции rawurlencode() заменяется на знак +
$endstr = str_replace("%20","+",$phrase);
$total = 3;
$numberpage = -1;
break;
case APORT:
$phrase = trim($phrase);
$phrase = rawurlencode($phrase);
$endstr = str_replace("%20","+",$phrase);
$total = 10;
$numberpage = -1;
break;
case RAMBLER:
$phrase = trim($phrase);
// Преобразуем кодировку запроса – Rambler работает с KOI8-R
$phrase = rawurlencode(convert_cyr_string($phrase,"w","k"));
$endstr = str_replace("%20","+",$phrase);
$total = 152;
$numberpage = -14;
break;
}
// Последовательно просматриваем страницы поисковых систем до тех
// пор пока не будет найдена ссылка на искомый сайт в тексте страницы
// (count($arr[0]) == 0) или число просмотренных страниц не достигнет
// максимального значения ($numberpage < $total)
while ((count($arr[0]) == 0) && ($numberpage < $total))
{
switch($server)
{
// Увеличивая значение переменной $numberpage, определяется
// текущая просматриваемая страницу с результатами поиска
// в поисковой системе.
// Число приращения зависит от конкретной поисковой системы
case YANDEX:
$numberpage += 1;
break;
case APORT:
$numberpage += 1;
break;
case RAMBLER:
$numberpage += 15;
break;
}
// Вызывается функцию geturl(), генерирующую строку запроса
// для поисковой системы. Передаваемые параметры:
// numberpage – переменная, определяющая номер просматриваемой
// страницы с результатами поиска в поисковой системе
// endstr — поисковая фраза после кодирования для применения
// в строке запроса
// server — имя поисковой системы
$strurl = geturl($numberpage,$endstr,$server);
// В переменную text заносится содержимое страницы поисковой системы,
// которое возвращается функцией openpage()
$text = openpage($strurl);
// Поиск ссылки на сайт в тексте страницы поисковой системы
// с помощью функции findsite(). Результаты поиска заносятся
// в массив arr[].
$arr = findsite($site, $text);
}
// Если число элементов массива arr[] больше нуля — значит ссылка
// на искомый сайт была найдена в тексте просмотренной страницы
// поисковой системы и необходимо показать результаты мониторинга.
if (count($arr[0])>0)
{
switch($server)
{
// В зависимости от поисковой системы формируются результаты
// мониторинга поисковой системы.
// Функция pattern() возвращает результаты параметры для
// регулярного выражения, с помощью которого будет производится
// поиск номера позиции сайта сайта в тексте
// страницы поисковой системы.
// Функция findposition() возвращает номер позиции сайта
case YANDEX:
// Вывод информации о странице
echo "Ссылка на сайт найдена на странице: ".
($numberpage+1)."
";
echo "Перейти по ссылке: Яндекс
";
// Определение и вывод позиции запроса
list($startpattern, $endpattern) = pattern(YANDEX);
echo "
Позиция: ".
findposition($server, $site, $text, $startpattern, $endpattern);
break;
case APORT:
// Вывод информации о странице
echo "Ссылка на сайт найдена на странице: ".
($numberpage+1)."
";
echo "Перейти по ссылке: Апорт
";
// Определение и вывод позиции запроса
list($startpattern, $endpattern) = pattern(APORT);
echo "
Позиция: ".
findposition($server, $site, $text, $startpattern, $endpattern);
break;
case RAMBLER:
// Преобразовываем ссылку для решения проблем с кодировками
$phrase = rawurlencode(convert_cyr_string(
rawurldecode($phrase),"k","w"));
$endstr = str_replace("%20","+",$phrase);
$strurl=geturl($numberpage,$endstr,$server);
// Вычисляем страницу, на которой находится запрашиваемый сайт
$numberpage = $numberpage/15;
$numberpage = (int)$numberpage;
if($numberpage % 15 == 0 && $numberpage>15) $numberpage++;
echo "Ссылка на сайт найдена на странице:".($numberpage+1)."
";
// Выводим ссылку на страницу
echo "Перейти по ссылке: Рамблер
";
// Определение и вывод позиции запроса
list($startpattern, $endpattern) = pattern(RAMBLER);
echo "
Позиция: ".findposition($server, $site, $text,
$startpattern, $endpattern);
// Так как ссылка на искомый сайт найдена, то просмотр страниц
// поисковых систем в цикле While можно прекратить
break;
}
}
else
{
echo "На 100 первых страницах ссылка на сайт отсутствует";
}
}
function geturl($numberpage,$endstr,$server)
{
if($server == YANDEX) return "http://www.yandex.ru/yandpage?q=818836167&p=$numberpage&ag=d&qs=text%3D".$endstr."%26numdoc%3D50";
if($server == RAMBLER) return "http://search.rambler.ru/srch?words=".$endstr."&start=".$numberpage;
if($server == APORT) return "http://sm.aport.ru/scripts/template.dll?r=".$endstr."&That=std&p=".$numberpage."&HID=1_2_3_4_5_6_7_8_9_10_11_12_13";
return "";
}
function openpage($link)
{
// Функция fopen() открывает файл для чтения и возвращает
// указатель файла.
set_time_limit(0);
$fd = fopen($link, "r");
$text="";
if (!$fd) echo "Запрашиваемая страница не найдена";
else
{
// Чтение содержимого файла в переменную text
while (!feof ($fd))
{
$text .= fgets($fd, 4096);
}
}
// Закрыть открытый указатель файла
fclose ($fd);
return $text;
}
function findsite($site, $text)
{
preg_match_all("/$site/iU", $text, $arr);
return $arr;
}
function pattern($typepattern)
{
switch($typepattern)
{
case YANDEX:
return array("\(this,'web/pos=([0-9]{1,3})'\)\"[\s][href=\"]{6}http://[w.]{0,4}",".*");
break;
case APORT:
return array("", "");
break;
case RAMBLER:
return array("");
break;
}
}
// Функция findposition() определяет позицию искомого сайта на странице
// c результатами поиска в поисковой системе.
// Передаваемые параметры:
// server — имя поисковой системы
// site — имя искомого сайта
// text — содержимое страницы c результатами поиска в поисковой системе
// startpattern и endpattern — параметры для регулярного выражения, они
// определяются функцией pattern()(листинг 15.5).
function findposition($server, $site, $text, $startpattern, $endpattern)
{
switch($server)
{
// Поиск позиции сайта в тексте страницы.
// Для каждой поисковой системы применяется свой алгоритм поиска
case YANDEX:
// Регулярное выражение, осуществляющее поиск позиции сайта
preg_match_all("|$startpattern$site$endpattern|iU",$text,$arr);
preg_match_all("|[0-9]{1,3}'|iU",$arr[0][0],$position);
$numberposition = substr($position[0][0], 0,
strlen($position[0][0]-1));
return $numberposition;
case APORT:
$pos = strpos($text,$site);
$text = substr($text,0,$pos);
while(true)
{
$pos = strpos($text,"");
// Число символов в вырезаемой строке
$lenght = strpos($text,"");
$lenght = $lenght - $pos - 15;
// Получаем позицию
return substr($text,$pos+15,$lenght);
case RAMBLER:
$pos = strpos($text,"");
$posend = @strpos($text,"- ",($pos+15));
$yes = strpos(substr($text,$pos,($posend-$pos)),$site);
if($yes > 0) break;
else $text = substr($text,$posend-1);
$pos_begin++;
}
return $pos_begin;
default:
return array("
", "<\/div>");
}
}
?>