
Перед завершением серии статей про написание сервиса анализа сайта, я решил написать некоторые свои мысли по поводу реализации функций, которые считают количество проиндексированных страниц. Дело в том, что получить эти значения можно разными способами, которые имеют свои плюсы и минусы. Я хочу рассказать про каждый из них, а вы сами уже решите какой вам больше по душе.
В начале немного теории по алгоритму и план реализаци.
1. Запрашиваем страницу, где выводятся ваши ссылки, на примере моего блога и поисковика Яндекса, эта страница: http://yandex.ua/yandsearch?numdoc=50&pag=u&surl=pro100design.net&rdrnd=658752&rd=0&lr=145
2. Мы записываем содержимое страницы в переменную, где мы ищем нужные нам значения с помощью регулярных выражений. У Яндекса например количество проиндексированных страниц можно брать с двух мест. Первое это заголовок, второе — текст под логотипом.

3. Чистим текст от тегов и мусора, находим регулярным выражением нужные цифры и записываем в результат выполнения нашей функции.
Теперь о реализации. Запрашивать страницу можно разными способами, рассмотрим основные.
file_get_contents / fopen
Далеко не самый лучший метод получения данных со страницы. Функция просто записывает весь файл в одну строку, в основном используют для локальных файлов, но работает и с url. Для серьезных парсеров или скриптов получения контента, скорее всего Вам не подойдет, но взамен получаем хорошую поддержку на большинстве хостингов. Нельзя делать частые запросы, поисковики начнут считать Вас Роботом. Выход — использовать прокси. Прокси нужны быстрые и рабочие, иначе пользователь устанет ждать результат.
cUrl
С помощью этой библиотеки можно наверное написать любой парсер/автосамбитер/грабер. Большое количество параметров и функций. Хорошая поддержка на хостингах, но если вы используте редиректы, то появляются танцы в бубном, об этом напишу подробней в следующих статьях.
Яндекс.XML + cUrl
Наверное один из самых удачных способов реализации получения информации со страниц Яндекса. Вы регистрируетесь в сервисе на свой IP, где будет стоять скрипт и после этого без проблем можете выполнять до 1000 запросов в день, не боясь быть забаннеными в Яндексе. Очень удобный скрипт получения проиндексированных страниц написал Самборский, где он как раз использует Яндекс.XML и cUrl.
На закуску 2 скрипта.
Получаем количество проиндексированных страниц Яндекс и Google при помощи cUrl
<?
class method_curl
{
// Инициализация curl
function curl_start($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_ENCODING,'gzip,deflate');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1");
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
// Получаем количество страниц в индексе Яндекса
public function yandex_index($site_url)
{
$content = $this->curl_start('http://yandex.ru/yandsearch?date=&text= &spcctx=notfar&zone=all& wordforms=all&lang=all&within=0&from_day=&from_month= &from_year= &to_day=21 &to_month=7&to_year=2009&mime=all &site='.urlencode($site_url).'&rstr=&ds=&numdoc=10');
$content = str_replace(' тыс.','000',$content);
$content = str_replace(' млн','000000',$content);
$content = str_replace('ничего не найдено','0',$content);
preg_match('~<title>[^\d]*(\d+)[^\d]*</title>~',$content,$match);
return $match[1];
}
// Получаем количество страниц в индексе Google
public function google_index($site_url)
{
$content = str_replace(',','',$this->curl_start('http://www.google.com/search?hl=en&safe=off&q=site:'.$site_url.'&btnG=Search'));
preg_match('/<b>.+?<\/b>\s*-\s*<b>.+?<\/b>.+?<b>(.+?)<\/b>/',$content,$a);
$count = str_replace(',','',htmlspecialchars_decode($a[1]));
return $count;
}
}
// Для вызовы и выполнения кода пишем
$analiz = new method_curl();
// Адрес сайта
$url = "pro100design.net";
// Вывод
echo "Анализ сайта: <b>".$url."</b><br />";
echo "Google: ".$analiz->google_index($url)."<br />";
echo "Яндекс: ".$analiz->yandex_index($url);
?>
Получаем количество проиндексированных страниц Яндекс и Google без помощи cUrl
<?
//Конвертируем полученные данные функцией file_get_contents
function _convert_file($utf = '')
{
if($utf == '' || !is_string($utf)) return($utf);
$max_count = 5;
$max_mark = 248;
$html = '';
for($str_pos = 0; $str_pos < strlen($utf); $str_pos++) {
$old_chr = $utf{$str_pos};
$old_val = ord( $utf{$str_pos} );
$new_val = 0;
$utf8_marker = 0;
if( $old_val > 127 ) {
$mark = $max_mark;
for($byte_ctr = $max_count; $byte_ctr > 2; $byte_ctr--) {
if( ( $old_val & $mark ) == ( ($mark << 1) & 255 ) ) {
$utf8_marker = $byte_ctr - 1;
break;
}
$mark = ($mark << 1) & 255;
}
}
if($utf8_marker > 1 and isset( $utf{$str_pos + 1} ) ) {
$str_off = 0;
$new_val = $old_val & (127 >> $utf8_marker);
for($byte_ctr = $utf8_marker; $byte_ctr > 1; $byte_ctr--) {
if( (ord($utf{$str_pos + 1}) & 192) == 128 ) {
$new_val = $new_val << 6;
$str_off++;
$new_val = $new_val | ( ord( $utf{$str_pos + $str_off} ) & 63 );
}
else $new_val = $old_val;
}
if ($new_val == 1025) { $html .= chr(168); }
elseif ($new_val == 1105) { $html .= chr(184); }
elseif (1040 <= $new_val and $new_val <= 1103) { $html .= chr($new_val - 848); }
else { $html .= '&#'.$new_val.';'; }
$str_pos = $str_pos + $str_off;
}
else { $html .= chr($old_val);$new_val = $old_val; }
}
return($html);
}
// Получаем количество страниц в индексе Яндекса
function yandex_index($url){
$url=@urlencode($url);
$str=@file_get_contents("http://yandex.ru/yandsearch?numdoc=10&serverurl={$url}");
$str=_convert_file($str);
$data = @eregi("<title>(.*)</title>", $str, $out);
$result1 = @trim($out[1]);
$data = @eregi("нашлось(.*)страниц", $result1, $out2);
$result2 = @trim($out2[1]);
if(@strlen($result2)<1){
$data = @eregi("нашлась(.*)страниц", $result1, $out2);
$result2 = @trim($out2[1]);
}
$result2=str_replace(" ","",$result2);
$result2=str_replace("млн","000000",$result2);
$result2=str_replace("тыс.","000",$result2);
if ($result2<1) $result2=0;
return $result2;
}
// Получаем количество страниц в индексе Google
function google_index($url){
if($_GET["debug"] == "7") echo "http://www.google.com/search?&q=allinurl:$url+ site:$url&hl=en";
$file=@implode("",file("http://www.google.com/search?&q=site:$url&hl=en"));
if(preg_match("!of (about )?<b>(.*?)</b> from!si",$file,$ok)){
$result=$ok[2];
$result=str_replace(",", "", $result);
}
else{
if(preg_match("!No results found!si",$file)) $result="0";
else $result="0";
}
return $result;
}
// Адрес сайта
$url = "pro100design.net";
// Вывод
echo "Анализ сайта: <b>".$url."</b><br />";
echo "Google: ".google_index($url)."<br />";
echo "Яндекс: ".yandex_index($url);
?>
Какой использовать метод, выбирать только вам.
Скачать исходники, можно тут: IndexPage_Yandex_Google.zip




