PHP парсинг HTML, с помощью simple HTML DOM. Пишем парсер контента на PHP Чтение файла в PHP построчно с помощью fgets()

контент php парсить страниц

Заметка посвящается парсингу, в частности парсинг сайтов, парсинг страниц, парсинг в веб-среде, парсинг html-контента сайта.

В процессе разработки различных веб-сервисов очень часто приходится сталкиваться с задачами, в которых требуется быстро получить различного рода информацию в больших объемах. В основном это связано с граббингом, кражей информации, как хотите это называйте. Дело в том, что информация доступна и открыта. Особенность парсинга - это быстрый и автоматизированный сбор данных, контента со страниц сайта.

Сейчас очень популярно парсить в веб-среде, а именно парсить сайта, который содержать хоть какую-нибудь ценность и актуальность для людей. Особой ценностью является каталог товаров, включая картинки, базы данных справочников и многое другое, что может пригодиться для конкурентов.

Давайте попробуем спарсить нужную информацию в html, попробуем достать все ссылки с нескольких страниц нашего сайта.

Для начала нам необходимо получить контент сайта в формате html. Для этого нам достаточно знать адреса нужных страниц.

Хочу показать 2 основных способа получения контента со страницы сайта:

В первую очередь приготовим массив с нужными адресами страниц:

//3 ссылки нашего сайта: $urls = array("http://hello-site..ru/games/");

1 вариант - php функция file_get_contents . Функция возвращает html-строку, которую мы будем парсить на ссылки:

//помещаем каждую ссылку в функцию file_get_contents foreach($urls as $urlsItem){ $out .= file_get_contents($urlsItem); //и добавляем содержание каждой страницы в строку } echo $out; //здесь контент всех трех страниц

2 вариант - CURL . Библиотека, которая поддерживается php и имеет большой набор настроек, от POST-запросов до работы с FTP. Рассмотрим стандартный вызов библиотеки curl, который отдаст нам контент сайта:

foreach($urls as $urlsItem){ //пропускаем каждую ссылку в цикле $output = curl_init(); //подключаем курл curl_setopt($output, CURLOPT_URL, $urlsItem); //отправляем адрес страницы curl_setopt($output, CURLOPT_RETURNTRANSFER, 1); curl_setopt($output, CURLOPT_HEADER, 0); $out .= curl_exec($output); //помещаем html-контент в строку curl_close($output); //закрываем подключение } echo $out; //здесь контент всех трех страниц

Теперь в нашей строке $out находится контент всех трех страниц. Итак, переходим непосредственно к парсингу нашей строки.

Опять же хочу показать 3 варианта решения нашей задачи: "нативный" способ на php, с помощью встроенной библиотеки DOMDocument и библиотеки SimpleHTMLDOM.

1. php функция explode . Функция находит искомый символ или часть строки и делит целую строку на элементы массива.

Повторюсь, нам необходимо получить значения всех атрибутов href у тегов a, для этого будем делить общую строку на некоторые части\отрезки:

// explode $hrefs = explode("

Если распечатать наш массив, будет примерно следующее:

Array ( => / => /hello => /timer/ => /leftmenu/ => /faq/ => /blog/ => /web-notes/ => /ordersite/ => /games)

2. встроенная библиотека DOMDocument . Работаем с классом примерно следующим образом:

//domelement $dom = new DOMDocument; //создаем объект $dom->loadHTML($out); //загружаем контент $node = $dom->getElementsByTagName("a"); //берем все теги a for ($i = 0; $i < $node->length; $i++) { $hrefText = $node->item($i)->getAttribute("href"); //вытаскиваем из тега атрибут href } foreach($hrefText as $hrefTextItem){ //избавляемся от ссылок с пустым атрибутом href if($hrefTextItem!=""){ $clearHrefs=$hrefTextItem; } } $clearHrefs = array_unique($clearHrefs); //избавляемся от одинаковых ссылок print_r($clearHrefs); // в итоге у нас массив со всем ссылками с 3х страниц

Результат такого кода ровно такой же, что и с помощью функции explode.

3. библиотека SimpleHTMLDOM . Ее необходимо подключать из файла. Работа примерно схожа с DOMDocument. Работаем с классом:

//simplehtml include("simple_html_dom.php"); //подключаем файл с классом SimpleHTMLDOM $html = new simple_html_dom(); //создаем объект $html->load($out); //помещаем наш контент $collection = $html->find("a"); //собираем все теги a foreach($collection as $collectionItem) { $articles = $collectionItem->attr; //массив всех атрибутов, href в том числе } foreach($articles as $articlesItem){ $hrefText = $articlesItem["href"]; //собираем в массив значения подмассива с ключом href } foreach($hrefText as $hrefTextItem){ //избавляемся от ссылок с пустым атрибутом href if($hrefTextItem!=""){ $clearHrefs=$hrefTextItem; } } $clearHrefs = array_unique($clearHrefs); //избавляемся от одинаковых ссылок print_r($clearHrefs); // в итоге у нас массив со всем ссылками с 3х страниц

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

Теперь, имея массив со всеми ссылками, собранными с трех страниц сайта, можно отправить ссылки в нужное русло, все зависит от задачи и фантазии. Имея такие возможности, можно спарсить большое количество данных самого разного вида информации, картинки, тексты, логи и т.д. Чужая информация в ваших руках, распоряжайтесь как вам угодно, но сами защищайтесь, хотя это невозможно)

Задача спарсить и обработать необходимую информацию со стороннего сайта встает перед веб-разработчиком довольно часто и по самым разнообразным причинам: таким образом можно заполнять свой проект контентом, динамически подгружать какую-то информацию и так далее.

В таких случаях перед программистом встает вопрос: какую из десятков библиотек выбрать? В этой статье мы постарались рассмотреть самые популярные варианты и выбрать из них лучший.

Регулярные выражения

Даже не смотря на то, что «регулярки» - это первое, что приходит на ум, использовать их для настоящих проектов не стоит.

Да, с простыми задачами регулярные выражения справляются лучше всех, но его использование значительно затрудняется, когда нужно спарсить большой и сложный кусок HTML-кода, который, к тому же, не всегда соответствует какому-то определенному шаблону и вообще может содержать синтаксические ошибки.

Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже - это и проще, и удобнее, и надежнее.

XPath и DOM

htmlSQL

Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования.

Возле ректора 20 октября 2013 в 17:33

Парсер на PHP – это просто

  • PHP ,
  • Программирование

Вебмастеры часто сталкиваются с такой проблемой, когда нужно взять с какого-либо сайта определенную информацию и перенести ее на другой. Можно сначала сохранить информацию на промежуточный носитель, а уже с него загрузить куда-либо, но подобный подход не всегда удобен. В некоторых случаях гораздо быстрее залить парсер на сам сайт, поддерживающий PHP и запустить его удаленно, чтобы он автоматически спарсил информацию и загрузил ее в базу данных ресурса.
Среди уже готовых решений имеются популярные вроде Content Downloader и ZennoPoster, они конечно очень удобны и понятны любому человеку, даже незнакомому с программированием, однако имеют некоторые минусы. К примеру, они платные и не обладают достаточной гибкостью, которую можно вдохнуть в обычный php скрипт. Тем более, что разработка сложного парсера на них нисколько не уступает по времени написанию аналога на php.
Еще есть такая бесплатная вещь как iMacros – скриптовый язык, который может эмулировать действия пользователя в браузере, но тоже не везде такой подход работает лучшим образом.

Многие думают, что программирование, и уж тем более написание парсеров, – очень сложное занятие. На самом деле php – один из самых простых языков, изучить который можно на достаточном уровне за пару недель или месяц.
Парсеры тоже просты в написании, именно поэтому начинающие программисты пишут именно их, чтобы освоить язык.
Первое, что приходит на ум человеку, который решил написать подобный скрипт, - нужно использовать функции для работы со строками (strpos, substr и аналогичные) или регулярные выражения. Это совершенно верно, однако есть один нюанс. Если парсеров нужно будет писать много, то придется разрабатывать свою библиотеку, чтобы не переписывать сто раз одни и те же конструкции, но на это уйдет тонна времени, а учитывая то, что уже существуют аналогичные библиотеки, такое занятие и вовсе оказывается бессмысленным.
Идеальным вариантом для новичка станет изучение библиотеки PHP Simple HTML DOM Parser. Как можно догадаться из названия, она очень проста в освоении. Рассмотрим базовый код:

$html = file_get_html("http://www.yandex.ru");
$a_links = $html->find("a");

Первая строка создает объект страницы, источником которой в данном случае является Яндекс, и записывает в переменную $html, которая имеет несколько функций, например find. Find – ищет элемент по какому-либо параметру, например find (‘a’) – вернет массив всех ссылок страницы. Find(‘#myid’) – вернет массив элементов, id которых равен "myid".
Доступ к параметру href первой попавшейся ссылки осуществляется так:

Echo $a_links[ 0 ]->href;

Более подробно можно посмотреть на сайте:
simplehtmldom.sourceforge.net

Библиотека, как уже было сказано выше, очень проста и лучше всего подходит для начинающего программиста, плюс ко всему она работает достаточно быстро и не сильно требовательна к ресурсам сервера.
Есть у этой библиотеки один минус – далеко не все страницы ей оказываются по зубам. Если какой-либо элемент не отображается, но точно известно, что он там есть, лучше воспользоваться библиотекой DOM (Document Object Model). Она хороша во всем, кроме скорости разработки и понятности.

$doc = new DOMDocument();
$doc->loadHTML ($data);
$searchNodes = $doc->getElementsByTagName("a");
echo $searchNodes[ 0 ]->getAttribute("href");

Этот скрипт создает сначала объект типа DOM, при этом в переменной $data должен находиться код страницы. Затем находит все теги a (ссылки), с помощью вызова $doc->getElementsByTagName, затем записывает их в массив $searchNodes. Доступ к параметру href первой ссылки на странице осуществляется с помощью вызова $searchNodes[ 0 ]->getAttribute("href").
В итоге скрипт получается более громоздкий, и писать его уже не так удобно, но иногда приходится использовать именно эту библиотеку.

Теги: php, парсер, программирование

Если вам необходимо сделать парсинг HTML документа, регулярные выражения не наилучший способ для этого. К тому же их написание, трудоемкий процесс, и они уменьшают скорость работы PHP приложения. В этой статье, вы узнаете, как использовать свободный парсер HTML, для чтения, изменения, извлечения некоторых DOM элементов из HTML страниц. Причем, HTML ресурсом может быть внешний источник. То есть адрес HTML страницы на другом домене. Используя, как пример, сайт sitear. ru , вы узнаете, как получить и вывести список всех опубликованных материалов на главной странице сайта. Другими словами, вы будете делать то, что вам необходимо, парсинг HTML с помощью PHP. В данном случае под PHP, подразумевается библиотека simple HTML DOM.

Просто следуйте всем шагам статьи, и узнаете много нового и полезного для себя!

Шаг 1 – Подготовка

Для начала, вам необходимо скачать копию simple HTML dom библиотеки. Скачивание свободно.

В архиве вы найдете несколько файлов, но нам необходим только один - simple_html_dom.php . Все остальные, это примеры и документация.

Шаг 2 – Основы HTML парсинга

Эта библиотека, очень проста в использовании, но все же, необходимо разобрать некоторые основы, перед тем как ее использовать.

$html = new simple_html_dom(); // Load from a string $html->load("

Hello World!

"); // Load a file $html->load_file("http://сайт/");

Все просто, вы можете создать объект, загружая HTML из строки. Или, загрузить HTML код из файла. Загрузить файл вы можете по URL адресу, или с вашей локальной файловой системы (сервера).

Важно помнить: Метод load_file(), работает на использовании PHP функции file_get_contents. Если в вашем файле php.ini, параметр allow_url_fopen не установлен как true, вы не сможете получать HTML файлы по удаленному адресу. Но, вы сможете загрузить эти файлы, используя библиотеку CURL. Далее, прочитать содержимое, используя метод load().

Получение доступа к HTML DOM объектам


Предположим у нас уже есть DOM объект, структурой, как на картинке выше. Вы можете начать работать с ним, используя метод find(), и создавая коллекции. Коллекции – это группы объектов, найденные с помощью селекторов – синтаксис в чем-то схож с jQuery.

Hello World!

We"re Here.

Используя этот пример HTML кода, мы узнаем, как получить доступ к информации заключенной во втором параграфе (p). Также, мы изменим полученную информацию и выведем результат на дисплей.

// создание объекта парсера и получение HTML include("simple_html_dom.php"); $html = new simple_html_dom(); $html->load("

Hello World!

"); // получение массивов параграфов $element = $html->find("p"); // изменение информации внутри параграфа $element->innertext .= " and we"re here to stay."; // вывод echo $html->save();

Как видите реализовать PHP парсинг документа HTML, очень даже просто, используя simple HTML DOM библиотеку. В принципе, в этом куске PHP кода, все можно понять интуитивно, но если вы в чем-то сомневаетесь, мы рассмотрим код.

Линия 2-4 : подключаем библиотеку, создаем объект класса и загружаем HTML код из строки.

Линия 7: С помощью данной строки, находим все

теги в HTML коде, и сохраняем в переменной в виде массива. Первый параграф будет иметь индекс 0, остальные параграфы будут индексированы соответственно 1,2,3…

Линия 10: Получаем содержимое второго параграфа в нашей коллекции. Его индекс будет 1. Также мы вносим изменения в текст с помощью атрибута innertext. Атрибут innertext, меняет все содержимое внутри указанного тега. Также мы сможем изменить сам тег с помощью атрибута outertext.

Давайте добавим еще одну строку PHP кода, с помощью которой мы назначим класс стиля нашему параграфу.

$element->class = "class_name"; echo $html->save();

Результатом выполнения нашего кода будет следующий HTML документ:

Hello World!

We"re here and we"re here to stay.

Другие селекторы

Ниже приведены другие примеры селекторов. Если вы использовали jQuery, то в библиотеке simple html dom синтаксис немножко схожий.

// получить первый элемент с id="foo" $single = $html->find("#foo", 0); // получает при парсинге все элементы с классом class="foo" $collection = $html->find(".foo"); // получает все теги при парсинге htmlдокумента $collection = $html->find("a"); // получает все теги , которые помещены в тег

$collection = $html->find("h1 a"); // получает все изображения с title="himom" $collection = $html->find("img");

Использование первого селектора при php парсинге html документа, очень простое и понятное. Его уникальность в том что он возвращает только один html элемент, в отличии от других, которые возвращают массив (коллекцию). Вторым параметром (0), мы указываем, что нам необходим только первый элемент нашей коллекции. Надеюсь, вам понятны все варианты селекторов библиотеки simple HTML DOM, если вы чего-то не поняли, попробуйте метод научного эксперимента. Если даже он не помог, обратитесь в комментарии к статье.

Документация библиотеки simple HTML DOM

Полнейшую документацию по использованию библиотеки simple HTML DOM вы сможете найти по этому адресу:

http://simplehtmldom.sourceforge.net/manual.htm

Просто предоставлю вам иллюстрацию, которая показывает возможные свойства выбранного HTML DOM элемента.


Шаг 3 – Реальный пример PHP парсинга HTML документа

Для примера парсинга, и приведения HTML DOM библиотеки в действие, мы напишем грабер материалов на сайте сайт. Далее мы выведем все статьи в виде списка, в котором будут указаны названия статей. При написании граберов, помните, кража контента преследуется законом! Но не в случае, когда на странице стоит активная ссылка на исходный документ.


Include("simple_html_dom.php"); $articles = array(); getArticles("http://сайт/");

Начинаем с подключения библиотеки, и вызова функции getArticles, которая будет парсить HTML документы соответственно адресу страницы, которая передается в качестве параметра функции.

Также мы указываем глобальный массив, в котором будет, хранится вся информация о статьях. Перед тем как начать парсинг HTML документа, давайте посмотрим, как он выглядит.

Это базовый шаблон данной страницы. При написании парсера html, нужно тщательно исследовать документ, так как и комментарии, типа , это тоже потомки. Другими словами, в глазах библиотеки simple HTML DOM, это элементы, которые равноценны другим тегам страницы.

Шаг 4 – Пишем основную функцию PHP парсера HTML

function getArticles($page) { global $articles; $html = new simple_html_dom(); $html->load_file($page); // ... далее будет... }

Вначале функции, мы вызываем наш глобальный массив, который мы указали ранее. Создаем новый объект simple_html_dom. Далее загружаем страницу, которую будем парсить.

Шаг 5 – Находим нужную информацию

$items = $html->find("div"); foreach($items as $names) { $articles = array($post->children(0)->plaintext); }

В этом куске кода все предельно просто, мы находим все div с class=name_material. Далее читаем коллекцию элементов и выбираем названия материалов. Все материалы будут сохранены в массиве в данном виде:

$articles = "Имя материала 1"; $articles = "Имя материала 2"; …

Шаг 6 – Выводим результат парсинга

Для начала, мы установим некоторые стили, для красоты выводимой информации, которую получили при парсинге.

Item { padding:10px; color:#600; font:bold 40px/38px helvetica, verdana, sans-serif; }

"; echo $item; echo "

"; } ?>

Результатом выполнения данного скрипта, будет список названий статей на сайте сайт.

Заключение

Вот мы и научились php парсингу html документов. Помните, что парсинг это долгий процесс. Одна страница может парситься около одной секунды. Если вы будете делать парсинг большого числа HTML документов, ваш сервер может перервать работу скрипта в связи с истечением время отведенного для выполнения. Это можно исправить с помощью функции set_time_limit(240); 240 – это время в секундах, отведенное на выполнение скрипта.

Эта статья предназначена для формирования основных понятий парсинга HTML страницы с помощью PHP. Существуют и другие библиотеки и методы парсинга. Если вы знаете таковые, поделитесь в комментариях. Буду рад, узнать какими инструментами и методами html парсинга пользуетесь вы.

У многих из Вас возникают вопросы по поводу создания парсера на PHP . Например, есть какой-то сайт, и Вам необходимо получить с него контент. Я долго не хотел писать эту статью, поскольку конкретного смысла в ней нет. Чтобы сделать парсер на PHP , нужно знать этот язык. А те, кто его знает, такой вопрос просто не зададут. Но в этой статье я расскажу, как вообще создаются парсеры, а также, что конкретно нужно изучать.

Итак, вот список пунктов, которые необходимо пройти, чтобы создать парсер контента на PHP :

  1. Получить содержимое страницы и записать его в строковую переменную. Наиболее простой вариант - это функция file_get_contents() . Если контент доступен только авторизованным пользователям, то тут всё несколько сложнее. Здесь уже надо посмотреть, каков механизм авторизации. Далее, используя cURL , отправить правильный запрос на форму авторизации, получить ответ и затем отправить правильные заголовки (например, полученный идентификатор сессии), а также в этом же запросе обратиться к той странице, которая нужна. Тогда уже в этом ответе Вы получите конечную страницу.
  2. Изучить структуру страницы. Вам нужно найти контент, который Вам необходим и посмотреть, в каком блоке он находится. Если блок, в котором он находится не уникален, то найти другие общие признаки, по которым Вы однозначно сможете сказать, что если строка удовлетворяет им, то это то, что Вам и нужно.
  3. Используя строковые функции, достать из исходной строки нужный Вам контент по признакам, найденным во 2-ом пункте.

Отмечу так же, что всё это поймёт и сможет применить на практике только тот, кто знает PHP . Поэтому те, кто его только начинает изучать, Вам потребуются следующие знания:

  1. Строковые функции.
  2. Библиотека cURL , либо её аналог.
  3. Отличное знание HTML .

Те же, кто ещё вообще не знает PHP , то до парсеров в этом случае ещё далеко, и нужно изучать всю базу. В этом Вам поможет

В продолжение темы:
Компьютер

Приветствую! Когда у Вас в семье есть несколько iPhone, то вы очень богатый человек многие предпочитают использовать одну учетную запись Apple ID на все эти устройства. Ну а...

Новые статьи
/
Популярные