[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Функции парсинга веб страниц
Эли4ка
Недавно в интернете нашла скрипт "Функции парсинга веб страниц"
Код-
<?php  

// получение doctype документа
function get_doctype($file){
$h1tags = preg_match('/<!DOCTYPE (\w.*)dtd">/is',$file,$patterns);
$res = array();
array_push($res,$patterns[0]);
array_push($res,count($patterns[0]));
return $res;
}

// получение заголовка страницы
function get_doc_title($file){
$h1tags = preg_match('/<title> ?.* <\/title>/isx',$file,$patterns);
$res = array();
array_push($res,$patterns[0]);
array_push($res,count($patterns[0]));
return $res;
}

// получение ключевых слов
function get_keywords($file){
$h1tags = preg_match('/(<meta name="keywords" content="(.*)" \/>)/i',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение rel ссылок из заголовков сайта
function get_link_rel($file){
$h1tags = preg_match_all('/(rel=)(".*") href=(".*")/im',$file,$patterns);
$res = array();
array_push($res,$patterns);
array_push($res,count($patterns[2]));
return $res;
}
// получение внешних css
function get_external_css($file){
$h1tags = preg_match_all('/(href=")(\w.*\.css)"/i',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h1 тэгов
function get_h1($file){
$h1tags = preg_match_all("/(<h1.*>)(\w.*)(<\/h1>)/isxmU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h2 тэгов
function get_h2($file){
$h1tags = preg_match_all("/(<h2.*>)(\w.*)(<\/h2>)/isxmU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h3 tags
function get_h3($file){
$h1tags = preg_match_all("/(<h3.*>)(\w.*)(<\/h3>)/ismU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h4 tags
function get_h4($file){
$h1tags = preg_match_all("/(<h4.*>)(\w.*)(<\/h4>)/ismU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h5 tags
function get_h5($file){
$h1tags = preg_match_all("/(<h5.*>)(\w.*)(<\/h5>)/ismU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех h6 tags
function get_h6($file){
$h1tags = preg_match_all("/(<h6.*>)(\w.*)(<\/h6>)/ismU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение содержания всех p тэгов
function get_p($file){
$h1tags = preg_match_all("/(<p.*>)(\w.*)(<\/p>)/ismU",$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех названий ссылок
function get_a_content($file){
$h1count = preg_match_all("/(<a.*>)(\w.*)(<.*>)/ismU",$file,$patterns);
return $patterns[2];
}

// получение всех урликов
function get_a_href($file){
$h1count = preg_match_all('/(href=")(.*?)(")/i',$file,$patterns);
return $patterns[2];
}

// подсчет кол-ва href
function get_a_href_count($file){
$h1count = preg_match_all('/<(a.*) href=\"(.*?)\"(.*)<\/a>/',$file,$patterns);
return count($patterns[0]);
}

// получение всех доп тегов внутри тега ссылки
function get_a_additionaltags($file){
$h1count = preg_match_all('/<(a.*) href="(.*?)"(.*)>(.*)(<\/a>)/',$file,$patterns);
return $patterns[3];
}

// получение всех span ов
function get_span($file){
$h1count = preg_match_all('/(<span .*>)(.*)(<\/span>)/',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех сркриптов - Яваскрипт в чатсности
function get_script($file){
$h1count = preg_match_all('/(<script.*>)(.*)(<\/script>)/imxsU',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех ul
function get_ul($file){
$h1count = preg_match_all('/(<ul \w*>)(.*)(<\/ul>)/ismxU',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех li
function get_li($file){
$h1count = preg_match_all('/(<li \w*>)(.*)(<\/li>)/ismxU',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех комментов на странице
function get_comments($file){
$h1count = preg_match_all('/(<!--).(.*)(-->)/isU',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех ID используемых на странице
function get_ids($file){
$h1count = preg_match_all('/(id="(\w*)")/is',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}
// получение всех классов документа
function get_classes($file){
$h1count = preg_match_all('/(class="(\w*)")/is',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех мета тег данных
function get_meta_content($file){
$h1count = preg_match_all('/(<meta)(.*="(.*)").\/>/ix',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех стилей (указанных построчно)
function get_styles($file){
$h1count = preg_match_all('/(style=")(.*?)(")/is',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех титлов тегов
function get_tag_titles($file){
$h1count = preg_match_all('/(title=)"(.*)"(.*)/',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех альтернативных названий картинок
function get_image_alt($file){
$h1count = preg_match_all('/(alt=.)([a-zA-Z0-9\s]{1,})/',$file,$patterns);
$res = array();
array_push($res,$patterns[2]);
array_push($res,count($patterns[2]));
return $res;
}

// получение всех изображений
function get_images($file){
$h1count = preg_match_all('/(<img)\s (src="([a-zA-Z0-9\.;:\/\?&=_|\r|\n]{1,})")/isxmU',$file,$patterns);
$res = array();
array_push($res,$patterns[3]);
array_push($res,count($patterns[3]));
return $res;
}

// получение всех имейлов с тегом mailto:
function get_mailto($file){
$h1count = preg_match_all('/(<a\shref=")(mailto:)([a-zA-Z@0-9\.]{1,})"/ims',$file,$patterns);
$res = array();
array_push($res,$patterns[3]);
array_push($res,count($patterns[3]));
return $res;
}

// получение всех имейлов
function get_emails($file){
$h1count = preg_match_all('/[a-zA-Z0-9_-]{1,}@[a-zA-Z0-9-_]{1,}\.[a-zA-Z]{1,4}/',$file,$patterns);
$res = array();
array_push($res,$patterns[0]);
array_push($res,count($patterns[0]));
return $res;
}

// подсчет используемых ключевых слов
function countkeyword($word,$file){
$x = preg_match_all("/(.*)($word)(.*)/",$file,$patterns);
return count($patterns);
}

// получение всех внутренных ссылок сайта
function get_internal_links($array){
$result = array();
$count = count($array);
for($i=0;$i<$count;$i++){
if(!empty($array[$i])){
if(strpos($array[$i],"www",0) === false){
if(strpos($array[$i],"http",0) === false){
array_push($result,$array[$i]);
}
}
}
}

return $result;
}

// получение всех внешних ссылок сайта
function get_external_links($array){
$result = array();
$count = count($array);
for($i=0;$i<$count;$i++){
if(!empty($array[$i])){
if(strpos($array[$i],"www",0) !== false){
if(strpos($array[$i],"http",0) !== false){
array_push($result,$array[$i]);
}
}
}
}

return $result;
}

// получение главного урла сайта
function get_main_url($url){
$parts = parse_url($url);
$url = $parts["scheme"] ."://".$parts["host"];
return $url;
}

// получение всех доменного имени без ввв и хвоста
function get_domain_name_only($url){
$match = preg_match("/(.*:\/\/)\w{0,}(.*)\.(.*)/",$url,$patterns);
$patterns[2] = str_replace(".","",$patterns[2]);
return $patterns[2];
}
?>



Многие форумчане на других форумах говорили много нехорошего по отношению к этому коду..ну в принципе это достаточно хороший код для новичков..только его надо немного подправить-есть недочеты..
А как считаете Вы?



Спустя 2 часа, 12 минут, 21 секунда (2.01.2012 - 11:10) redreem написал(а):
вопрос в качестве тут только относительно регулярок. остальное - решение в лоб. этот код можно в 3-4 сократить если нормально обернуть классом и подумать над интерфейсом.

Спустя 5 минут, 26 секунд (2.01.2012 - 11:16) Эли4ка написал(а):
redreem
конечно его сжимать можно..я имею ввиду код регулярок..правилен ли он..

Спустя 21 минута, 11 секунд (2.01.2012 - 11:37) redreem написал(а):
ну на первый взгляд сразу бросается в глаза отстутствие отслежвания возможных пробелов. например вот этот момент alt= может быть и таким alt = и таким alt =...

Спустя 26 минут, 47 секунд (2.01.2012 - 12:04) Эли4ка написал(а):
redreem
точно..надо будет у себя подправить,а то иногда пустоту выдает..

Спустя 7 часов, 24 минуты, 33 секунды (2.01.2012 - 19:28) Winston написал(а):
Цитата (Эли4ка @ 2.01.2012 - 10:16)
я имею ввиду код регулярок..правилен ли он..

Если работает - значит правильный smile.gif
Так же много регулярок можно сократить.
Цитата (Эли4ка @ 2.01.2012 - 07:58)
imxsU

blink.gif Это что? Вписали все модификаторы которые знали? biggrin.gif А для чего спрашивается ? smile.gif

Спустя 15 минут, 10 секунд (2.01.2012 - 19:43) Игорь_Vasinsky написал(а):
вот и не влом чёт переписывать.... быстрее свой - снуля - с нужным функционалом написать wink.gif

Спустя 2 минуты (2.01.2012 - 19:45) Nikitian написал(а):
phpQuery и никаких регулярок, всё просто и красиво smile.gif

Спустя 6 минут, 58 секунд (2.01.2012 - 19:52) Игорь_Vasinsky написал(а):
да ну... на регулярках - быстрее будет.

Спустя 12 минут, 36 секунд (2.01.2012 - 20:05) Nikitian написал(а):
Цитата (Игорь_Vasinsky @ 2.01.2012 - 19:52)
да ну... на регулярках - быстрее будет.

Буквально на днях спарсил несколько сайтов с общей сложности более полумиллиона записей, большая часть которых собиралась с нескольких страниц. Особых проблем в скорости не заметил - соединение и выкачивание страниц занимают времени куда больше, даже если качать в несколько потоков.

Спустя 13 часов, 34 минуты, 30 секунд (3.01.2012 - 09:40) Эли4ка написал(а):
Nikitian
Да phpQuery вещь хорошая,но мне хочется самой написать что-нибудь,пускай и корявинькое..

Спустя 18 минут, 48 секунд (3.01.2012 - 09:58) Игорь_Vasinsky написал(а):
ВОТ по этому я и говорю:

1. определиться с функционалом
2. разделить на этапы
3. начать рзрабатывать

Спустя 15 минут, 47 секунд (3.01.2012 - 10:14) Эли4ка написал(а):
Игорь_Vasinsky
согласна..а как Вы думаете-новичкам такой класс подойдет?

Спустя 22 минуты, 7 секунд (3.01.2012 - 10:36) Игорь_Vasinsky написал(а):
если ты про эту простыну в первом посте - то нет. всё можно упростить.

Спустя 27 минут, 26 секунд (3.01.2012 - 11:04) Эли4ка написал(а):
Игорь_Vasinsky
спасибо..а скажите,дело в том,что код может быть таким
<img src="/images/grafix/spacer.gif" alt="" width="140" height="3">
,а может быть таким
<img alt="" src="/images/grafix/spacer.gif"  width="140" height="3">
-то есть, src и alt поменяли местами,следовательно регулярное выражение вида--#<img\s+src\s*=\s*"# для второго случая не сработает,а как тогда лучше реализовать,чтобы у регулярного выражения не возникало вопросов и ошибок насчет какой параметр стоит первым; alt или scr ..?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.