Парсер на php с использованием Simple_dom_html
Решил написать небольшую вводную статью по парсингу сайтов. Предыдущая статья описывала основы основ парсинга – в этой я опишу один из удобных инструментов для анализа данных полученой 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);
При парсинге сайтов возникает множество дополнительных трудностей – я описал решение для одной из них. В следующей статье я опишу как спарсить каталог товаров с учетом постраничности.