PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (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
Отправлено: 31 Октября, 2013 - 23:53:20 • Тема: События, клык дублирует событие • Форум: JavaScript & VBScript
Ответов: 3 Просмотров: 1291
Собственно пишу шашки на js, практикуюсь. Получился такой момент:
CODE (
javascript ):
скопировать код в буфер обмена
/**
* Ход игрока
*/
hit: function ( )
{
var obj = this ;
var checkerCoord = null ; // шашка, которой будем ходить (активная)
$( function ( ) {
/**
* Пользователь наводит на шашки, необходимо убедиться, что
* он наводит на свои и получает возможность хода
*/
$( '[data-item="checker"]' ) .hover (
function ( ) {
if ( $( this ) .data ( 'checker' ) == obj.player )
$( this ) .addClass ( 'ck_hover' ) ;
} ,
function ( ) {
if ( $( this ) .data ( 'checker' ) == obj.player )
$( this ) .removeClass ( 'ck_hover' ) ;
}
) ;
$( '[data-item="checker"]' ) .on ( "click" , function ( ) {
console.log ( 'Пешка' ) ;
if ( $( this ) .data ( 'checker' ) == obj.player )
{
// удалим все активные шашки, если они были
$( this ) .parents ( '#board' ) .children ( ) .find ( 'div' ) .removeClass ( 'active' )
$( this ) .parents ( '#board' ) .children ( ) .removeClass ( 'cell_help' ) ;
// при нажатии на шашку, делаем ее активной
$( this ) .addClass ( 'active' ) ;
checkerCoord = $( this ) .data ( 'coord' ) ;
}
} ) ;
// клик по полю
$( '[data-item="cell"]' ) .on ( "click" , function ( ) {
console.log ( 'Поле' ) ;
if ( checkerCoord != null )
{
// координаты ячейки
var cellCoord = $( this ) .data ( 'coord' ) ;
//checkerCoord - координаты шашки
// обновить поле
obj.updateCell ( checkerCoord, cellCoord) ;
}
} ) ;
} ) ;
} ,
Тут есть 2 события:
CODE (
javascript ):
скопировать код в буфер обмена
$( '[data-item="checker"]' ) .on ( "click" , function ( ) {
$( '[data-item="cell"]' ) .on ( "click" , function ( ) {
1 клик по шашке, второе клик по полю.
Если поле пустое, то все хорошо, однако если поле с шашкой и я кликаю по шашке, то срабатывают оба события.
// генерация поля, примерна вот такая
CODE (
javascript ):
скопировать код в буфер обмена
// расставляем все черные шашки
ch_black.forEach ( function ( coord)
{
$( '[data-item="cell"][data-coord="' + coord+ '"]' ) .html ( '<div class="checker ck_black" data-item="checker" data-checker="black" data-coord="' + coord+ '"></div>' )
} ) ;
Подскажите пожалуйста как сделать так, что бы кликать по полю и по шашке можно было отдельно.
nepster
Отправлено: 21 Октября, 2013 - 23:04:44 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков
Ответов: 15 Просмотров: 1735
Обновляю
Есть функция, которая определяет полный url к странице
PHP:
скопировать код в буфер обмена
// Получаем полную ссылку к странице нашего сайта
public static function getFullUrl( $www , $link , $myLink , $parentLink = false )
{
/*
$www = обрабатывать ли www
$link = ссылка, которую необхоимо преобразовать
$myLink = ссылка домена
$parentLink = родительская ссылка $link, для обработки ссылок вида: news/id/32/
*/
if ( ! $www )
{
}
if ( isset ( $parse_url [ 'scheme' ] ) && isset ( $parse_url [ 'host' ] ) ) {
if ( isset ( $parse_url [ 'path' ] ) ) {
return $myLink . $parse_url [ 'path' ] ;
}
else
{
return $link ;
}
}
if ( ! isset ( $parse_url [ 'scheme' ] ) && ! isset ( $parse_url [ 'host' ] ) && isset ( $parse_url [ 'path' ] ) ) {
{
$path = ( isset ( $parse_url [ 'path' ] ) ) ?
'/' . $parse_url [ 'path' ] : '' ; $query = ( isset ( $parse_url [ 'query' ] ) ) ?
'/' . $parse_url [ 'query' ] : '' ;
// тут интересная ситуация
// если мы находимся на странице с адресом к примеру http://nodejs.org/api/
// и видем ссылку documentation.html, то при добавлении домена, мы получим:
// http://nodejs.org/documentation.html и это будет не правильно, так как
// верный url: http://nodejs.org/api/documentation.html
// для таких вот ситуаций, нам и необходама родительская ссылка
if ( $parentLink )
{
return $parentLink . $path . $query ;
}
else
{
return $myLink . $path . $query ;
}
}
return $myLink . $link ;
}
if ( isset ( $parse_url [ 'query' ] ) ) {
$parse_url [ 'query' ] = ltrim ( $parse_url [ 'query' ] , '/' ) ;
if ( $parentLink )
{
return $parentLink . '/?' . $parse_url [ 'query' ] ;
}
else
{
return $myLink . '/?' . $parse_url [ 'query' ] ;
}
}
return false ;
}
Вроде обошел все моменты, но все же появляются случаи такие как /.., /., и вот еще интересный пример: 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
Собственно пишу парсер сайта, и когда он натыкается на файлы, ссылка вида:
это его дико тормозит.
Вопрос такой можно ли проверить внешнюю ссылку на файл ?
Тоесть является ли ссылка просто html документом или файлом ?
nepster
Отправлено: 19 Октября, 2013 - 23:14:53 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков
Ответов: 15 Просмотров: 1735
Если что то забыл, для удобства выкладываю все в архиве.
Теперь мы умеем идти на сайт, собирать кол-во ссылок с сайта, считать изображения, обпередлять код страницы и все это записывать в файл.
Снова жду ваших комментариев и продолжаю работать над обходом всего сайта
Итак обновляем данне:
PHP:
скопировать код в буфер обмена
header ( 'Content-Type: text/html; charset=utf-8' ) ;
require_once ( 'crawler/load.php' ) ;
$getUrl = 'http://nodejs.org/' ;
$parce = new lib\parse( ) ;
$parce -> run ( $getUrl ) ;
echo '<br/><p>Время выполнения скрипта: ' . ( microtime ( true ) - $start ) . ' сек.</p>' ;
parse.php
PHP:
скопировать код в буфер обмена
<?PHP
namespace lib;
class parse extends patterns
{
public $getCurrentParseUrl = '' ;
public $getParseUrlLimit = 500 ;
// массив всех URL сайта
public $getUrlArray = array ( ) ;
public function __construct( )
{
}
// проверим урл на валидность
public function isUrl( $url )
{
}
public function run( $url )
{
$this -> getCurrentParseUrl = rtrim ( $url , '/' ) ;
// создать файл для статистики
statFile:: $prefix_file = '_images' ; // префикс файла
statFile:: $template = 'stat.tpl' ; // шаблон файла
statFile:: create ( ) ; // создать файл
/************************************************/
if ( ! $this -> isUrl ( $this -> getCurrentParseUrl ) || ! $this -> isSuccessLink ( $this -> getCurrentParseUrl ) )
{
// сформировать данные статистики для главной ссылки
statFile:: images ( 0 , 'Главная' , $this -> getCurrentParseUrl , 404, 0) ;
statFile:: update ( ) ; // обновить данные файла статистики
}
// дерним url, получаем html код
$html = $this -> tweak ( $this -> getCurrentParseUrl ) ;
// кол-во изображений на странице
$getCountImagesFromPage = $this -> getAllImagesFromPage ( $html , $this -> getParseUrlLimit , true ) ;
// сформировать данные статистики для главной ссылки
statFile:: images ( 0 , 'Главная' , $this -> getCurrentParseUrl , $this -> isSuccessLink ( $this -> getCurrentParseUrl ) , $getCountImagesFromPage ) ;
statFile:: update ( ) ; // обновить данные файла статистики
// получаем все ссылки на главной странице странице
$getLinks = $this -> getLinks ( $html , 'index' ) ;
$this -> getATest ( $getLinks ) ;
}
public function tweak( $url )
{
}
// получить все ссылки на странице
public function getATest( $vars )
{
echo '<pre>' ;
echo '</pre>' ;
}
// проверим принадлежит ли ссылка к нашему сайту
function isMainLink( $link )
{
$parse_subdomain = false ;
$main_domain = $this -> getCurrentParseUrl ;
$main_domain_host = parse_url ( $main_domain , PHP_URL_HOST
) ;
// сразу избавимся от www, если есть
// парсим ссылку
# отбрасываем ссылки вида: javascript://
{
return false ;
}
// если ссылка не имеет хост
# Все ссылки вида: news/, /news/, /news/comm/, а так же отбразываем javascript:void(0)
if ( ! isset ( $parse_url [ 'scheme' ] ) && ! isset ( $parse_url [ 'host' ] ) && isset ( $parse_url [ 'path' ] ) ) {
return true ;
}
// сразу решаем вопрос с поддоменами
# все ссылки вида: http://forum.site.ru, http://www.forum.site.ru
// тут может быть много моментов, например поддомен 25 вложенности на домене 7 уровня
// поэтому нужно предусмотреть возможность сключить, выключить возможность парсить поддомены
// если попадется адрес к примеру: http://theme.forum.site.com.ua
if ( $parse_subdomain )
{
//
}
// если ссылка имеет host и при этом он совпадает с указанным
# Все ссылки вида: http://site.ru, http://www.site.ru
if ( isset ( $parse_url [ 'host' ] ) && $parse_url [ 'host' ] == $main_domain_host ) {
return true ;
}
return false ;
}
// Получаем полную ссылку к странице нашего сайта
function getFullMainUrl( $link )
{
$main_domain = $this -> getCurrentParseUrl ;
if ( isset ( $parse_url [ 'scheme' ] ) && isset ( $parse_url [ 'host' ] ) ) {
if ( isset ( $parse_url [ 'path' ] ) ) {
return $main_domain . $parse_url [ 'path' ] ;
}
else
{
return $link ;
}
}
if ( ! isset ( $parse_url [ 'scheme' ] ) && ! isset ( $parse_url [ 'host' ] ) && isset ( $parse_url [ 'path' ] ) ) {
{
return $main_domain . '/' . $link ;
}
return $main_domain . $link ;
}
return 'error' ;
}
// проверим работоспособность ссылки
function isSuccessLink( $url )
{
return substr ( $headers [ 0
] , 9
, 3
) ; }
// получить все ссылки на странице уже в отфаршированном виде
public function getLinks( $html , $page = false )
{
#$page - идентификатор
// все ссылки на странице
$getAllLinksFromPage = $this -> getAllLinksFromPage ( $html , $this -> getParseUrlLimit ) ;
if ( $getAllLinksFromPage )
{
// приведем наш массив ссылок в человеческий вид
foreach ( $getAllLinksFromPage as $link )
{
// принадлежит ли ссылка к нашему сайту ?
$url_main = ( $this -> isMainLink ( $link [ 1] ) ) ? 1 : 0 ;
// полная ссылка (только для ссылок нашего сайта)
$full_url = '' ;
$url_code = '' ;
if ( $url_main )
{
$full_url = $this -> getFullMainUrl ( $link [ 1] ) ;
// код ссылки
$url_code = $this -> isSuccessLink ( $full_url ) ;
}
$result [ ( ! $page ) ?
'index' : $page ] [ ] = array ( 'url' => $link [ 1 ] ,
'name' => htmlspecialchars( $link [ 2 ] ) , // тут и картинка может быть
'parse' => 0 ,
'code' => $url_code ,
'main' => $url_main ,
'full_url' => $full_url ) ;
}
}
return $result ;
}
}
patterns.php
PHP:
скопировать код в буфер обмена
<?PHP
namespace lib;
class patterns
{
// получить все ссылки на странице
public function getAllLinksFromPage( $html , $limit = 1000)
{
preg_match_all ( "/<a href=\" ([^\" ]*)\" >(.*)<\/a>/iU" , $html , $links , PREG_SET_ORDER
) ; }
// получить все изображения на странице
public function getAllImagesFromPage( $html , $limit = 1000, $count = false )
{
if ( ! $count )
{
}
else
{
}
}
}
statFile.php
PHP:
скопировать код в буфер обмена
<?PHP
namespace lib;
class statFile
{
// верстка шаблона
public static $prefix_file = '' ;
// шаблон по которому создать файл
public static $template = false ;
// верстка шаблона
public static $makeup = 'table' ;
/**********************************/
// данные по статистики изображений
private static $PacketImages = false ;
public function __construct( )
{
}
/*
public static function load($className=__CLASS__)
{
return new $className;
}*/
// адрес для файлов статистики
private static function getFileDir( )
{
return dirname ( __FILE__ ) . '/../stat/' ; }
// имя файла
private static function getFileName( )
{
return 'report' . self :: $prefix_file . '_' . date ( "d.m.Y" ) . '.html' ; }
// создать пустой файл
public static function create( )
{
// указан шаблон для создания статистики
$html = self :: GenerateTpl ( ) ; // содержимое файла
// файла не существует, создадим его
if ( ! file_exists ( self :: getFileDir ( ) . self :: getFileName ( ) ) ) {
}
// проверим создался ли файл
if ( ! file_exists ( self :: getFileDir ( ) . self :: getFileName ( ) ) ) {
return false ;
}
return true ;
}
//обновить файл
public static function update( )
{
/*
Обновлять файл статистики мы будем для каждой страницы
Это сделано для того, что если по какой-то причине скрипт перестанет работать, у нас сохранялись данные
*/
$html = self :: GenerateTpl ( self :: $PacketImages ) ; // содержимое файла
// проверим создался ли файл
if ( ! file_exists ( self :: getFileDir ( ) . self :: getFileName ( ) ) ) {
return false ;
}
return true ;
}
// шаблон для файла
private static function GenerateTpl( $content = false )
{
$html = '' ;
if ( self :: $template )
{
$getTplUrl = dirname ( __FILE__ ) . '/../stat/tpl/' ;
{
// контент по умолчанию
if ( ! $content )
{
if ( self :: $makeup == 'table' )
{
$content = '
<tr>
<td colspan="4">Статистика</td>
</tr>
' ;
}
else
{
$content = '
<div class="stat">
<div class="no_data">Статистика</div>
</div>
' ;
}
}
$tpl_data [ ] = '{date}' ;
$tpl_data [ ] = '{content}' ;
$content_data [ ] = date ( "d.m.Y" ) ; $content_data [ ] = $content ;
// немного обработаем шаблон
}
}
return $html ;
}
// сгенерировать данные для шаблона статистики по изображениям и сформировать пакет
public static function images( $lvl , $name , $url , $status , $count )
{
/*
$lvl - уровень вложенности (0 = index)
$name - имя страницы
$url - адрес
$status - статус
$count - кол-во изображений
*/
$class_status = ( $status == 200 ) ? 'green' : 'red' ;
if ( self :: $makeup == 'table' )
{
self :: $PacketImages .= '
<tr>
<td class="name">' . $name . '</td>
<td class="url"><a href="' . $url . '">' . $url . '</a></td>
<td class="code ' . $class_status . '">' . $status . '</td>
<td class="img_count">' . $count . '</td>
</tr>
' ;
}
else
{
self :: $PacketImages .= '
<div class="stat">
<div class="name">' . $name . '</div>
<div class="url"><a href="' . $url . '">' . $url . '</a></div>
<div class="code ' . $class_status . '">' . $status . '</div>
<div class="img_count">' . $count . '</div>
</div>
' ;
}
// self::$newPacketImages - новый пакет данных для обновления файла
}
}
nepster
Отправлено: 19 Октября, 2013 - 13:19:16 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков
Ответов: 15 Просмотров: 1735
спасибо, я как то забыл про var.
Я доделаю еще пару моментов и сброшу в файлах ля простого просмотра. Так же если кому понадобится можно будет браться. Пока по скорости не впечатляет, 322 ссылки более 30 секунд.
nepster
Отправлено: 19 Октября, 2013 - 00:14:36 • Тема: Теория написания парсера всего сайта • Форум: Вопросы новичков
Ответов: 15 Просмотров: 1735
PHP:
скопировать код в буфер обмена
<?PHP
namespace lib;
class parse
{
var $getCurrentParseUrl = '' ;
var $getParseUrlLimit = 500 ;
// массив всех URL сайта
var $getUrlArray = array ( ) ;
public function __construct( )
{
echo '<p>Старт парсинга</p>' ;
}
// проверим урл на валидность
public function VALIDATE_URL( $url )
{
{
return true ;
}
return false ;
}
public function run( $url )
{
//if(!$this->VALIDATE_URL($url)) die('Критическая ошибка, Ваш URL адрес не является правильным');
echo $this -> getCurrentParseUrl = rtrim ( $url , '/' ) ;
// дерним url
$html = $this -> tweak ( $this -> getCurrentParseUrl ) ;
// получаем все ссылки на главной странице странице
$getLinks = $this -> getLinks ( $html , 'index' ) ;
/*
foreach($getLinks as $link)
{
print_r($link['url']);
echo '<br/>';
}*/
$this -> getATest ( $getLinks ) ;
}
public function tweak( $url )
{
}
// получить все ссылки на странице
public function getATest( $vars )
{
echo '<pre>' ;
echo '</pre>' ;
}
// проверим принадлежит ли ссылка к нашему сайту
function is_main_link( $link )
{
$parse_subdomain = false ;
$main_domain = $this -> getCurrentParseUrl ;
$main_domain_host = parse_url ( $main_domain , PHP_URL_HOST
) ;
// сразу избавимся от www, если есть
// парсим ссылку
# отбрасываем ссылки вида: javascript://
{
return false ;
}
// если ссылка не имеет хост
# Все ссылки вида: news/, /news/, /news/comm/, а так же отбразываем javascript:void(0)
if ( ! isset ( $parse_url [ 'scheme' ] ) && ! isset ( $parse_url [ 'host' ] ) && isset ( $parse_url [ 'path' ] ) ) {
return true ;
}
// сразу решаем вопрос с поддоменами
# все ссылки вида: http://forum.site.ru, http://www.forum.site.ru
// тут может быть много моментов, например поддомен 25 вложенности на домене 7 уровня
// поэтому нужно предусмотреть возможность сключить, выключить возможность парсить поддомены
// если попадется адрес к примеру: http://theme.forum.site.com.ua
if ( $parse_subdomain )
{
//
}
// если ссылка имеет host и при этом он совпадает с указанным
# Все ссылки вида: http://site.ru, http://www.site.ru
if ( isset ( $parse_url [ 'host' ] ) && $parse_url [ 'host' ] == $main_domain_host ) {
return true ;
}
return false ;
}
// Получаем полную ссылку к странице нашего сайта
function getFullMainUrl( $link )
{
$main_domain = $this -> getCurrentParseUrl ;
if ( isset ( $parse_url [ 'scheme' ] ) && isset ( $parse_url [ 'host' ] ) ) {
if ( isset ( $parse_url [ 'path' ] ) ) {
return $main_domain . $parse_url [ 'path' ] ;
}
else
{
return $link ;
}
}
if ( ! isset ( $parse_url [ 'scheme' ] ) && ! isset ( $parse_url [ 'host' ] ) && isset ( $parse_url [ 'path' ] ) ) {
{
return $main_domain . '/' . $link ;
}
return $main_domain . $link ;
}
return 'error' ;
}
// проверим работоспособность ссылки
function is_success_link( $url )
{
return substr ( $headers [ 0
] , 9
, 3
) ; }
// получить все ссылки на странице уже в отфаршированном виде
public function getLinks( $html , $page = false )
{
#$page - идентификатор
// все ссылки на странице
$getAllLinksFromPage = $this -> getAllLinksFromPage ( $html ) ;
if ( $getAllLinksFromPage )
{
// приведем наш массив ссылок в человеческий вид
foreach ( $getAllLinksFromPage as $link )
{
// принадлежит ли ссылка к нашему сайту ?
$url_main = ( $this -> is_main_link ( $link [ 1] ) ) ? 1 : 0 ;
// рабочая ли ссылка
$url_success = ( $url_code == 200) ? 1 : 0 ;
echo 1 ;
// полная ссылка (только для ссылок нашего сайта)
$full_url = '' ;
if ( $url_main )
{
$full_url = $this -> getFullMainUrl ( $link [ 1] ) ;
}
echo 2 ;
// код ссылки
$url_code = $this -> is_success_link ( $full_url ) ;
echo 3 ;
$result [ ( ! $page ) ?
'index' : $page ] [ ] = array ( 'url' => $link [ 1 ] ,
'name' => htmlspecialchars( $link [ 2 ] ) , // тут и картинка может быть
'success' => $url_success ,
'code' => $url_code ,
'main' => $url_main ,
'full_url' => $full_url ) ;
}
}
return $result ;
}
// получить все ссылки на странице
public function getAllLinksFromPage( $html )
{
preg_match_all ( "/<a href=\" ([^\" ]*)\" >(.*)<\/a>/iU" , $html , $links , PREG_SET_ORDER
) ; return array_slice ( $links , 0
, $this -> getParseUrlLimit ) ; }
}
запуск
PHP:
скопировать код в буфер обмена
header ( 'Content-Type: text/html; charset=utf-8' ) ;
require_once ( 'crawler/load.php' ) ;
$getUrl = 'http://forum.php.su' ;
$parce = new lib\parse( ) ;
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
надеюсь человечество переживет флеш и забудет его как страшный сон.
Страниц (13): [1] 2 3 4 5 6 7 8 9 ... » В конец
Powered by ExBB FM 1.0 RC1. InvisionExBB