Дизайн просто — Свежачок для вебмастеров и дизайнеров. Регистрация

Считаем количество проиндексированных страниц Яндекс и Google на php
Дата: 27 Янв   Рубрика: Веб-Программирование

Перед завершением серии статей про написание сервиса анализа сайта, я решил написать некоторые свои мысли по поводу реализации функций, которые считают количество проиндексированных страниц. Дело в том, что получить эти значения можно разными способами, которые имеют свои плюсы и минусы. Я хочу рассказать про каждый из них, а вы сами уже решите какой вам больше по душе.

В начале немного теории по алгоритму и план реализаци.

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('&nbsp;тыс.','000',$content);
		$content = str_replace('&nbsp;млн','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("&nbsp;","",$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

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Комментариев: 8
Если Вам понравилась моя статья, тогда обязательно подписывайтесь на обновление моего блога и получайте первыми самые свежие заметки, статьи и обзоры, о которых я пишу.

Комментариев: 8 для «Считаем количество проиндексированных страниц Яндекс и Google на php»

  1. kr1z пишет:

    Скорее всего яндекс забанил, нужно подключать и использовать прокси, если много запросов.

Ваш комментарий

Категории

Если вам понравился наш сайт, вы сможете всегда следить за ним удобными для вас способами.

Подпишись на RSS



Свежачок

Новый проект

Free-lance.ru iOS клиент.  Проектирование интерфейса. Концепт.

Я давно на дрибббл, фолов ми!

Полный редизайн блога.

Иконки многих платёжных систем

Выбираем php редактор для Windows, Linux, Mac (часть 3)

Делаем простое резиновое горизонтальное css меню

Новый проект — «Открыть доступ»

Мой док в Маке. Делюсь красивыми иконками.

Считаем количество проиндексированных страниц Яндекс и Google на php


Последние комментарии


Облако тегов