За последние 24 часа нас посетили 17495 программистов и 1741 робот. Сейчас ищет 1121 программист ...

Возможно ли создать "умный" парсер на php?

Тема в разделе "PHP для новичков", создана пользователем Badnick, 28 дек 2012.

  1. Badnick

    Badnick Активный пользователь

    С нами с:
    27 дек 2012
    Сообщения:
    13
    Симпатии:
    0
    Доброе время суток. Хочется знать, возможно ли создать php парсер, который будет сканировать сайт, переходить по его внутренним ссылкам и, проверив соответствие страниц заданному шаблону, заносить урлы (или сведения о страницах) в БД, после чего продолжать сканирование?
    Если сложно для восприятия, нужен примерно такой алгоритм парсинга:

    Главная страница сайта -> внутренняя страница (занести в базу данных, если соотвествует шаблону) -> внутренняя страница (не заносить в базу данных, если не соответствует шаблону) -> и т.д.

    Сканируемые сайты при этом являются сторонними ресурсами. Если не сложно, можете дать небольшую наводку, в каком направлении двигаться - использовать регулярные выражения или библиотеки (phpQuery или другие). Возможно набросаете что-нибудь в сыром виде, а я изучу.
    P.S.: целью парсера является получение аналитических данных со сканируемых страниц (например количество комментариев), а не воровство контента.

    Большое спасибо.
     
  2. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    Изучай класс simple_html_dom
     
  3. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
  4. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Я бы посоветовал писать на компилируемом языке +многопоточность =). И есть парсеры/грабберы контента, можно их заюзать, настроить фильтры итп. По сабжу - видел как-то на ibm.com статейку про реализацию именно многопоточности на php)

    Добавлено спустя 20 минут 27 секунд:
    Зачем городить курлом если можно банально сокетом отправить запрос%). Это я так, к слову. И еще можно заюзать file_get_contents('http://blabla.bla/'); --самый простой вариант, самый самый
     
  5. Shumomer

    Shumomer Активный пользователь

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    310 - ты, надеюсь, пошутил?
     
  6. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Shumomer, сканировать и парсить сайты на пыхе очень медленно, в десятки раз быстрее это работает на компилируемом яп с применением многопоточности.
    А что тут плохого? Кому как, но мне проще и быстрее ручками HTTP запрос составить, отправить, и принять ответ, чем заюзать толстый курл.

    Не понимаю где в моей мессаге что-то заоблачное или я хз там мега-сложное, или безумное?%)
     
  7. Shumomer

    Shumomer Активный пользователь

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    1) Сам паринг занимает минимум времени по сравнению с получением страниц
    2) Многопоточность в пхп есть
    3) А еще есть curl_multi который работает куда быстрее и, главное - безглючнее, всех самописных приблуд на сокетах (по той простой причине что его "вылизывают" уже много лет)

    т.ч. у вас что-то не "заоблачное или я хз там мега-сложное", а просто глупое.
     
  8. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    1 и 3 соглашусь), но блин многопоточность?
     
  9. Shumomer

    Shumomer Активный пользователь

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    http://php.ru/manual/book.pcntl.html
    это не совсем многопоточность, но то, что обычно под этим подразумевают

    в данном случае, корректнее говорить о многопоточной загрузке, что и реализует curl_multi
     
  10. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Сорри за оффтоп
    Это не то=). Просто в пыхе мы не можем запилить какую-нибудь функцию, и в пространстве текущего скрипта параллельно запустить этот обработчик--что-то типо такого(вообразим наличие класса-потока Thread)
    Код (Text):
    1. for ($i=0;$i<100;$i++;)
    2. {
    3. $threads[$i]=new Thread();
    4. $threads[$i]->execute=function()
    5. {
    6. $n=$i;
    7. sleep(rand(1,10));
    8. echo ($n);
    9. };
    10. $threads[$i]->__destruct=function(){echo $n,' is killed =)';};
    11. $threads[$i]->resume();
    12. }
    Вот типо такого мы не можем же сделать%). А запускать какую-то программулину и назначать ей ввод-вывод через свои переменные это не есть многопоточность=), да, можно запустить пых, но это не многопоточность, а использование многозадачности xD.
     
  11. Shumomer

    Shumomer Активный пользователь

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    Потому и сказал, что это не совсем многопоточность. Тем не менее, в практических задачах часто многозадачность с одним процессом-предком называют многопоточностью, хоть это и не верно терминологически. А вот curl_multi - именно многопоточный, все-же.

    Хотите в чистом виде? Нет проблем: http://pthreads.org/pool.phps

    Вобщем - увы, все что я могу сказать - язык вы знаете очень "узко", иначе не писали-бы всего этого.
     
  12. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Спорить не буду, имхо все верно xD. . За линк спасибо, забукмарил. Думаю в пыхе ближайшие пару лет, а может и вообще, не будет многопоточности, а если и будет то с ограничениями на кол-во потоков%)
     
  13. Shumomer

    Shumomer Активный пользователь

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    Уже есть (читайте доки http://php.ru/manual/refs.fileprocess.process.html ), просто мало кому нужно, и еще меньше тех кто знает и умеет.

    Ха.. этот форум еще и ссылки корявит. Переделывает на свой домен, а там инфа далеко не полная. Вот нормальный адрес:
    Код (Text):
    1. php.net/manual/ru/refs.fileprocess.process.php
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    С помощью file_get_contents вполне можно парсить
    Код (PHP):
    1.     function getContents($uri) {
    2.         $opts = array(
    3.             'http'=>array(
    4.                 'method'=>"GET",
    5.                 'header'=>"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n".
    6.                     'Referer: '.$uri."\r\n"
    7.             )
    8.         );
    9.         $context = stream_context_create($opts);
    10.         return file_get_contents($uri, FILE_BINARY, $context);
    11.     } 
    а самое важное, конечно, регулярные выражения, они работают очень быстро и абсолютно гибки. Я написал парсер specserver.com который грузит страницы с помощью той функции и выделяет нужную инфу (урлы объявлений, всю инфу из объявлений в отдельные поля) с помощью регулярок. С локального компа (ноут, 20 мбит) - 10 страниц/сек, или все >50 тыс. объявлений за 90 часов.
    Потом я конечно научился пользоваться сURL'ом.
    Быстродействия php более чем достаточно, потому что время работы функций в тысячи раз меньше, чем тупо время получения страницы из интернета, которое зависит от скорости соединения и быстродействия конкретного сайта.

    Добавлено спустя 6 минут 39 секунд:
    Задачу многопоточности парсера на php легко решить тупо загрузив несколько копий скрипта, предусмотрев в них синхронизацию, через файлы, базу, или мемкеш - не важно, главное ведь что страницы грузятся и обрабатываются параллельно. Можно продвинуться и использовать pcntl, я обычно так и делаю. Схема может быть такая: главный скрипт, который из базы берет урлы, которые надо парсить, и запускает форки на каждый урл. Форк, в свою очередь, загружает и разбирает страницу, возможно добавляет в базу новые урлы.
    В 100-200 потоков средний сервак может парсить миллионы страниц в неделю.
     
  15. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    libevent ахуеть! Вот чего чего, а появления эвентов я ждал%). За этот линк вообще огромное спасибо)