PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (13): [1] 2 3 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 195
nepster Отправлено: 28 Декабря, 2015 - 13:04:28 • Тема: Crawler • Форум: Вопросы новичков

Ответов: 8
Просмотров: 963
imediasun пишет:
Друзья , получил техзадание и мысли не имею как это реализовать, момогите кто чем может, идеи, статьи, код, за все очень благодарен
Необходимо реализовать Crawler.
Задачи бота:
1. по указанному url-у обойти весь сайт и посчитать на каждой странице кол-во тегов <img>
2. сгенерировать отчет в файл report_dd.mm.yyyy.html в виде html таблице с отсортированным результатом

Условия:
1. бот не должен выходить за рамки указанного сайта
2. бот должен работать в cli режиме и запускаться простейшим образом из консоли
3. код должен быть с комментариями (можно на русском)
4. код должен соответствовать стандарту PSR-0
5. использовать сторонии библиотеки и фреймворки запрещено


Где-то я это уже видел: https://github[dot]com/nepster-web/p[dot][dot][dot]rawler-test-work
nepster Отправлено: 01 Ноября, 2013 - 02:12:26 • Тема: События, клык дублирует событие • Форум: JavaScript & VBScript

Ответов: 3
Просмотров: 1291
armancho7777777, подскажите пожалуйста, стоит ли так проверять или проверять просто по клику на поле, а там уже смотреть есть пешка или нет ?
nepster Отправлено: 31 Октября, 2013 - 23:53:20 • Тема: События, клык дублирует событие • Форум: JavaScript & VBScript

Ответов: 3
Просмотров: 1291
Собственно пишу шашки на js, практикуюсь. Получился такой момент:


CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.         /**
  3.         *  Ход игрока
  4.         */
  5.         hit: function()
  6.         {
  7.             var obj = this;
  8.             var checkerCoord = null; // шашка, которой будем ходить (активная)
  9.      
  10.             $(function() {
  11.  
  12.                 /**
  13.                  * Пользователь наводит на шашки, необходимо убедиться, что
  14.                  * он наводит на свои и получает возможность хода
  15.                  */  
  16.                 $('[data-item="checker"]').hover(
  17.                     function() {
  18.                         if($(this).data('checker') == obj.player)
  19.                             $( this ).addClass('ck_hover');
  20.                     },
  21.                     function() {
  22.                         if($(this).data('checker') == obj.player)
  23.                             $( this ).removeClass('ck_hover');
  24.                     }
  25.                 );
  26.                
  27.                
  28.                 $('[data-item="checker"]').on("click", function() {
  29.                    
  30.                     console.log('Пешка');
  31.                    
  32.                     if($(this).data('checker') == obj.player)
  33.                     {
  34.                         // удалим все активные шашки, если они были
  35.                         $(this).parents('#board').children().find('div').removeClass('active')
  36.                         $(this).parents('#board').children().removeClass('cell_help');
  37.                        
  38.                         // при нажатии на шашку, делаем ее активной
  39.                         $(this).addClass('active');
  40.                        
  41.                         checkerCoord = $(this).data('coord');
  42.                     }
  43.                 });
  44.                
  45.                
  46.                 // клик по полю
  47.                 $('[data-item="cell"]').on("click", function() {
  48.                    
  49.                     console.log('Поле');
  50.                    
  51.                     if(checkerCoord != null)
  52.                     {
  53.                         // координаты ячейки
  54.                         var cellCoord = $(this).data('coord');
  55.                        
  56.                         //checkerCoord - координаты шашки
  57.                        
  58.                         // обновить поле
  59.                         obj.updateCell(checkerCoord,cellCoord);
  60.                     }
  61.                 });
  62.                
  63.             });
  64.         },
  65.  



Тут есть 2 события:

CODE (javascript):
скопировать код в буфер обмена
  1.             $('[data-item="checker"]').on("click", function() {
  2.                 $('[data-item="cell"]').on("click", function() {


1 клик по шашке, второе клик по полю.
Если поле пустое, то все хорошо, однако если поле с шашкой и я кликаю по шашке, то срабатывают оба события.

// генерация поля, примерна вот такая
CODE (javascript):
скопировать код в буфер обмена
  1.             // расставляем все черные шашки
  2.             ch_black.forEach(function(coord)
  3.             {
  4.                 $('[data-item="cell"][data-coord="'+coord+'"]').html('<div class="checker ck_black" data-item="checker" data-checker="black" data-coord="'+coord+'"></div>')
  5.             });


Подскажите пожалуйста как сделать так, что бы кликать по полю и по шашке можно было отдельно.
nepster Отправлено: 22 Октября, 2013 - 06:45:19 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
Назовем это версией 0.1

Очень жду Ваших комментариев
nepster Отправлено: 21 Октября, 2013 - 23:04:44 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
Обновляю




Есть функция, которая определяет полный url к странице

PHP:
скопировать код в буфер обмена
  1. // Получаем полную ссылку к странице нашего сайта
  2. public static function getFullUrl($www, $link, $myLink, $parentLink = false)
  3. {
  4.     /*
  5.         $www         = обрабатывать ли www
  6.         $link        = ссылка, которую необхоимо преобразовать
  7.         $myLink      = ссылка домена
  8.         $parentLink  = родительская ссылка $link, для обработки ссылок вида: news/id/32/
  9.     */
  10.  
  11.     if(!$www)
  12.     {
  13.         $myLink = str_replace('//www.','//',$myLink);
  14.         $link   = str_replace('//www.','//',$link);
  15.     }
  16.  
  17.     $parse_url = parse_url($link);
  18.  
  19.     if(isset($parse_url['scheme']) && isset($parse_url['host']))
  20.     {
  21.         if(isset($parse_url['path']))
  22.         {
  23.             return $myLink.$parse_url['path'];
  24.         }
  25.         else
  26.         {
  27.             return $link;
  28.         }
  29.     }
  30.  
  31.     if(!isset($parse_url['scheme']) && !isset($parse_url['host']) && isset($parse_url['path']))
  32.     {          
  33.         if(substr($link,0,1) != '/')
  34.         {
  35.             $path  = (isset($parse_url['path']))  ? '/'.$parse_url['path']  : '';
  36.             $query = (isset($parse_url['query'])) ? '/'.$parse_url['query'] : '';
  37.  
  38.             // тут интересная ситуация
  39.             // если мы находимся на странице с адресом к примеру http://nodejs.org/api/
  40.             // и видем ссылку documentation.html, то при добавлении домена, мы получим:
  41.             // http://nodejs.org/documentation.html и это будет не правильно, так как
  42.             // верный url: http://nodejs.org/api/documentation.html
  43.             // для таких вот ситуаций, нам и необходама родительская ссылка
  44.             if($parentLink)
  45.             {
  46.                 return $parentLink.$path.$query;
  47.             }
  48.             else
  49.             {
  50.                 return $myLink.$path.$query;
  51.             }
  52.         }
  53.  
  54.         return $myLink.$link;
  55.     }
  56.  
  57.     if(isset($parse_url['query']))
  58.     {    
  59.         $parse_url['query'] = ltrim($parse_url['query'],'/');
  60.  
  61.         if($parentLink)
  62.         {
  63.             return $parentLink.'/?'.$parse_url['query'];
  64.         }
  65.         else
  66.         {
  67.             return $myLink.'/?'.$parse_url['query'];
  68.         }
  69.     }
  70.  
  71.     return false;
  72. }


Вроде обошел все моменты, но все же появляются случаи такие как /.., /., и вот еще интересный пример: http://nodejs[dot]org/docs/v0[dot]10[dot]21/[dot][dot][dot]ls[dot]html/all[dot]html - выдало мне вот такую вот ссылку.

Я находился на http://nodejs[dot]org/docs/v0[dot]10[dot]21/api/tls[dot]html (родительская ссылка) на сайте была ссылка вот такая all.html, должно было попасть http://nodejs.org/docs/v0.10.21/api/all.html, но не попало.

Помогите пожалуйста подправить мою функцию, возможно я и еще что то упустил ?
nepster Отправлено: 20 Октября, 2013 - 22:01:43 • Тема: определить является ли внешняя ссылка файлом • Форум: Работа с сетью

Ответов: 1
Просмотров: 1420
Собственно пишу парсер сайта, и когда он натыкается на файлы, ссылка вида:

CODE (htmlphp):
скопировать код в буфер обмена
  1. http://nodejs.org/dist/v0.10.21/x64/node-v0.10.21-x64.msi


это его дико тормозит.

Вопрос такой можно ли проверить внешнюю ссылку на файл ?
Тоесть является ли ссылка просто html документом или файлом ?
nepster Отправлено: 19 Октября, 2013 - 23:33:46 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
забыл, файл приложить
nepster Отправлено: 19 Октября, 2013 - 23:14:53 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
Если что то забыл, для удобства выкладываю все в архиве.

Теперь мы умеем идти на сайт, собирать кол-во ссылок с сайта, считать изображения, обпередлять код страницы и все это записывать в файл.

Снова жду ваших комментариев и продолжаю работать над обходом всего сайта

Итак обновляем данне:

PHP:
скопировать код в буфер обмена
  1.  
  2. header('Content-Type: text/html; charset=utf-8');
  3. ini_set('display_errors', 1);
  4.  
  5. require_once('crawler/load.php');
  6.  
  7. $start = microtime(true);
  8.  
  9.  
  10. $getUrl = 'http://nodejs.org/';
  11. $parce = new lib\parse();
  12.  
  13. $parce->run($getUrl);
  14.  
  15. echo '<br/><p>Время выполнения скрипта: '.(microtime(true) - $start).' сек.</p>';
  16.  




parse.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. namespace lib;
  4.  
  5. class parse extends patterns
  6. {
  7.     public $getCurrentParseUrl = '';
  8.    
  9.     public $getParseUrlLimit = 500;
  10.    
  11.     // массив всех URL сайта
  12.     public $getUrlArray = array();
  13.    
  14.    
  15.    
  16.     public function __construct()
  17.     {
  18.         date_default_timezone_set('Europe/Kiev');
  19.     }
  20.    
  21.    
  22.    
  23.     // проверим урл на валидность
  24.     public function isUrl($url)
  25.     {
  26.         return filter_var($url, FILTER_VALIDATE_URL);
  27.     }
  28.      
  29.    
  30.    
  31.     public function run($url)
  32.     {
  33.         $this->getCurrentParseUrl = rtrim($url,'/');
  34.        
  35.         // создать файл для статистики
  36.         statFile::$prefix_file = '_images';  // префикс файла
  37.         statFile::$template    = 'stat.tpl'; // шаблон файла
  38.         statFile::create();  // создать файл
  39.         /************************************************/
  40.        
  41.         if(!$this->isUrl($this->getCurrentParseUrl) || !$this->isSuccessLink($this->getCurrentParseUrl))
  42.         {
  43.             // сформировать данные статистики для главной ссылки
  44.             statFile::images(0,'Главная',$this->getCurrentParseUrl,404,0);
  45.             statFile::update();  // обновить данные файла статистики
  46.             exit;
  47.         }
  48.        
  49.         // дерним url, получаем html код
  50.         $html = $this->tweak($this->getCurrentParseUrl);
  51.        
  52.         // кол-во изображений на странице
  53.         $getCountImagesFromPage = $this->getAllImagesFromPage($html,$this->getParseUrlLimit, true);
  54.        
  55.         // сформировать данные статистики для главной ссылки
  56.         statFile::images(0,'Главная',$this->getCurrentParseUrl,$this->isSuccessLink($this->getCurrentParseUrl),$getCountImagesFromPage);
  57.         statFile::update();  // обновить данные файла статистики
  58.        
  59.        
  60.         // получаем все ссылки на главной странице странице
  61.         $getLinks = $this->getLinks($html,'index');
  62.        
  63.        
  64.        
  65.        
  66.    
  67.        
  68.         $this->getATest($getLinks);
  69.        
  70.     }
  71.    
  72.    
  73.    
  74.     public function tweak($url)
  75.     {
  76.         return file_get_contents($url);
  77.     }
  78.    
  79.    
  80.    
  81.     // получить все ссылки на странице
  82.     public function getATest($vars)
  83.     {
  84.      echo '<pre>';
  85.             print_r($vars);
  86.         echo '</pre>';
  87.     }
  88.    
  89.  
  90.  
  91.     // проверим принадлежит ли ссылка к нашему сайту
  92.     function isMainLink($link)
  93.     {
  94.         $parse_subdomain = false;
  95.        
  96.         $main_domain = $this->getCurrentParseUrl;
  97.         $main_domain_host = parse_url($main_domain,PHP_URL_HOST);
  98.        
  99.         // сразу избавимся от www, если есть
  100.         $link = str_replace('//www.','//',$link);
  101.        
  102.         // парсим ссылку
  103.         # отбрасываем ссылки вида: javascript://
  104.        if(!$parse_url = parse_url($link))
  105.         {
  106.             return false;
  107.         }
  108.        
  109.         // если ссылка не имеет хост
  110.         # Все ссылки вида: news/, /news/, /news/comm/, а так же отбразываем javascript:void(0)
  111.        if(!isset($parse_url['scheme']) && !isset($parse_url['host']) && isset($parse_url['path']))
  112.         {
  113.             return true;
  114.         }
  115.    
  116.         // сразу решаем вопрос с поддоменами
  117.         # все ссылки вида: http://forum.site.ru, http://www.forum.site.ru
  118.        // тут может быть много моментов, например поддомен 25 вложенности на домене 7 уровня
  119.         // поэтому нужно предусмотреть возможность сключить, выключить возможность парсить поддомены
  120.         // если попадется адрес к примеру: http://theme.forum.site.com.ua
  121.         if($parse_subdomain)
  122.         {
  123.            //
  124.         }
  125.    
  126.         // если ссылка имеет host и при этом он совпадает с указанным
  127.         # Все ссылки вида: http://site.ru, http://www.site.ru
  128.        if(isset($parse_url['host']) && $parse_url['host'] == $main_domain_host)
  129.         {
  130.             return true;
  131.         }
  132.    
  133.    
  134.         return false;
  135.     }
  136.    
  137.    
  138.    
  139.     // Получаем полную ссылку к странице нашего сайта
  140.     function getFullMainUrl($link)
  141.     {
  142.         $main_domain = $this->getCurrentParseUrl;
  143.        
  144.         $parse_url = parse_url($link);
  145.        
  146.         if(isset($parse_url['scheme']) && isset($parse_url['host']))
  147.         {
  148.             if(isset($parse_url['path']))
  149.             {
  150.                 return $main_domain.$parse_url['path'];
  151.             }
  152.             else
  153.             {
  154.                 return $link;
  155.             }
  156.         }
  157.        
  158.        
  159.         if(!isset($parse_url['scheme']) && !isset($parse_url['host']) && isset($parse_url['path']))
  160.         {          
  161.             if(substr($link,0,1) != '/')
  162.             {
  163.                 return $main_domain.'/'.$link;
  164.             }
  165.            
  166.             return $main_domain.$link;
  167.         }
  168.        
  169.         return 'error';
  170.     }  
  171.    
  172.    
  173.  
  174.     // проверим работоспособность ссылки
  175.     function isSuccessLink($url)
  176.     {
  177.         $headers = @get_headers($url);
  178.         return substr($headers[0], 9, 3);
  179.     }
  180.  
  181.    
  182.        
  183.     // получить все ссылки на странице уже в отфаршированном виде
  184.     public function getLinks($html, $page = false)
  185.     {
  186.         #$page - идентификатор
  187.        
  188.         $result = array();
  189.    
  190.         // все ссылки на странице
  191.         $getAllLinksFromPage = $this->getAllLinksFromPage($html, $this->getParseUrlLimit);
  192.        
  193.        
  194.         if($getAllLinksFromPage)
  195.         {  
  196.             // приведем наш массив ссылок в человеческий вид
  197.             foreach($getAllLinksFromPage as $link)
  198.             {
  199.                 // принадлежит ли ссылка к нашему сайту ?
  200.                 $url_main = ($this->isMainLink($link[1])) ? 1 : 0;
  201.                
  202.                 // полная ссылка (только для ссылок нашего сайта)
  203.                 $full_url = '';
  204.                 $url_code = '';
  205.                 if($url_main)
  206.                 {
  207.                     $full_url = $this->getFullMainUrl($link[1]);
  208.                     // код ссылки
  209.                     $url_code = $this->isSuccessLink($full_url);
  210.                 }
  211.                
  212.                
  213.                 $result[(!$page)?'index':$page][] = array(
  214.                         'url'=>$link[1],
  215.                         'name'=>htmlspecialchars($link[2]), // тут и картинка может быть
  216.                         'parse'=>0,
  217.                         'code' =>$url_code,
  218.                         'main'=>$url_main,
  219.                         'full_url'=>$full_url);
  220.             }
  221.         }
  222.        
  223.         return $result;
  224.     }
  225.    
  226.    
  227.    
  228. }
  229.  




patterns.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. namespace lib;
  4.  
  5. class patterns
  6. {
  7.  
  8.     // получить все ссылки на странице
  9.     public function getAllLinksFromPage($html, $limit = 1000)
  10.     {
  11.         preg_match_all("/<a href=\"([^\"]*)\">(.*)<\/a>/iU",$html,$links, PREG_SET_ORDER);
  12.         return array_slice($links , 0, $limit);
  13.     }
  14.    
  15.    
  16.     // получить все изображения на странице
  17.     public function getAllImagesFromPage($html, $limit = 1000, $count = false)
  18.     {
  19.         preg_match_all("/<img(.*)>/iU",$html, $images, PREG_SET_ORDER);
  20.        
  21.         if(!$count)
  22.         {
  23.             return array_slice($images , 0, $limit);
  24.         }
  25.         else
  26.         {
  27.             return count(array_slice($images , 0, $limit));
  28.         }
  29.     }
  30.    
  31.    
  32.    
  33. }
  34.  



statFile.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. namespace lib;
  4.  
  5. class statFile
  6. {
  7.     // верстка шаблона
  8.     public static $prefix_file = '';
  9.    
  10.     // шаблон по которому создать файл
  11.     public static $template = false;
  12.    
  13.     // верстка шаблона
  14.     public static $makeup = 'table';
  15.    
  16.      
  17.    
  18.    
  19.    
  20.     /**********************************/
  21.    
  22.     // данные по статистики изображений
  23.     private static $PacketImages = false;
  24.    
  25.    
  26.  
  27.    
  28.     public function __construct()
  29.     {
  30.     }
  31.    
  32.    
  33.    
  34.     /*
  35.     public static function load($className=__CLASS__)
  36.     {
  37.         return new $className;
  38.     }*/
  39.    
  40.    
  41.    
  42.     // адрес для файлов статистики
  43.     private static function getFileDir()
  44.     {
  45.         return dirname(__FILE__).'/../stat/';
  46.     }
  47.    
  48.    
  49.    
  50.     // имя файла
  51.     private static function getFileName()
  52.     {
  53.         return 'report'.self::$prefix_file.'_'.date("d.m.Y").'.html';
  54.     }
  55.    
  56.    
  57.    
  58.     // создать пустой файл
  59.     public static function create()
  60.     {
  61.         // указан шаблон для создания статистики
  62.         $html = self::GenerateTpl(); // содержимое файла
  63.        
  64.         // файла не существует, создадим его
  65.         if(!file_exists(self::getFileDir().self::getFileName()))
  66.         {
  67.             file_put_contents(self::getFileDir().self::getFileName(),$html);
  68.         }
  69.        
  70.         // проверим создался ли файл
  71.         if(!file_exists(self::getFileDir().self::getFileName()))
  72.         {
  73.             return false;
  74.         }
  75.        
  76.         return true;
  77.     }
  78.    
  79.    
  80.     //обновить файл
  81.     public static function update()
  82.     {
  83.         /*
  84.             Обновлять файл статистики мы будем для каждой страницы
  85.             Это сделано для того, что если по какой-то причине скрипт перестанет работать, у нас сохранялись данные
  86.         */
  87.        
  88.         $html = self::GenerateTpl(self::$PacketImages); // содержимое файла
  89.        
  90.         file_put_contents(self::getFileDir().self::getFileName(),$html);
  91.        
  92.         // проверим создался ли файл
  93.         if(!file_exists(self::getFileDir().self::getFileName()))
  94.         {
  95.             return false;
  96.         }
  97.        
  98.         return true;
  99.     }
  100.    
  101.    
  102.    
  103.     // шаблон для файла
  104.     private static function GenerateTpl($content = false)
  105.     {
  106.         $html = '';
  107.        
  108.         if(self::$template)
  109.         {
  110.             $getTplUrl = dirname(__FILE__).'/../stat/tpl/';
  111.            
  112.             if(file_exists($getTplUrl.self::$template))
  113.             {
  114.                 $html = file_get_contents($getTplUrl.self::$template);
  115.                
  116.                 // контент по умолчанию
  117.                 if(!$content)
  118.                 {
  119.                     if(self::$makeup == 'table')
  120.                     {
  121.                         $content = '
  122.                            <tr>
  123.                                <td colspan="4">Статистика</td>
  124.                            </tr>
  125.                        ';
  126.                     }
  127.                     else
  128.                     {
  129.                         $content = '
  130.                            <div class="stat">
  131.                                <div class="no_data">Статистика</div>
  132.                            </div>
  133.                        ';
  134.                     }
  135.                 }
  136.                
  137.                 $tpl_data = array();
  138.                 $tpl_data[] = '{date}';
  139.                 $tpl_data[] = '{content}';
  140.                
  141.                 $content_data = array();
  142.                 $content_data[] = date("d.m.Y");
  143.                 $content_data[] = $content;
  144.                
  145.                 // немного обработаем шаблон
  146.                 $html = str_replace($tpl_data,$content_data,$html);
  147.             }
  148.         }
  149.        
  150.         return $html;
  151.     }
  152.    
  153.    
  154.    
  155.     // сгенерировать данные для шаблона статистики по изображениям и сформировать пакет
  156.     public static function images($lvl, $name, $url, $status, $count)
  157.     {
  158.         /*
  159.         $lvl    - уровень вложенности (0 = index)
  160.         $name   - имя страницы
  161.         $url    - адрес
  162.         $status - статус
  163.         $count  - кол-во изображений
  164.         */
  165.                    
  166.         $class_status = ($status == 200) ? 'green' : 'red';
  167.            
  168.         if(self::$makeup == 'table')
  169.         {
  170.             self::$PacketImages .= '
  171.                <tr>
  172.                  <td class="name">'.$name.'</td>
  173.                  <td class="url"><a href="'.$url.'">'.$url.'</a></td>
  174.                  <td class="code '.$class_status.'">'.$status.'</td>
  175.                  <td class="img_count">'.$count.'</td>
  176.                </tr>
  177.            ';
  178.         }
  179.         else
  180.         {
  181.             self::$PacketImages .= '
  182.                <div class="stat">
  183.                  <div class="name">'.$name.'</div>
  184.                  <div class="url"><a href="'.$url.'">'.$url.'</a></div>
  185.                  <div class="code '.$class_status.'">'.$status.'</div>
  186.                  <div class="img_count">'.$count.'</div>
  187.                </div>
  188.            ';
  189.         }
  190.        
  191.         // self::$newPacketImages  - новый пакет данных для обновления файла
  192.     }
  193.    
  194. }
  195.  
nepster Отправлено: 19 Октября, 2013 - 13:19:16 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
спасибо, я как то забыл про var.

Я доделаю еще пару моментов и сброшу в файлах ля простого просмотра. Так же если кому понадобится можно будет браться. Пока по скорости не впечатляет, 322 ссылки более 30 секунд.
nepster Отправлено: 19 Октября, 2013 - 00:14:36 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. namespace lib;
  3.  
  4. class parse
  5. {
  6.     var $getCurrentParseUrl = '';
  7.    
  8.     var $getParseUrlLimit = 500;
  9.    
  10.     // массив всех URL сайта
  11.     var $getUrlArray = array();
  12.    
  13.    
  14.    
  15.     public function __construct()
  16.     {
  17.         echo '<p>Старт парсинга</p>';
  18.     }
  19.    
  20.    
  21.    
  22.     // проверим урл на валидность
  23.     public function VALIDATE_URL($url)
  24.     {
  25.         if(filter_var($url, FILTER_VALIDATE_URL))
  26.         {
  27.             return true;
  28.         }
  29.         return false;
  30.     }
  31.      
  32.    
  33.    
  34.     public function run($url)
  35.     {
  36.         //if(!$this->VALIDATE_URL($url)) die('Критическая ошибка, Ваш URL адрес не является правильным');
  37.         echo $this->getCurrentParseUrl = rtrim($url,'/');
  38.        
  39.        
  40.         // дерним url
  41.         $html = $this->tweak($this->getCurrentParseUrl);
  42.        
  43.        
  44.         // получаем все ссылки на главной странице странице
  45.         $getLinks = $this->getLinks($html,'index');
  46.        
  47.        
  48.         /*
  49.         foreach($getLinks as $link)
  50.         {
  51.             print_r($link['url']);
  52.             echo '<br/>';
  53.            
  54.         }*/
  55.        
  56.        
  57.         $this->getATest($getLinks);
  58.        
  59.     }
  60.    
  61.    
  62.    
  63.     public function tweak($url)
  64.     {
  65.         return file_get_contents($url);
  66.     }
  67.    
  68.    
  69.    
  70.     // получить все ссылки на странице
  71.     public function getATest($vars)
  72.     {
  73.         echo '<pre>';
  74.             print_r($vars);
  75.         echo '</pre>';
  76.     }
  77.    
  78.  
  79.  
  80.     // проверим принадлежит ли ссылка к нашему сайту
  81.     function is_main_link($link)
  82.     {
  83.         $parse_subdomain = false;
  84.        
  85.         $main_domain = $this->getCurrentParseUrl;
  86.         $main_domain_host = parse_url($main_domain,PHP_URL_HOST);
  87.        
  88.         // сразу избавимся от www, если есть
  89.         $link = str_replace('//www.','//',$link);
  90.        
  91.         // парсим ссылку
  92.         # отбрасываем ссылки вида: javascript://
  93.        if(!$parse_url = parse_url($link))
  94.         {
  95.             return false;
  96.         }
  97.        
  98.         // если ссылка не имеет хост
  99.         # Все ссылки вида: news/, /news/, /news/comm/, а так же отбразываем javascript:void(0)
  100.        if(!isset($parse_url['scheme']) && !isset($parse_url['host']) && isset($parse_url['path']))
  101.         {
  102.             return true;
  103.         }
  104.    
  105.         // сразу решаем вопрос с поддоменами
  106.         # все ссылки вида: http://forum.site.ru, http://www.forum.site.ru
  107.        // тут может быть много моментов, например поддомен 25 вложенности на домене 7 уровня
  108.         // поэтому нужно предусмотреть возможность сключить, выключить возможность парсить поддомены
  109.         // если попадется адрес к примеру: http://theme.forum.site.com.ua
  110.         if($parse_subdomain)
  111.         {
  112.            //
  113.         }
  114.    
  115.         // если ссылка имеет host и при этом он совпадает с указанным
  116.         # Все ссылки вида: http://site.ru, http://www.site.ru
  117.        if(isset($parse_url['host']) && $parse_url['host'] == $main_domain_host)
  118.         {
  119.             return true;
  120.         }
  121.    
  122.    
  123.         return false;
  124.     }
  125.    
  126.    
  127.    
  128.     // Получаем полную ссылку к странице нашего сайта
  129.     function getFullMainUrl($link)
  130.     {
  131.         $main_domain = $this->getCurrentParseUrl;
  132.        
  133.         $parse_url = parse_url($link);
  134.        
  135.         if(isset($parse_url['scheme']) && isset($parse_url['host']))
  136.         {
  137.             if(isset($parse_url['path']))
  138.             {
  139.                 return $main_domain.$parse_url['path'];
  140.             }
  141.             else
  142.             {
  143.                 return $link;
  144.             }
  145.         }
  146.        
  147.        
  148.         if(!isset($parse_url['scheme']) && !isset($parse_url['host']) && isset($parse_url['path']))
  149.         {          
  150.             if(substr($link,0,1) != '/')
  151.             {
  152.                 return $main_domain.'/'.$link;
  153.             }
  154.            
  155.             return $main_domain.$link;
  156.         }
  157.        
  158.         return 'error';
  159.     }  
  160.    
  161.    
  162.  
  163.     // проверим работоспособность ссылки
  164.     function is_success_link($url)
  165.     {
  166.         $headers = @get_headers($url);
  167.         return substr($headers[0], 9, 3);
  168.     }
  169.  
  170.    
  171.        
  172.     // получить все ссылки на странице уже в отфаршированном виде
  173.     public function getLinks($html, $page = false)
  174.     {
  175.         #$page - идентификатор
  176.        
  177.         $result = array();
  178.        
  179.         // все ссылки на странице
  180.         $getAllLinksFromPage = $this->getAllLinksFromPage($html);
  181.        
  182.         if($getAllLinksFromPage)
  183.         {  
  184.             // приведем наш массив ссылок в человеческий вид
  185.             foreach($getAllLinksFromPage as $link)
  186.             {
  187.                 // принадлежит ли ссылка к нашему сайту ?
  188.                 $url_main = ($this->is_main_link($link[1])) ? 1 : 0;
  189.                
  190.                 // рабочая ли ссылка
  191.                 $url_success = ($url_code == 200) ? 1 : 0;
  192.                
  193.                 echo 1;
  194.                
  195.                 // полная ссылка (только для ссылок нашего сайта)
  196.                 $full_url = '';
  197.                 if($url_main)
  198.                 {
  199.                     $full_url = $this->getFullMainUrl($link[1]);
  200.                 }
  201.                
  202.                 echo 2;
  203.                 // код ссылки
  204.                 $url_code = $this->is_success_link($full_url);
  205.                
  206.                
  207.                 echo 3;
  208.                
  209.                 $result[(!$page)?'index':$page][] = array(
  210.                         'url'=>$link[1],
  211.                         'name'=>htmlspecialchars($link[2]), // тут и картинка может быть
  212.                         'success'=>$url_success,
  213.                         'code' =>$url_code,
  214.                         'main'=>$url_main,
  215.                         'full_url'=>$full_url);
  216.             }
  217.         }
  218.        
  219.         return $result;
  220.     }
  221.    
  222.    
  223.    
  224.     // получить все ссылки на странице
  225.     public function getAllLinksFromPage($html)
  226.     {
  227.         preg_match_all("/<a href=\"([^\"]*)\">(.*)<\/a>/iU",$html,$links, PREG_SET_ORDER);
  228.         return array_slice($links , 0, $this->getParseUrlLimit);
  229.     }
  230. }



запуск
PHP:
скопировать код в буфер обмена
  1. header('Content-Type: text/html; charset=utf-8');
  2.  
  3. require_once('crawler/load.php');
  4.  
  5.  
  6.  
  7. ini_set('display_errors', 1);
  8.  
  9.  
  10.  
  11. $getUrl = 'http://forum.php.su';
  12. $parce = new lib\parse();
  13. echo $parce->run($getUrl);



Реализовал вот так вот. Собственно на данном этапе пока все работает, но еще суховато. Оцените первоначальный этап пожалуйста
nepster Отправлено: 18 Октября, 2013 - 14:33:15 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
в принципе скорость выполнения на данном этапе не очень важна.
Имеется введу я не могу использовать Ваш код, так как это тестовое задание.

Тогда я пожертвую скоростью:
я сделаю реализацию в 2 этапа.

1) я соберу массив всех внутренних ссылок сайта. Буду помещать их в массив с проверкой на уникальность, тоесть ссылки которые уже есть в массиве не продублируются.

2) второй этап уже буду парсить каждую ссылку из того массива на собственные нужды.


Я потеряю скорость, но все же будет красиво все работать. Как вам такой вариант ?
nepster Отправлено: 18 Октября, 2013 - 13:57:20 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

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

Нужна только идея как пройтись по всем ссылкам любой вложенности, например:

главная
- новости
--1 новость
--- автор Вася
---- мама Васи
- контакты
-- карта проезда
--- офис
---- этаж офиса
----- туалет на этаже офиса
------ сливной бачек в туалете
------- вода сливного бочка в туалете
- реклама
-- прайс лист

тоесть нужно пройтись по всем ссылкам сайта любой вложенности. Как я понял у Вас тут парсится главная и 2 вложенность
nepster Отправлено: 18 Октября, 2013 - 12:41:41 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков

Ответов: 15
Просмотров: 1735
Всем привет!
Собственно есть задача написать свой парсер всего сайта с 0. Готовые библиотеки не подходят. Собственно для практики, в хоте работы выложу на форум код.

Изначально ставим такую задачу, бот должен обойти весь сайт, все страницы (любой вложенности, кроме внешних ссылок) и убедиться что они все работают. (Тоесть такая страница есть и она работает без ошибки,например 404).

К примеру во всех рабочих страницах у нас будет <div id="content">(*)</div>

Тоесть если на странице у нас есть <div id="content">(*)</div>, то мы должны присвоить ей статус OK


Теперь варианты, собственно:

Вариант 1.
Переходим на указанный урл (например site.ru), проверяем есть ли контент, есть ок, ставим статус OK, далее ищем первую внутреннюю ссылку(например site.ru/new/), проверяем ее тп. Тут вижу проблему рекурсии, тоесть если на главной странице 2 или более ссылок, мы попадаем на 1 и уходим в глубь сайта, как можно вернуться назад ?


Вариант 2
Чуть более затратный по времени.
Функция 1, парсит урл site.ru, находит все ссылки которые есть на странице и помещает их в массив. Далее берем 1 ссылку из массива, переходи на нее, и добавляем в массив все ссылки, которые есть на странице 2 (все ссылки кроме уже существующих).

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


Собственно подскажите пожалуйста лучший вариант или может есть еще 3 ?

делаем что нам нужно записываем в массив, далее из этого массива идем
nepster Отправлено: 28 Сентября, 2013 - 12:57:01 • Тема: Онлайн игры • Форум: Вопросы новичков

Ответов: 6
Просмотров: 346
надеюсь человечество переживет флеш и забудет его как страшный сон.
nepster Отправлено: 27 Сентября, 2013 - 23:04:20 • Тема: камень, ножницы, бумага для двоих • Форум: Вопросы новичков

Ответов: 2
Просмотров: 238
ок

Страниц (13): [1] 2 3 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB