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