Как Написать Парсер на PHP


Написание парсера достаточно нестандартная задача к которой на первых парах тяжело подступится. В этой статье я расскажу алгоритма для парсинга почти любого сайта. В примере я использую 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/

URL: https://visavi.net/articles/266