admin / 13.08.2018

Как парсить сайты

Парсинг страниц сайтов(html-контента) на php.

парсингграббингсайтыконтентphpпарсить страниц

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Успехов!

Как сделать парсер контента на PHP

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

Как парсить сайты

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

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

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

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

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

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

Безусловно, Америки я в этой статье не открыл, но слишком много вопросов по теме парсеров, поэтому этой статьёй я постарался лишь дать развёрнутый ответ.

  • Создано 13.01.2014 13:21:08

  • Михаил Русаков

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так:

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Парсер можно написать самому :

или использовать уже готовые библиотеки.

Библиотеки для парсинга.

  1. PHP Simple HTML DOM Parser. Подробная документация, множество функций, простота использования. Начать изучение парсинга на PHP новичкам рекомендуется именно с неё.
  2. PHPQuery. Эффективный парсинг, использующий jQuery.
  3. Zend_DOM_Query.

    Как парсить сайт где нужна регистрация?

    Поскольку библиотека разработана как модуль к Zend Framework, то она идеально подойдёт прежде всего разработчикам проектов на данной CMF.

  4. Nokogiri. Компактная библиотека в полторы сотни строк, не уступающая по мощности вышеперечисленным аналогам.

 

PHP Simple HTML DOM Parser – библиотека функций парсинга для PHP, разработанная неким S.C. Chen@.

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

В числе плюсов — отсутствие проблем с кодировками. Часто бывает, что получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.

PHP Simple HTML DOM Parser – скачать

С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).

Приведу примеры из документации:

// Найти ссылки и возвратить массив найденных объектов $ret = $html->find(‘a’); // Найти (N)-ую по счету ссылку и возвратить найденный объект или null в случае, если объект не найден $ret = $html->find(‘a’, 0); // Найти все элементы <div>, у которых id=foo $ret = $html->find(‘div[id=foo]’); // Найти все элементы <div>, имеющие атрибут id $ret = $html->find(‘div[id]’); // Найти все элементы, имеющие атрибут id $ret = $html->find(‘[id]’);

В библиотеку заложена возможность перемещения по списку элементов объектного дерева.

Для этого используются:

$e->children( [int $index] ), $e->parent(), $e->first_child(), $e->last_child(), $e->next_sibling(), $e->prev_sibling().

Вот так будет выглядеть код с использованием Simple HTML DOM Parser:

include_once(‘simple_html_dom.php’); // Создаем объект DOM на основе кода, полученного по ссылке $html = file_get_html(‘http://www.google.com/’); // находим все ссылки foreach($html->find(‘a’) as $element) echo $element->href .’ (‘. $element->innertext. ‘)<br>’;

Еще селекторы

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

$single = $html->find(‘#foo’, 0);

$collection = $html->find(‘.foo’);

$collection = $html->find(‘a’);

$collection = $html->find(‘h1 a’);

$collection = $html->find(‘img[title=himom]’);

акже вы можете производить поиск по наличию атрибутов у искомого элемента. Пример:

//Найдём все изображения с шириной 300 $seo->find(‘img[width=300px]’); //Найдём изображения, у которых задана ширина $seo->find(‘img[width]’); //Поиск по наличию нескольких классов $seo->find(‘img[class=class1 class2]’);//<img class=»aclass1 class2″/> //Ищем несколько тегов вместе $seo->find(‘div, span, img, a’); //Поиск по вложенности. //В div ищем все спаны, а в спанах ссылки $html->find(‘div span a’);

Сервис Site2Zip позволяет бесплатно скачать любой сайт целиком в виде ZIP-архива, включая все картинки и CSS файлы.
Сервис очень простой и подходит для всех категорий пользователей — от новичков до профессионалов.

Парсинг страниц сайтов(html-контента) на php.

Сервис Robo.Tools позволяет восстановить резервную копию сайта из Веб Архива (WebArchive — архивирует большую часть Интернета, начиная с 1996 года) и сохранить его в виде ZIP-архива, сохраняя структуру и целостность ссылок, картинки, CSS-файлы. Есть возможность как локального, так и удаленного использования. Вставка произвольных html-кодов во все файлы.Внимание! Сервис расчитан на продвинутых пользователей. Работа с сервисом может потребовать определенных навыков и знаний.

Прочие услуги

Внимание! Услуга временно неактуальна Написание web-роботов для вас:

  • парсеры
  • автосабмиттеры
  • грабберы
  • персональные проекты под ключ

Любые технические инструменты к вашим услугам: PHP, Perl, MySQL, MongoDB, CodeIgniter, jQuery, Unix
Для связи используйте эту ссылку

Скрипт Human Emulator парсинга HTML-страницы с использованием XPath

В этой статье мы рассмотрим один из примеров написания скрипта для парсингаHTML-страниц с использованием XPath на примере сайта bing.com.

Сперва определимся с тем, что такое XPath и зачем оно нужно, если есть регулярные выражения?

XPath (XML Path Language) — это язык запросов к элементам XML-подобного документа (далее для краткости просто XML).
XPath призван реализовать навигацию по DOM в XML.

Regexp — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов.
По сути это строка-образец (шаблон), состоящая из символов и метасимволов и задающая правило поиска.

Итак, главная разница в том, что XPath специализируется на XML, а Regexp — на любом виде текста.

В: Зачем использовать XPath, если есть regexp, в котором можно сделать тоже самое?
О: Простота поддержки.

Синтаксис у regexp такой, что уже через неделю может быть проще всё переписать, чем вносить изменения,
а с XPath можно спокойно работать. И синтаксис у xpath довольно компактный,xml’ё-фобы могут быть спокойны.

Простой пример для вдохновления — получим значение аттрибута «href» у, например, тега «a».

Yohoho! Regexp:

Быстро (несколько небольших страниц) пробежаться по основам XPath можно в туториале от .

Как использовать XPath в PHP можно почитать в документации на .
И в небольшом тутораильчике от .

Теперь определимся с необходимым функционалом скрипта:

* Возможность указывать произвольный поисковый запрос

* Парсим только первую страницу поисковой выдачи

* Из поисковой выдачи нам нужно:

* заголовок

* ссылка

* номер в выдаче

Исходя из нашего ТЗ составляем примерный алгоритм работы скрипта:

1) Заходим на bing.com

2) Вводим поисковую фразу

3) Получаем со страницы необходимый результат

Приступим к написанию парсера поисковой выдачи http://bing.com.
Для начала, создадим базовый каркас скрипта.

// coding: windows-1251 // Настройка HumanEmulator // ———————————————— // Где запущен XHE $xhe_host = «127.0.0.1:7010»; // HumanEmulator lib require «../../Templates/xweb_human_emulator.php»; // Our tools require «tools/functions.php»; // Настройки скрипта // ———————————————— // Скрипт // ———————————————— // Quit $app->quit();

В настройки добавим переменную для хранения поискового запроса.

// Поисковый запрос $text = «ХуманЭмулятор»;

Заходим на сайт.

// Базовый URL $base_url = «https://www.bing.com/?setlang=en»; $browser->navigate($base_url);

Вводим поисковую фразу.

$input->set_value_by_attribute(«name», «q», true, $text); sleep(1); $element->click_by_attribute(«type», «submit»); sleep(5);

Сохраним в переменную содержимое страницы.

// Получаем содержимое страницы $content = $webpage->get_body();

Настроим xpath-объект:

$dom = new DOMDocument; @$dom->loadHTML($content); $xpath = new DOMXpath($dom);

Теперь у объекта $xpath есть метод «query» в который мы будемпередавать наше xpath-выражение.
Давайте начнём создавать xpath-выражение.
Открыв исходный код страницы с результатами поисковой выдачи увидим, что сами результаты находятся внутри тега «li».

Т.о. наше xpath-выражение выберет со страницы все поисковые результаты.

$results = $xpath->query(«//li[@class=\»b_algo\»]»);

На одной странице у нас должно быть 1 или больше результатов, проверим себя:

if($results === false) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } elseif($results->length === 0) { echo «Поисковый запрос ‘{$text}’ не принёс результатов.» . PHP_EOL: $app->quit(); } echo «Нашли {$results->length} совпадений.» . PHP_EOL;

Здесь стоит обратить внимание на ветку if, где мы сравниваем кол-во результатов xpath-поиска с нулём.
Если наше xpath-выражение ничего не нашло, то это может означать две вещи:

* Bing действительно ничего не нашёл.

* Bing что-то нашёл, но поменял вёрстку на странице, и наше xpath-выражение необходимо исправлять.

2-й пункт достаточно коварный, в таких случаях, когда xpath-выражение ничего не находит необходимо дополнительно
сверятся, чтобы удостоверится, что xpath-выражение не устарело (хотя и это не даст 100% гарантий).
В нашем случае будем сверяться с тем, что Bing пишет кол-во найденных результатов.

14 results

А если результатов по поисковому запросу нет, то:

  • No results found for …

  • Т.о. мы получаем такую конструкцию проверки:

    — Если xpath-запрос ничего не нашёл и поисковый запросничего не нашёл, то на странице будет html-код с «No results found».

    — Если xpath-запрос ничего не нашёл, а поисковый запрос что-то нашёл, то на странице будет html-код с «N results».

    Обновим проверку результата xpath-запроса.

    if($results === false) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } elseif($results->length === 0) { // Если bing ничего не нашёл $check_results1 = $xpath->query(«//li[@class=\»b_no\»]»); // Если bing что-то нашёл $check_results2 = $xpath->query(«//span[@class=\»sb_count\»]»); if($check_results1 === false or $check_results2 === false) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } if($check_results1->length > 0 and $check_results2->length === 0) { echo «Поисковый запрос ‘{$text}’ не принёс результатов.» . PHP_EOL: $app->quit(); } else { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } } else { echo «Нашли {$results->length} совпадений для ‘{$text}’ на 1-й странице поисковой выдачи.» . PHP_EOL; }

    Если всё хорошо и что-то нашлось, то у нас в $results будет N сущностей с результатами отработки xpath-запроса.

    Каждая сущность будет содержать такой HTML-код

    Для чего нужен ХуманЭмулятор? > …

    Теперь можно приступить непосредственно к выборке интересующих нас данных.

    foreach($results as $num => $item) { // В $item у нас сущность с одним результатом из поисковой выдачи }

    Получаем номер в поисковой выдаче.

    echo «Номер в поисковой выдаче: » . ($num + 1) .

    10 современных инструментов, позволяющих парсить информацию с веб-сайтов, включая цены конкурентов

    PHP_EOL;

    Получаем заголовок.

    $title = $xpath->query(«div[contains(@class, \»title\»)]/h2/a», $item); if($title === false or $title->length !== 1) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } $title = utf8_decode($title->item(0)->textContent); echo «Заголовок: ‘{$title}'» . PHP_EOL;

    В данном случае мы в метод «query» передали вторым параметром текущий $item и в xpath-запросе не указывали «//» (т.е. искать сначала страницы).

    2-й парметр означает контекст поиска для xpath-запроса, т.е.искать будем не по всей странице, а только по маленькому html-кусочку из $item.
    И, наконец-то, получаем ссылку.

    $link = $xpath->query(«div[contains(@class, \»title\»)]/h2/a», $item); if($link === false or $link->length !== 1) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } $link = $link->item(0)->getAttribute(«href»); echo «Ссылка: ‘{$link}'» . PHP_EOL;

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

    // Получаем заголовок и ссылку // $title_link = $xpath->query(«div[contains(@class, \»title\»)]/h2/a», $item); if($title_link === false or $title_link->length !== 1) { echo «С нашим xpath-выражением что-то не так.» . PHP_EOL; $app->quit(); } $title = utf8_decode($title_link->item(0)->textContent); echo «Заголовок: ‘{$title}'» . PHP_EOL; $link = $title_link->item(0)->getAttribute(«href»); echo «Ссылка: ‘{$link}'» . PHP_EOL;

    Полезные ссылки:

    Скрипт написан 28.04.2015 в Human Emulator 4.9.18 Advanced.

    скачать скрипт

    << Другие скрипты

    FILED UNDER : IT

    Submit a Comment

    Must be required * marked fields.

    :*
    :*