Веб-парсинг на PHP: пошаговое руководство
Не знаете, как парсить веб-страницы с помощью PHP? Это единственное руководство, которое вам понадобится!
Зачем использовать PHP
На PHP в настоящее время работает около 40% веб-ресурсов, включая такие сайты, как WordPress и Slack. Это один из самых популярных языков сценариев на стороне сервера, когда речь идет о веб-разработке. Для тех, кто работает с MySQL, их базы данных тесно связаны. Это относительно простой язык для изучения, с хорошей документацией и библиотеками, которые могут сократить время разработки.
Как начать работать с PHP
В этом руководстве мы представим метод ручного парсинга веб-страниц, при котором вы отправляете бота на веб-сервер и собираете данные, используя PHP в качестве основного языка программирования. Это отличается от использования полностью автоматизированного инструмента сбора данных, который может упростить и оптимизировать процесс.
Веб-парсер будет работать, отправляя HTTP-запрос на сервер, а затем собирая код веб-сайта. Затем мы научим вас анализировать полученную информацию.
Вот пример фрагмента кода, который может появиться в заголовке вашего сайта для парсинга:
После извлечения этот код необходимо проанализировать, чтобы текст мог быть прочитан и понят аналитиками. В этом примере после анализа вы получите простой текст:
Прежде чем начать, убедитесь, что на вашем компьютере установлен PHP.
Веб-парсинг на PHP за 3 простых шага
Шаг первый: Сбор кода вашего целевого веб-сайта
Начните с ввода следующего кода:
Что касается конвенций кодирования:
- «» используются во всей документации по PHP в начале и в конце команд.
- Вторая строка устанавливает переменную с именем «$ code», которая относится к содержимому рассматриваемого URL-адреса, в этом примере мы будем ориентироваться на: «http://quotes.toscrape.com». Это помогает хранить код URL внутри переменной «$code».
Предпочитаете полностью автоматизированное решение для парсинга?
Шаг второй: Парсинг веб-страницы
Цель работы – собрать все цитаты с этого сайта:
Щелкните правой кнопкой мыши на целевой странице и нажмите «Просмотреть исходный код страницы», откроется новое окно с исходным кодом. В нашем примере все цитаты содержатся в тегах с классом «text» и атрибутом itemprop, также установленным в «text», как показано ниже:
Мы начнем с использования PHP, чтобы избавиться от всего нежелательного текста в коде, за исключением цитат в тегах , а затем выведем его на экран с помощью функции «echo»:
", "<>", $code); $splitCode = explode(" $final = substr($total, 37); echo $final; ?>
В строке 2 он заменяет все вхождения «>» в коде на «». Это сделано для того, чтобы его можно было разделить вместе с «, а в строке 11 — закрывающего тега .
Все, что нужно сделать сейчас, это получить текст между этими двумя вхождениями. Для этого создается переменная “i” со значением местоположения переменной открывающего тега. Затем создается переменная для последующего ввода результата. В строке 16 он начинает перебирать каждую букву после открывающего тега, добавляя ее к общему значению, а затем увеличивает переменную «i». После прохождения закрывающего тега цикл останавливается.
Затем он удаляет первые 37 цифр окончательной строки, потому что эти первые 37 цифр находятся в теге, который мы анализируем, — теге . И наконец, он извлекает конечный результат с помощью функции ‘echo’.
Когда вы запустите программу, она будет выглядеть примерно так:
“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
Это первая цитата, показанная на сайте, которую мы парсим без какого-либо «неудобного для человека» кода.
Шаг третий: Получение читаемого текста
Вы могли заметить, что он собирает только первое вхождение и ничего после него. Чтобы исправить это, мы можем просто удалить вхождения, которые мы только что вернули, а затем повторять процесс, пока не получим их все. Кроме того, мы можем упростить наш код, поместив процесс парсинга в функцию, чтобы его можно было запускать всякий раз, когда он нам нужен. Попробуйте использовать этот код:
", "<>", $code); $splitCode = explode(" // Run the function, then update splitCode to delete the previous occurance // that it can be repeated for the next quote, then loop through 3 times // (You can change how many times): parseCode($splitCode); $splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE); parseCode($splitCode); $splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE); parseCode($splitCode); $splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE); parseCode($splitCode); ?>
Как видите, наш предыдущий код был введен в функцию под названием «parseCode» с параметром «$splitCode», чтобы можно было получить доступ к коду, а затем ‘echo’ результат. Функция «parseCode» запускается в строке 27, а затем в строке 28 наша программа удаляет предыдущее вхождение закрывающего тега, чтобы его можно было повторить. Строки 27 и 28 просто повторяются ~ 3 раза, чтобы программа могла определить шаблон и обнаружить следующее вхождение.
Наконец, мы вводим закрывающий тег как «глобальную переменную» с суперглобальной областью видимости «$ GLOBALS», а в строке 21 мы вводим теги
вокруг каждой строки, которую он возвращает, чтобы он создавал новую строку для каждой новой цитаты. Вот результат:
“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.” “There are only two ways to live your life. One is as though nothing is a miracle. The Other is as though everything is a miracle.” “Try not to become a man of success. Rather become a man of value.”
Результат именно то, что мы искали. Никакого кода, только читаемый текст. Этот процесс можно воспроизвести практически для любого целевого сайта, например, для парсинга на eBay целевых точек данных, таких как цены на продукты, обзоры и SKU (единицы хранения).
Подведем итоги
Использование 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 первой попавшейся ссылки осуществляется так:
Более подробно можно посмотреть на сайте:
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’ ).
В итоге скрипт получается более громоздкий, и писать его уже не так удобно, но иногда приходится использовать именно эту библиотеку.