Как Написать Парсер на PHP (Рейтинг: +9)

Печать / RSS

Написание парсера достаточно нестандартная задача к которой на первых парах тяжело подступится. В этой статье я расскажу алгоритма для парсинга почти любого сайта. В примере я использую 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/
Автор: Александр (25.04.11 / 15:14)
Парсер, как, написать
Рейтинг: +9
Просмотры: 3681
Комментарии (5) »