10.06.15, 10:52
0 комментарий
  Уроки

Пишем простенький скрипт анализа сайта

Сегодня существует множество инструментов для анализа сайта, но ведь это не повод отказываться от написания своего?

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

— дата регистрации домена;
— IP адрес;
— заголовок, ключевые слова, описание;
— тИЦ и PR;
— индексация в поисковых системах;
— присутствие в Яндекс Каталоге и DMOZ;
— средняя посещаемость по LiveInternet;
— внешние и внутренние ссылки;
— robots.txt.

Для начала нам хватит. Итак, первым делом разрабатываем внешний вид странички анализа. В общем-то, он не отличается от остальных моих скриптов.

1. index.php:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Скрипт анализа сайта</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script language="javascript" src="jquery.js" type="text/javascript"></script>
<script language="javascript" src="light.js" type="text/javascript"></script>
<script type="text/javascript">
        jQuery(document).ready(function($) {

                function PushTheButton(TEvent) {
                        if (TEvent.keyCode == 13) {
                                if (document.getElementById('an_site').focused)
                                        an_site_light();
                        }
                }

                $(document).bind('keyup', PushTheButton);
        });
</script>
</head>
<body onload="$('#an_site').focus()">

<table border="1" width="100%" cellpadding="10px" cellspacing="0" bordercolor="#4d77a0" style="-moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px;" rules="none">

<tr>
<td valign="top">

<div id="show_an_site_tab">

Адрес вашего сайта:<br><br>
<input id='an_site' type='text' name='an_site' maxlength='100' style='width:250px' onfocus="this.focused=true;" onblur="this.focused=false;"><br><br>
<input type='button' value='Анализ' onclick='an_site_light();'><br><br>

<div id='show_an_site' style='display: none;'></div>

</div>

</td>
</tr>
</table>

<br>
© <a href="http://artdev.org/shop/" target="_blank" title="ArtDev.org - сообщество программистов">ArtDev.org</a>

</body>
</html>


Так как я писал код в далеком 2009 году, то использовал jQuery версии 1.3.2, а также старую библиотеку phpWhois. Вы можете сделать все более современным. style.css оставляю на ваше усмотрение.

2. Весь javascript расположен в light.js:

function an_site_light()
{
 var dt;
 $.post("date.php", function(data) {
    dt=data;

    $.ajax({
        type: "POST",
        url: "site.php",
        cache: false,
        data: { site: $("#an_site").attr("value") },
        success: function(data) {
           if (data != "c") {
              if (data != "")
                 alert(data);
           }
           else {
              $("#show_an_site").html("<b>Информация о сайте "+$("#an_site").attr("value")+"</b><br><br><div id='an'><img src='ajax-loader.gif'></div>");
              $.post("whois_created.php", { whois: $("#an_site").attr("value") }, function(data) {
                 if ((data != "1.1.1970") && (data != dt) && (data != "-"))
                    $("#an").html("Домен создан "+data+"<br><br>");
                 else
                    $("#an").html("Дата создания домена не определена<br><br>");
                 $.post("header.php", { site: $("#an_site").attr("value") }, function(data) {
                    $("#an").append(data);

                    $.post("ya.php", { site: $("#an_site").attr("value") }, function(data) {
                       b_tic = data;

                       $.post("ya.php", { site: "www."+$("#an_site").attr("value") }, function(data) {
                          if (b_tic >= data)
                             $("#an").append("тИЦ ресурса "+b_tic+"<br>");
                          else {
                             b_tic=data;
                             $("#an").append("тИЦ ресурса "+b_tic+"<br>");
                          }

                          $.post("pr.php", { dc: "http://toolbarqueries.google.com", site: $("#an_site").attr("value") }, function(data) {
                             b_pr = data;

                             $.post("pr.php", { dc: "http://toolbarqueries.google.com", site: "www."+$("#an_site").attr("value") }, function(data) {
                                if (b_pr >= data)
                                   $("#an").append("PR ресурса "+b_pr+"<br><br>");
                                else {
                                   b_pr=data;
                                   $("#an").append("PR ресурса "+b_pr+"<br><br>");
                                }

                                $("#an").append("Проиндексировано Яндексом <a href='http://yandex.ru/yandsearch?text=site:"+$("#an_site").attr("value")+"' target='_blank'>смотреть</a><br>");
                                $("#an").append("Проиндексировано Google <a href='http://www.google.ru/search?&q=site:"+$("#an_site").attr("value")+"' target='_blank'>смотреть</a><br>");
                                $.post("ya_cat.php", { site: $("#an_site").attr("value") }, function(data) {
                                   $("#an").append("Яндекс каталог <a href='http://search.yaca.yandex.ru/yandsearch?text="+$("#an_site").attr("value")+"&rpt=rs2' target='_blank'>"+data+"</a><br>");
                                   $.post("dmoz.php", { site: $("#an_site").attr("value") }, function(data) {
                                      $("#an").append("DMOZ <a href='http://search.dmoz.org/cgi-bin/search?search="+$("#an_site").attr("value")+"' target='_blank'>"+data+"</a><br><br>");
                                      $.post("li_stat.php", { site: $("#an_site").attr("value") }, function(data) {
                                         $("#an").append("Средняя посещаемость "+data+"<br><br>");
                                         $.post("middle.php", { site: $("#an_site").attr("value") }, function(data) {
                                            $("#an").append(data);
                                            alert("Анализ сайта завершен.");
                                         });
                                      });
                                   });
                                });
                             });
                          });
                       });
                    });
                 });
              });
              $("#show_an_site").append("<br><a onclick='$(\"#show_an_site\").fadeOut();' style='text-decoration:underline;'>скрыть</a>");
              $("#show_an_site").fadeIn();
           }
        }

    });
 });
}


Не смотрите на размер, на самом деле функция очень простая. В ней лишь идет пересылка данных в нужные файлы с помощью Ajax. Подробнее об этом лучше почитать здесь. Там вы найдете описания всех использованных методов. Не забудьте также подобрать картинку ajax-loader.gif.

3. Настроим curl — grab.php:

<?php

function grab($site) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $site);
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        $data = curl_exec($ch);
        curl_close($ch);
        if ($data) return $data; else return FALSE;
}

function size($site) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $site);
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_exec($ch);
        $fs = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
        curl_close($ch);
        if ($fs) return $fs; else return FALSE;
}

function robots($site) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $site);
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        $data = curl_exec($ch);
        $hc = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($hc!="200") $data="robots.txt не найден.";
        return $data;
}

?>


Все стандартно и не представляет никакой сложности. grab служит для парсинга страницы, size определяет ее размер, а robots запрашивает соответствующий файл — robots.txt.

4. Пойдем по порядку. Файлы библиотеки phpWhois размещаем в папке whois и пишем небольшой код для обращения к ним — whois_created.php:

<?php

   header('Content-type: text/html; charset=utf-8');

   include('whois/whois.main.php');

   if (substr($_POST['whois'], 0, 7) == "http://")
      $_POST['whois'] = str_replace("http://", "", $_POST['whois']);
   if (substr($_POST['whois'], 0, 4) == "www.")
      $_POST['whois'] = str_replace("www.", "", $_POST['whois']);
   $whois = new Whois();
   $result = $whois->Lookup($_POST['whois']);

   if (trim($result['regrinfo']['domain']['created']) != "")
      echo(date('j.n.Y',strtotime($result['regrinfo']['domain']['created'])));
   else
      echo('-');

?>


5. Приступаем непосредственно к парсингу — header.php:

<?php

   header('Content-type: text/html; charset=utf-8');

   include('grab.php');

   function check($id) {

      if (substr($_POST['site'], 0, 7) == 'http://')
         $_POST['site'] = str_replace('http://', '', $_POST['site']);
      if (substr($_POST['site'], 0, 4) == 'www.')
         $_POST['site'] = str_replace('www.', '', $_POST['site']);

      $ip = gethostbyname($_POST['site']);

      $_POST['site'] = 'http://'.$_POST['site'];

      $html = grab($_POST['site']);
      $fs = size($_POST['site']);

      if (empty($html))
         exit('Сайт не открылся !<br><br>');

      echo('IP - '.$ip.'<br>');
      echo('Размер страницы - '.round($fs/1024,1).' КБ ('.$fs.' байт)<br><br>');

      $status = (preg_match("/<title>(.*?)<\/title>/", $html, $title))? 1 : 0;
      if ($status == 1)
         echo('Заголовок - "'.$title[1].'"<br><br>');
      else
         echo('<b>Заголовок отсутствует.</b><br><br>');

      $meta = get_meta_tags($_POST['site']);

      if ($meta["keywords"] != "")
         echo('Ключевые слова - "'.$meta["keywords"].'"<br><br>');
      else
         echo('<b>Ключевые слова отсутствуют.</b><br><br>');

      if ($meta["description"] != "")
         echo('Описание - "'.$meta["description"].'"<br><br>');
      else
         echo('<b>Описание отсутствует.</b><br><br>');
   }

   check($_POST['site']);

?>


gethostbyname получает искомую последовательность цифр IP адреса, с помощью регулярного выражения preg_match мы выделяем заголовок, ну а мета теги забираем функцией get_meta_tags.

6. ya.php отвечает за определение тИЦ:

<?php

header('Content-type: text/html; charset=utf-8');

include('grab.php');

function get_yandex($url){
        
        $ret = 'N/A';
        
        if(substr($url,0,7) != 'http://')
                $url = 'http://' . $url;
                
        if($content = grab('http://bar-navig.yandex.ru/u?ver=2&url='.urlencode($url).'&show=1&post=0')){
                
                if( class_exists('SimpleXMLElement') ){
                        if( $xmldoc = new SimpleXMLElement($content) ){
                                $tcy = $xmldoc->tcy;
                                if( !empty($tcy) ) $ret = $tcy['value'];
                        }
                }
                else{
                        preg_match("/value=\"(.\d*)\"/",$content,$tic);
                        if( !empty($tic[1]) ) $ret = $tic[1];
                }
        }
        
        return base_convert($ret,10,10);

}

 if(substr($_POST['site'],0,7) != 'http://')
                $_POST['site'] = 'http://' . $_POST['site'];

 $path = parse_url($_POST['site']);

 echo(get_yandex($path['host']));

?>


Я уже как-то рассказывал, что есть несколько способов его получения. Здесь использовался самый простой: отправка домена по адресу bar-navig.yandex.ru/u?ver=2&url=http://site.ru&show=1&post=0, где на выдаче стоит XML документ. Нам лишь остается его распарсить — забрать значение, которое находится в свойстве value тега tcy.

7. pr.php определяет PageRank:

<?php
error_reporting(E_ALL ^ E_NOTICE);

$googlehost='toolbarqueries.google.com';
$googleua='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5';

function StrToNum($Str, $Check, $Magic) {
  $Int32Unit = 4294967296;
  $length = strlen($Str);
  for ($i = 0; $i < $length; $i++) {
      $Check *= $Magic;  
      if ($Check >= $Int32Unit) {
          $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
          $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
      }
      $Check += ord($Str{$i});
  }
  return $Check;
}

function HashURL($String) {
  $Check1 = StrToNum($String, 0x1505, 0x21);
  $Check2 = StrToNum($String, 0, 0x1003F);
  $Check1 >>= 2;  
  $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
  $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
  $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);
  $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
  $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );
  return ($T1 | $T2);
}

function CheckHash($Hashnum) {
  $CheckByte = 0;
  $Flag = 0;
  $HashStr = sprintf('%u', $Hashnum);
  $length = strlen($HashStr);
  for ($i = $length - 1;  $i >= 0;  $i --) {
      $Re = $HashStr{$i};
      if (1 === ($Flag % 2)) {              
          $Re += $Re;    
          $Re = (int)($Re / 10) + ($Re % 10);
      }
      $CheckByte += $Re;
      $Flag ++;
  }
  $CheckByte %= 10;
  if (0 !== $CheckByte) {
      $CheckByte = 10 - $CheckByte;
      if (1 === ($Flag % 2) ) {
          if (1 === ($CheckByte % 2)) {
              $CheckByte += 9;
          }
          $CheckByte >>= 1;
      }
  }
  return '7'.$CheckByte.$HashStr;
}

function getch($url) { return CheckHash(HashURL($url)); }

function getpr($url) {
global $googlehost,$googleua;
$ch = getch($url);
$fp = fsockopen($googlehost, 80, $errno, $errstr, 30);
if ($fp) {
  $out = "GET /tbr?client=navclient-auto&hl=en&ch=$ch&ie=UTF-8&oe=UTF-8&features=Rank&q=info:$url HTTP/1.1\r\n";
  $out .= "User-Agent: $googleua\r\n";
  $out .= "Host: $googlehost\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp)) {
 $data = fgets($fp, 128);
 $pos = strpos($data, "Rank_");
 if($pos === false){} else{
  $pr=substr($data, $pos + 9);
  $pr=trim($pr);
  $pr=str_replace("\n",'',$pr);
  return $pr;
 }
  }
  fclose($fp);
}
}

function pagerank($url) {
if (!preg_match('/^(http:\/\/)?([^\/]+)/i', $url)) { $url='http://'.$url; }
$pr=getpr($url);
$pagerank="$pr";
$out=''.$pagerank.'';
return $out;
}

$url = $_POST['site'];
if (substr($url, 0, 7) == "http://")
    $url = str_replace("http://", "", $url);
if (substr($url, 0, 4) == "www.")
    $url = str_replace("www.", "", $url);
$pr = pagerank($url);
if ($pr == "")
    $pr = 0;
echo $pr;
?>


Код полностью скопирован с одного из гуглосообществ.

8. Индексация.

Можно было, конечно, спарсить количество проиндексированных страниц непосредственно из выдачи поисковой системы, но этот путь при многократном использовании ведет к бану IP, так что просто дадим ссылки. Тем же, кто хочет узнать как это сделать — сюда.

9. Присутствие в ЯК проверяем в ya_cat.php:

<?php

   header('Content-type: text/html; charset=utf-8');

   include('grab.php');

   function ya_cat($url) {
      $url = urlencode($url);
      $str = grab('http://yaca.yandex.ru/yca?text='.$url.'&yaca=1');

      preg_match("/<title>.*\((.*)\)<\/title>/siU", $str, $out);

      return trim($out[1]);
   }

   $url = $_POST['site'];

   if (substr($url, 0, 7) == "http://")
      $url = str_replace("http://", "", $url);
   if (substr($url, 0, 4) == "www.")
      $url = str_replace("www.", "", $url);

   $yaca = ya_cat($url);

   if ($yaca == 0)
      $yaca = "нет";
   else if ($yaca >= 1)
      $yaca = "есть";

   echo($yaca);

?>


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

10. Наличие в DMOZ смотрим из dmoz.php:

<?php

header('Content-type: text/html; charset=utf-8');

include('grab.php');

function get_dmoz_count($host){
        $ret = 0;
        
        if ($s = grab('http://www.dmoz.org/search/?q='.$host)) {
                if (preg_match('/<small>\(\d+\-\d+ of (\d+)\)<\/small>/siU', $s, $a) ){
                        $ret = $a[1];
                }
        }
        
        return $ret;
}

$url = $_POST['site'];

if (substr($url, 0, 7) == "http://")
   $url = str_replace("http://", "", $url);
if (substr($url, 0, 4) == "www.")
   $url = str_replace("www.", "", $url);

$dm = get_dmoz_count($url);

if ($dm == 0)
   $dm="нет";
else if ($dm >= 1)
   $dm="есть";

echo($dm);

?>


Принцип тот же. Опять перебираем текст и находим в нужном теге число: 0 — нет, >1 — есть.

11. С посещаемостью по LI справится даже ребенок — li_stat.php:

<?php

header('Content-type: text/html; charset=utf-8');

include('grab.php');

function li_stat($url){
        
        $lines = grab("http://counter.yadro.ru/values?site=".$url);
        $info = array();
        $lines = explode("\n", $lines);
        foreach ($lines as $line){
                if (preg_match("|LI_([^ ]+) = (\d*);|", $line, $ok)) {
                        $info[$ok[1]] = $ok[2];
                }
        }

        return $info;
}
$url = $_POST['site'];

if (substr($url, 0, 7) == "http://")
        $url = str_replace("http://", "", $url);
if (substr($url, 0, 4) == "www.")
        $url = str_replace("www.", "", $url);

$ff = li_stat($url);
if (strlen($ff[month_hit]) < 1) {
        $li="-";
} else {
        $srv=floor($ff[week_vis]/7);
        $srh=floor($ff[week_hit]/7);
        $li="$srv / $srh";
}
echo($li);

?>


Надо всего лишь знать правильные адреса. Мы разбиваем полученные данные по строкам и рассматриваем каждую, пока не найдем нужное число.

12. Внешние и внутренние ссылки можно посмотреть в middle.php (там же и запрос robots.txt):

<?php

        header('Content-type: text/html; charset=utf-8');

        include('grab.php');

        function check($id) {

                if (substr($_POST['site'], 0, 7) == 'http://')
                        $_POST['site'] = str_replace('http://', '', $_POST['site']);
                if (substr($_POST['site'], 0, 4) == 'www.')
                        $_POST['site'] = str_replace('www.', '', $_POST['site']);
                $_POST['site'] = 'http://'.$_POST['site'];

                $html = grab($_POST['site']);

                if (empty($html))
                        exit('Сайт не открылся !');

                $cvne=0;
                $cvnu=0;
                $status = (preg_match_all("/<a.*?href=(?:\"|')(.*?)(?:\"|')/", $html, $res))? 1 : 0;
                if ($status == 1)
                {
                        echo('<b>Внешние ссылки</b><br>');
                        if (substr($_POST['site'], 0, 7) == 'http://')
                                $_POST['site'] = str_replace('http://', '', $_POST['site']);
                        if (substr($_POST['site'], 0, 4) == 'www.')
                                $_POST['site'] = str_replace('www.', '', $_POST['site']);
                        $_POST['site'] = 'http://'.$_POST['site'];
                        for ($i = 0; $i < count($res[1]); $i++)
                                {
                                        if ((substr($res[1][$i], 0, 7) == 'http://') or (substr($res[1][$i], 0, 4) == 'www.'))
                                        {
                                                if (substr($res[1][$i], 0, 7) == 'http://')
                                                        $res[1][$i] = str_replace('http://', '', $res[1][$i]);
                                                if (substr($res[1][$i], 0, 4) == 'www.')
                                                        $res[1][$i] = str_replace('www.', '', $res[1][$i]);
                                                $res[1][$i] = 'http://'.$res[1][$i];
                                                $path = parse_url($res[1][$i]);
                                                $url = parse_url($_POST['site']);

                                                if ($path['host'] != $url['host'])
                                                {
                                                        $cvne++;
                                                        if ($cvne == 1)
                                                                echo('<textarea style="width:400px; height: 300px;">');
                                                        echo($res[1][$i]."\n");
                                                }
                                        }
                                }

                        if ($cvne == 0)
                                echo('отсутствуют<br><br>');
                        else
                                echo('</textarea><br>Общее количество внешних ссылок - '.$cvne.'<br><br>');

                        echo('<b>Внутренние ссылки</b><br>');
                        for ($i = 0; $i < count($res[1]); $i++)
                                {
                                        if((substr($res[1][$i], 0, 7) == 'http://') or (substr($res[1][$i], 0, 4) == 'www.'))
                                        {
                                                if (substr($res[1][$i], 0, 7) == 'http://')
                                                        $res[1][$i] = str_replace('http://', '', $res[1][$i]);
                                                if (substr($res[1][$i], 0, 4) == 'www.')
                                                        $res[1][$i] = str_replace('www.', '', $res[1][$i]);
                                                $res[1][$i] = 'http://'.$res[1][$i];
                                                $path = parse_url($res[1][$i]);
                                                $url = parse_url($_POST['site']);
                                                if ($path['host'] == $url['host'])
                                                {
                                                        $cvnu++;
                                                        if ($cvnu == 1)
                                                                echo('<textarea style="width:400px; height: 300px;">');
                                                        echo($res[1][$i]);
                                                        echo("\n");
                                                }
                                        }
                                        else
                                        {
                                                $cvnu++;
                                                if ($cvnu == 1)
                                                        echo('<textarea style="width:400px; height: 300px;">');
                                                echo($res[1][$i]);
                                                echo("\n");
                                        }
                                }
                        if ($cvnu == 0)
                                echo('отсутствуют<br><br>');
                        else
                                echo('</textarea><br> Общее количество внутренних ссылок - '.$cvnu.'<br><br>');
                }
                else
                        echo('Ссылки отсутствуют !<br><br>');

                echo('<pre>'.robots($_POST['site']."/robots.txt").'</pre>');

        }

        check($_POST['site']);

?>


Регуляркой мы выделяем все ссылки на странице, а затем простым перебором сравниваем хосты у полученной и текущей (адрес сайта). Если совпадают, то ссылка внутренняя. Если нет, то внешняя.

13. Осталось парочка служебных файлов. Один из них date.php:

<?php

header('Content-type: text/html; charset=utf-8');

$dt = date('j.n.Y');

echo($dt);

?>


Думаю, комментарии излишни.

14. В site.php идет контроль заполнения:

<?php

if (empty($_POST['site']))
   exit('Поле "Сайт" не заполнено !');

if (!empty($_POST['site'])) {
   $url = $_POST['site'];
   if (substr($url, 0, 7) == "http://")
      $url = str_replace("http://", "", $url);
   if (substr($url, 0, 4)=="www.")
      $url = str_replace("www.", "", $url);
   if (!preg_match("|^[0-9a-z\._-]+\.[a-z]{2,5}$|i", $url))
      exit('Поле "Сайт" должно соответствовать формату somewhere.ru !');
   else
      exit('c');
}

?>


Вот и все.

Урок подготовил Хединшаблоны для dle 11.2

Напишите своё мнение