Марнет како извор на инспирација за агрегирање на податоци

marnet agregator

Марнет, како „најинспиративна“ и „најпрогресивна“ институција во Македонија ме поттикна да го напишам PHP кодот во продолжение. Секој што сака и што може и разбира, слободно може да го искористи, менува и надградува и да го употребува и за други слични намени.

Што е работата?

Поради премногу лимитираниот начин на пребарување на податоците што се претставени на сајтот, лошата организација на сајтот, фрустрацијата да не може да се најде едноставен податок и слично, решив да напишам неколку реда код, со кој ќе можете да ги соберете, агрегирате, сите податоци од страната на Марнет и да ги искористите за свои потреби. Се работи за користење на неколку можности што ги нуди PHP а коишто според мое мислење не се доволно познати и доволно искористени од програмерите. Тоа се класите DOMDocument и DOMXpath. Со нивна помош и со употреба на Xpath се обработуваат сите страници (линкови) на http://dns.marnet.net.mk и се вадат податоците од нив и се сместуваат во табела во база на податоци.

Креирајте табела во вашата MySql база на податоци

Искористете го следниот код за да ја креирате табелата “podatoci” во вашата база на податоци:


CREATE TABLE IF NOT EXISTS `podatoci` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `domain` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `date_registered` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `registrant_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `registrant_address` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `registrant_edb` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `registrant_telefax` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `admin_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `admin_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `admin_phone` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `tech_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `tech_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `tech_phone` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `dns_name_1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `dns_name_2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `dns_ip_1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `dns_ip_2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

Креирајте нова датотека со име index.php

Внесете го следниот код:

<?php
$link = mysql_connect('localhost', 'root', 'toor') or
  die('Cannot connect to database');
mysql_select_db('mkregistrar') or
  die('Cannot select database');
mysql_query("SET NAMES UTF8",$link);

$url = 'http://dns.marnet.net.mk/';

$doc = new DOMDocument();
@$doc->loadHTMLFile($url . 'registar.php');
$xpath = new DOMXpath($doc);
$elements = $xpath->query("//a[@class='meni1']");
unset($doc);
unset($xpath);

foreach ($elements as $element) {
  $urlbukva = $url . $element->getAttribute('href');

  $doc = new DOMDocument();
  @$doc->loadHTMLFile($urlbukva);
  $xpath = new DOMXpath($doc);
  $bukvabrojki = $xpath->query("//a[@class='do']");
  unset($doc);
  unset($xpath);

  foreach ($bukvabrojki as $theurl) {
    $pos = strpos($theurl->getAttribute('href'), "bukva");
    if ($pos !== false) {
      $doc = new DOMDocument();
      @$doc->loadHTMLFile($url . $theurl->getAttribute('href'));
      $xpath = new DOMXpath($doc);
      $domeni = $xpath->query("//a[@class='do']");
      unset($doc);
      unset($xpath);

      foreach ($domeni as $domen) {
      $pos2 = strpos($domen->getAttribute('href'), "dom");
      if ($pos2 !== false) {
        $doc = new DOMDocument();
        @$doc->loadHTMLFile($url . $domen->getAttribute('href'));
        $xpath = new DOMXpath($doc);
        $data = $xpath->query("//td[@class='meni']/table[last()]/tr/td/table");
        unset($doc);
        unset($xpath);

        if (!is_null($data->item(0))) {
          $nodes = $data->item(0)->childNodes;
          $domain = substr($domen->getAttribute('href'), 17);
          $date_registered = antisql($nodes->item(2)->childNodes->item(2)->nodeValue);
          $registrant_name = antisql($nodes->item(3)->childNodes->item(2)->nodeValue);
          $registrant_address = antisql($nodes->item(4)->childNodes->item(2)->nodeValue);
          $registrant_edb = antisql($nodes->item(5)->childNodes->item(2)->nodeValue);
          $registrant_telefax = antisql($nodes->item(6)->childNodes->item(2)->nodeValue);
          $admin_name = antisql($nodes->item(9)->childNodes->item(2)->nodeValue);
          $admin_email = antisql($nodes->item(10)->childNodes->item(2)->nodeValue);
          $admin_phone = antisql($nodes->item(11)->childNodes->item(2)->nodeValue);
          $tech_name = antisql($nodes->item(13)->childNodes->item(2)->nodeValue);
          $tech_email = antisql($nodes->item(14)->childNodes->item(2)->nodeValue);
          $tech_phone = antisql($nodes->item(15)->childNodes->item(2)->nodeValue);
          $dns_name_1 = antisql($nodes->item(18)->childNodes->item(0)->nodeValue);
          $dns_ip_1 = antisql($nodes->item(18)->childNodes->item(2)->nodeValue);
          $dns_name_2 = antisql($nodes->item(19)->childNodes->item(0)->nodeValue);
          $dns_ip_2 = antisql($nodes->item(19)->childNodes->item(2)->nodeValue);

          $sql = "INSERT INTO `podatoci` (
          `id`, `domain`, `date_registered`, `registrant_name`,
          `registrant_address`, `registrant_edb`, `registrant_telefax`,
          `admin_name`, `admin_email`, `admin_phone`, `tech_name`,
          `tech_email`, `tech_phone`, `dns_name_1`, `dns_name_2`,
          `dns_ip_1`, `dns_ip_2`)
          VALUES (
          NULL , '$domain', '$date_registered', '$registrant_name',
          '$registrant_address', '$registrant_edb', '$registrant_telefax',
          '$admin_name', '$admin_email', '$admin_phone', '$tech_name',
          '$tech_email', '$tech_phone', '$dns_name_1', '$dns_name_2', '$dns_ip_1', '$dns_ip_2'
          );";

          mysql_query($sql,$link);
        }
      }
    }
   }
 }
}

function antisql($data) {
    if (is_array($data)) {
        foreach ($data as $name=>$value) {
            $data[$name] = mysql_real_escape_string($value);
        }
    } else {
        $data = mysql_real_escape_string($data);
    }
    return $data;
 }
?>

Внимание

Ова е само доказ на концепт. Најверојатно серверот на Марнет ќе го прекине процесот кога ќе дојде до заклучок дека можеби станува за DoS напад. Овој код не препорачувам да го користите како готов (copy-paste) на „живи“ веб страни, бидејќи не е оптимизиран, и можно е да има грешки што би предизвикале нефункционалност на вашата веб страна. Постои простор за подобрување на овој код, пред се во внесувањето на податоците во базата на податоци, и др.

Заклучок

Целта ми беше да се даде пример на користење на горенаведените класи, со што би се поттикнале македонските PHP програмери на размислување и изнаоѓање на креативни идеи и охрабрување да испрограмираат нешто и да го споделат со сите.

Преземање

Како датотека за преземање ја нудам sql датотеката генерирана како експорт на табелата “podatoci” од мојата база на податоци што ја пополнив со извршување на горенаведениот код. Податоците не се целосни, односно табелата не ги содржи сите податоци од Марнет. Преземете ја овде.

gravatar
Автор: Горан Митев
За авторот:

Freelance PHP програмер којшто професионално работи развој на комплексни веб апликации, CMS решенија, Е-Бизнис решенија, Wordpress. повеќе >>

5 Коментари

  1. Интересно 🙂 Имам и јас направено вакво нешто поодамна http://perfectflow.org/domeni

  2. Го вклучив crawlerot и заглави кај буквата s некаде последен домен што го собра беше, stobiflips.com.mk може малку хелп да го оправам.

  3. Еве: http://pastebin.com/6eiyS5GW линкот е привремен, ќе трае еден месец. Промената е во линија 21, во for циклусот. Се внесува од која буква да почне, 0=NUM, 1=А, 2=B … 19=S.

  4. ај да ја промениме / убрзаме малку скриптава 🙂 и да ја направиме отпорна на промена на темплејт кој го користи марнет.

    пример ова е урл на марнет за дадена страна со домаини 🙂

    http://dns.marnet.net.mk/registar.php?bukva=C&amp… на пример

    кои се буквите : од NUM, А, …, Z

    кои се деловите : 0,1,2, …

    -како ќе знаеш дека е последна страна ? има исти линкови со претходната кои содржат параметар "dom"

    структура на линк од домејн со име на домејн 🙂 – е тука дури треба да ти дојде користење на DOM и XPath за земање на анхорите, дури и не мора можеш со regex ( ти теквит промена на темплејт ).

    http://dns.marnet.net.mk/registar.php?dom=cad-ing

    вредноста на "dom" параметарот е домејнот од кој се зема само името ( кој поседува .com.mk поседува и .mk )

    ако не те мрзи преправи ја ако не ко ќе имам 20-30 мин. и кога нема да ме мрзи ќе ја средам :).

    Топ артикл ! :))))