Как Написать Парсер на PHP (Рейтинг: +9)
Написание парсера достаточно нестандартная задача к которой на первых парах тяжело подступится. В этой статье я расскажу алгоритма для парсинга почти любого сайта. В примере я использую PHP.
Для начала рассмотрим некоторые необходимые функции и библиотеки:
file_get_contents(string $url) - функция принимает в качестве параметра URL(кроме этого там может быть просто путь к файлу), на выходе возвращает содержимое страницы со всеми тегами. У этой функции есть недостатки, к примеру в User-agent посылается значение переменной user_agent из файла настроек PHP, а это может помешать при парсинге.
Библиотека CURL. Библиотека нужна что бы можно было получать содержимое страниц с заголовками как у браузеров. Почитать более подробно можно здесь: http://ru2.php.net/manual/en/book.curl.php
preg_match(string $pattern, string $subject, array &$matches) – функция для работы с регулярными выражениями, на входе идут 3 парметра: $pattern – регулярное выражение, $subject – строка где идет поиск по регулярному выражению, $matches – массив результатов).
preg_match_all(string $pattern, string $subject, array &$matches) – та же самая функция, что и preg_match, только она ищет все вхождения шаблона.
Теперь перейдем к самому парсингу. Объяснять буду на примере этого сайта (vilblog.ru)
1. Рассмотрим сайт и определим принцип построения URL-ов, что бы их можно по очереди открыть. К пример на этом сайте посты расположены на страницах с URL-ами вида http://vilblog.ru/page/номер_страницы. Всего страниц 4, следовательно, необходимо открыть в каждую из них внутри цикла, а оттуда смотреть как устроены URL-ы постов.
2. Тут возникает небольшая проблема, на странице могут быть ссылки на другие посты, которые расположены не на выбранной странице, поэтому смотрим html-код, что бы определить чем ссылки заголовков постов отличаются от остальных. В нашем случае там вот такой вот html-код:
<h2><a href="http://vilblog.ru/2010/01/26/onlajn-treningi/" title="Онлайн тренинги"> Онлайн тренинги</a></h2>Как видно ссылка расположена внутри тега h2. То есть внутри регулярного выражения нужно найти все что расположено внутри тега A, который расположен внутри тега H2 и извлечь атрибут href.
3. После того как мы получили URL-ы всех статей нам необходимо отпарсить их. Открываем любую и смотрим где расположен html-код самого контента. Тут все сложнее, текст расположен между элементами:
Прокомментировать</a></p> и </p>Так же извлекаем его регулярным выражением
4. Собственно сам код парсера:
<?php //массив с контентом $cont = array(); //парсим в цикле 4 страницы for($i=1;$i<=1;$i++) { //загружаем страницу $data = file_get_contents("http://vilblog.ru/page/".$i); //извлекаем ссылки preg_match_all("/\<h2\>\<a\ href\=\"(.*)\"/U",$data,$mch); //в переменно $mch[1] получаем массив ссылок на посты //в цикле просматриваем все URL foreach($mch[1] as $p) { $tmp = ""; //загружаем пост $post = file_get_contents($p); //извлекаем содержимое страницы (ТУТ СПЕЦBFАЛЬНО СДЕЛАНА ОШBБКА) preg_match_all("/ть\<\/a\>\<\/p\>(.*)\<p\ class\=\"meta2\"\>/",$post,$mch2); //убираем ненужные пробелы $tmp = trim($mch2); $cont[] = $tmp; } } //на выходе получаем массив $cont со всеми статьями блога ?>';Большинство сайтов можно отпарсить таким способом только лишь изменяя регулярные выражения. Кроме контента с html-кода страницы можно извлечь ключевые слова, мета-описания, заголовок и другое.
Источник взят с:
http://vilblog.ru/2010/04/02/parsery-na-php-chast-1/
Рейтинг:
+9
Просмотры: 4257Комментарии (5) »