Парсер на php с использованием Simple_dom_html

php парсерРешил написать небольшую вводную статью по парсингу сайтов. Предыдущая статья описывала основы основ парсинга – в этой я опишу один из удобных инструментов для анализа данных полученой HTML страницы. Этот инструмент PHP Simple HTML DOM Parser – его еще называют jQuery на PHP.

Итак задача: необходимо получить данные о всех статьях с первой страницы блога habrahabr и сформировать из них массив годный для сохранения в базу данных либо XML файл

<?php 
        $html = file_get_contents('http://habrahabr.ru/');
        $dom = str_get_html($html);
        unset($html); //освобождаем память

        $posts = $dom->find('div.posts_list>div.posts>div.post');

        $result = array();
        if (!empty($posts)) {
            foreach ($posts as $post) {
                $title = $post->find('h1.title>a', 0);
                $content = $post->find('div.html_format', 0);
                $result[] = array('title' => $title->plaintext, 'short' => $content->innertext);
            }
        }

        print_r($result);

Для анализа данных описания и поиска в тексте картинок можно использовать такой код:

        $html = file_get_contents('http://habrahabr.ru/');
        $dom = str_get_html($html);
        unset($html); //освобождаем память

        $posts = $dom->find('div.posts_list>div.posts>div.post');

        $result = array();
        if (!empty($posts)) {
            foreach ($posts as $post) {
                $title = $post->find('h1.title>a', 0);
                $content = $post->find('div.html_format', 0);

                $images = $content->find('img');

                $imagesSrc = array();
                if (!empty($images)) {
                    foreach ($images as $img) {
                        $imagesSrc[] = (string) $img->src;
                    }
                }

                $result[] = array('title' => $title->plaintext, 'short' => $content->innertext, 'images' => $imagesSrc);
            }
        }

        print_r($result);

Утечки памяти при использовании Simple html dom

Очень часто приложению нехватает памяти при использовании Simple html dom. Я поборол эту проблему используя метод $dom->clear(); при окончании работы с DOM элементами. Так же нужно очищать все найденные под элементы. К примеру как я по правильному написал бы код выше с учетом утечки памяти:

        $html = file_get_contents('http://habrahabr.ru/');
        $dom = str_get_html($html);
        unset($html); //освобождаем память

        $posts = $dom->find('div.posts_list>div.posts>div.post');

        $result = array();
        if (!empty($posts)) {
            foreach ($posts as $post) {
                $title = $post->find('h1.title>a', 0);
                $content = $post->find('div.html_format', 0);

                $images = $content->find('img');

                $imagesSrc = array();
                if (!empty($images)) {
                    foreach ($images as $img) {
                        $imagesSrc[] = (string) $img->src;
                        $img->clear();
                    }
                }

                $result[] = array('title' => $title->plaintext, 'short' => $content->innertext, 'images' => $imagesSrc);

                $title->clear();
                $content->clear();
                $post->clear();
            }
        }
        $dom->clear();
        unset($dom);

        print_r($result);

При парсинге сайтов возникает множество дополнительных трудностей – я описал решение для одной из них. В следующей статье я опишу как спарсить каталог товаров с учетом постраничности.

Написать ответ

 Имя

 Mail

 Сайт

[Имя и Mail обязательны для заполнения. Mail не будет опубликован.]


 9fce13c8-2714-4603-b8e7-33be6c785d58