Доброе время суток. Хочется знать, возможно ли создать php парсер, который будет сканировать сайт, переходить по его внутренним ссылкам и, проверив соответствие страниц заданному шаблону, заносить урлы (или сведения о страницах) в БД, после чего продолжать сканирование? Если сложно для восприятия, нужен примерно такой алгоритм парсинга: Главная страница сайта -> внутренняя страница (занести в базу данных, если соотвествует шаблону) -> внутренняя страница (не заносить в базу данных, если не соответствует шаблону) -> и т.д. Сканируемые сайты при этом являются сторонними ресурсами. Если не сложно, можете дать небольшую наводку, в каком направлении двигаться - использовать регулярные выражения или библиотеки (phpQuery или другие). Возможно набросаете что-нибудь в сыром виде, а я изучу. P.S.: целью парсера является получение аналитических данных со сканируемых страниц (например количество комментариев), а не воровство контента. Большое спасибо.
Я бы посоветовал писать на компилируемом языке +многопоточность =). И есть парсеры/грабберы контента, можно их заюзать, настроить фильтры итп. По сабжу - видел как-то на ibm.com статейку про реализацию именно многопоточности на php) Добавлено спустя 20 минут 27 секунд: Зачем городить курлом если можно банально сокетом отправить запрос%). Это я так, к слову. И еще можно заюзать file_get_contents('http://blabla.bla/'); --самый простой вариант, самый самый
Shumomer, сканировать и парсить сайты на пыхе очень медленно, в десятки раз быстрее это работает на компилируемом яп с применением многопоточности. А что тут плохого? Кому как, но мне проще и быстрее ручками HTTP запрос составить, отправить, и принять ответ, чем заюзать толстый курл. Не понимаю где в моей мессаге что-то заоблачное или я хз там мега-сложное, или безумное?%)
1) Сам паринг занимает минимум времени по сравнению с получением страниц 2) Многопоточность в пхп есть 3) А еще есть curl_multi который работает куда быстрее и, главное - безглючнее, всех самописных приблуд на сокетах (по той простой причине что его "вылизывают" уже много лет) т.ч. у вас что-то не "заоблачное или я хз там мега-сложное", а просто глупое.
http://php.ru/manual/book.pcntl.html это не совсем многопоточность, но то, что обычно под этим подразумевают в данном случае, корректнее говорить о многопоточной загрузке, что и реализует curl_multi
Сорри за оффтоп Это не то=). Просто в пыхе мы не можем запилить какую-нибудь функцию, и в пространстве текущего скрипта параллельно запустить этот обработчик--что-то типо такого(вообразим наличие класса-потока Thread) Код (Text): for ($i=0;$i<100;$i++;) { $threads[$i]=new Thread(); $threads[$i]->execute=function() { $n=$i; sleep(rand(1,10)); echo ($n); }; $threads[$i]->__destruct=function(){echo $n,' is killed =)';}; $threads[$i]->resume(); } Вот типо такого мы не можем же сделать%). А запускать какую-то программулину и назначать ей ввод-вывод через свои переменные это не есть многопоточность=), да, можно запустить пых, но это не многопоточность, а использование многозадачности xD.
Потому и сказал, что это не совсем многопоточность. Тем не менее, в практических задачах часто многозадачность с одним процессом-предком называют многопоточностью, хоть это и не верно терминологически. А вот curl_multi - именно многопоточный, все-же. Хотите в чистом виде? Нет проблем: http://pthreads.org/pool.phps Вобщем - увы, все что я могу сказать - язык вы знаете очень "узко", иначе не писали-бы всего этого.
Спорить не буду, имхо все верно xD. . За линк спасибо, забукмарил. Думаю в пыхе ближайшие пару лет, а может и вообще, не будет многопоточности, а если и будет то с ограничениями на кол-во потоков%)
Уже есть (читайте доки http://php.ru/manual/refs.fileprocess.process.html ), просто мало кому нужно, и еще меньше тех кто знает и умеет. Ха.. этот форум еще и ссылки корявит. Переделывает на свой домен, а там инфа далеко не полная. Вот нормальный адрес: Код (Text): php.net/manual/ru/refs.fileprocess.process.php
С помощью file_get_contents вполне можно парсить Код (PHP): function getContents($uri) { $opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n". 'Referer: '.$uri."\r\n" ) ); $context = stream_context_create($opts); return file_get_contents($uri, FILE_BINARY, $context); } а самое важное, конечно, регулярные выражения, они работают очень быстро и абсолютно гибки. Я написал парсер specserver.com который грузит страницы с помощью той функции и выделяет нужную инфу (урлы объявлений, всю инфу из объявлений в отдельные поля) с помощью регулярок. С локального компа (ноут, 20 мбит) - 10 страниц/сек, или все >50 тыс. объявлений за 90 часов. Потом я конечно научился пользоваться сURL'ом. Быстродействия php более чем достаточно, потому что время работы функций в тысячи раз меньше, чем тупо время получения страницы из интернета, которое зависит от скорости соединения и быстродействия конкретного сайта. Добавлено спустя 6 минут 39 секунд: Задачу многопоточности парсера на php легко решить тупо загрузив несколько копий скрипта, предусмотрев в них синхронизацию, через файлы, базу, или мемкеш - не важно, главное ведь что страницы грузятся и обрабатываются параллельно. Можно продвинуться и использовать pcntl, я обычно так и делаю. Схема может быть такая: главный скрипт, который из базы берет урлы, которые надо парсить, и запускает форки на каждый урл. Форк, в свою очередь, загружает и разбирает страницу, возможно добавляет в базу новые урлы. В 100-200 потоков средний сервак может парсить миллионы страниц в неделю.