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

Считаем количество проиндексированных страниц Яндекс и 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

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

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

Категории

Дай ребенку на трусы

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

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


Дружим сайтами


Свежачок

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

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

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

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

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

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

Музыка, дизайн, кодинг

Оригинальные поисковые плакаты на стену (Яндекс и Google)

Тема для Windows 7 – Led for 7

Набор иконок: Token


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


Облако тегов