Парсинг и обработка веб-страницы на PHP выбираем лучшую библиотеку


Оглавление (нажмите, чтобы открыть):

Пишем парсер контента на PHP

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

Если вы попали на эту статью из поиска, то перед вами, наверняка, стоит конкретная задача и вы еще не задумывались над тем, для чего ещё вам может пригодится парсер. Поэтому, перед тем как вдаваться в теорию и непосредственно в код, предлагаю прочесть предыдущею статью – парсер новостей, где был рассмотрен один из простых вариантов, да и я буду периодически ссылаться на неё.

Работать мы будем с CURL, но для начала давайте разберёмся, что эта аббревиатура обозначает. CURL – это программа командной строки, позволяющая нам общаться с серверами используя для этого различные протоколы, в нашем случаи HTTP и HTTPS. Для работы с CURL в PHP есть библиотека libcurl, функции которой мы и будем использовать для отправки запросов и получения ответов от сервера.

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

Как можно увидеть из скриншота все категории находятся в ненумерованном списке, а подкатегории:

Внутри отельного элемента списка в таком же ненумерованном. Структура несложная, осталось только её получить. Товары мы возьмем из раздела «Все телефоны»:

На странице получается 24 товара, у каждого мы вытянем: картинку, название, ссылку на товар, характеристики и цену.

Пишем скрипт парсера

Если вы уже прочли предыдущею статью, то из неё можно было подчеркнуть, что процесс и скрипт парсинга сайта состоит из двух частей:

  1. Нужно получить HTML код страницы, которой нам необходим;
  2. Разбор полученного кода с сохранением данных и дальнейшей обработки их (как и в первой статье по парсингу мы будем использовать phpQuery, в ней же вы найдете, как установить её через composer).

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

Основной метод, который у нас будет – это getPage() и у него всего один обязательный параметр URL страницы, которой мы будем парсить. Что ещё будет уметь наш замечательный метод, и какие значения мы будем обрабатывать в нем:

  • $useragent – нам важно иметь возможность устанавливать заголовок User-Agent, так мы сможем сделать наши обращения к серверу похожими на обращения из браузера;
  • $timeout – будет отвечать за время выполнения запроса на сервер;
  • $connecttimeout – так же важно указывать время ожидания соединения;
  • $head – если нам потребуется проверить только заголовки, которые отдаёт сервер на наш запрос этот параметр нам просто будет необходим;
  • $cookie_file – тут всё просто: файл, в который будут записывать куки нашего донора контента и при обращении передаваться;
  • $cookie_session – иногда может быть необходимо, запрещать передачу сессионных кук;
  • $proxy_ip – параметр говорящий, IP прокси-сервера, мы сегодня спарсим пару страниц, но если необходимо несколько тысяч, то без проксей никак;
  • $proxy_port – соответственно порт прокси-сервера;
  • $proxy_type – тип прокси CURLPROXY_HTTP, CURLPROXY_SOCKS4, CURLPROXY_SOCKS5, CURLPROXY_SOCKS4A или CURLPROXY_SOCKS5_HOSTNAME;
  • $headers – выше мы указали параметр, отвечающий за заголовок User-Agent, но иногда нужно передать помимо его и другие, для это нам потребуется массив заголовков;
  • $post – для отправки POST запроса.

Конечно, обрабатываемых значений много и не всё мы будем использовать для нашей сегодняшней задачи, но разобрать их стоит, так как при парсинге больше одной страницы многое выше описанное пригодится. И так добавим их в наш скрипт:

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

Так мы обезопасим себя от ситуации, когда по какой-либо причине не создался файл.

Для работы с CURL нам необходимо вначале инициализировать сеанс, а по завершению работы его закрыть, также при работе важно учесть возможные ошибки, которые наверняка появятся, а при успешном получении ответа вернуть результат, сделаем мы это таким образам:

Первое, что вы могли заметить – это статическое свойство $error_codes, к которому мы обращаемся, но при этом его ещё не описали. Это массив с расшифровкой кодов функции curl_errno(), давайте его добавим, а потом разберем, что происходит выше.

После того, как мы инициализировали соединения через функцию curl_setopt(), установим несколько параметров для текущего сеанса:

  • CURLOPT_URL – первый и обязательный — это адрес, на который мы обращаемся;
  • CURLINFO_HEADER_OUT –массив с информацией о текущем соединении.

Используя функцию curl_exec(), мы осуществляем непосредственно запрос при помощи CURL, а результат сохраняем в переменную $content, по умолчанию после успешной отработки результат отобразиться на экране, а в $content упадет true. Отследить попутную информацию при запросе нам поможет функция curl_getinfo(). Также важно, если произойдет ошибка — результат общения будет false, поэтому, ниже по коду мы используем строгое равенство с учетом типов. Осталось рассмотреть ещё две функции это curl_error() – вернёт сообщение об ошибке, и curl_errno() – код ошибки. Результатом работы метода getPage() будет массив, а чтобы его увидеть давайте им воспользуемся, а для теста сделаем запрос на сервис httpbin для получения своего IP.

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

Если вывести на экран, то у вас должна быть похожая картина:

Если произойдет ошибка, то результат будет выглядеть так:

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

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

Теперь можно увидеть более приятную картину:

Двигаемся далее, мы описали переменные $useragent, $timeout и $connecttimeout. Добавляем их в наш скрипт:

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

Мы отключили вывод тела документа и включили вывод шапки в результате:

Для работы со ссылками с SSL сертификатом, добавляем:

Уже получается весьма неплохой скрипт парсера контента, мы добрались до кук и тут стоит отметить — частая проблема, когда они не сохраняются. Одной из основных причин может быть указание относительного пути, поэтому нам стоит это учесть и написать следующие строки:

Предлагаю проверить, а для этого я попробую вытянуть куки со своего сайта:

Всё получилось, двигаемся дальше и нам осталось добавить в параметры сеанса: прокси, заголовки и возможность отправки запросов POST:

Это малая доля параметров, с которыми можно работать, все остальные находятся в официальной документации PHP . Вот мы завершили с нашей оберткой, и пришло время, что-нибудь спарсить!

Парсим категории и товары с сайта

Теперь, при помощи нашего класса Parser, мы можем сделать запрос и получить страницу с контентом. Давайте и поступим:

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

Чуть более подробно работу с phpQuery я разобрал в первой статье по парсингу контента. Если вкратце, то мы пробегаемся по DOM дереву и вытягиваем нужные нам данные, их я решил протримить, чтобы убрать лишние пробелы. А теперь выведем категории на экран:

В результате мы получили все ссылки на категории. Для получения товаров используем тот же принцип:

Получаем страницу, тут я увеличил время соединения, так как 5 секунд не хватило, и разбираем её, парся необходимый контент:

Теперь проверим, что у нас получилось, и выведем на экран:

Мастер Йода рекомендует:  Политика инфопартнерства Tproger

Вот мы и написали парсер контента PHP, как видите, нет нечего сложного, при помощи этого скрипта можно легко спарсить страницы любого сайта, но перед тем, как заканчивать статью, хотелось пояснить некоторые моменты. Во-первых, если вы хотите парсить более одной страницы, то не стоит забывать, что сам процесс парсинга ресурса затратная операция, поэтому в идеале лучше, чтобы скрипт был вынесен на отдельный сервер, где и будет запускаться по крону. Ещё один момент — к каждому донору стоит подходить индивидуально, так как, во-первых: у них разный HTML код и он, с течением времени, может меняться, во-вторых: могут быть различные защиты от парсинга и проверки, поэтому для подбора необходимого набора заголовков и параметров может потребоваться отладочный прокси (я пользуюсь Fiddler). И последние, что я добавлю — используйте для парсинга прокси и чем больше, тем лучше, так как, когда на сервер донора полетят тысячи запросов, то неизбежно IP, с которого осуществляется обращение будет забанен, поэтому стоит прогонять свои запросы через прокси-сервера.

Полный пример с библеотекай phpQuery вы найдете на github .

Библиотеки для PHP разработчика

Список полезных библиотек для PHP разработчика

Текст

wapmorgan/Morphos — Морфологическое решение на PHP для русского языка: склонение имен и существительных, плюрализация, количественные числительные.

teamtnt/tntsearch — Полнофункциональный движок полнотекстового поиска на PHP.

fe3dback/str — Библиотека, в которой реализовано множество функций для манипуляций со строками в ООП стиле и поддержкой многобайтных строк.

Дата и время

fightbulc/moment.php — Библиотека для работы с датой и временем, поддержкой интернационализации, вдохновленная moment.js.

jenssegers/date — Библиотека на базе Carbon для работы с датами и поддержкой мультиязычности.

spatie/period — Библиотека позволяет делать сложные сравнения дат, например, найти пересечения периодов, разницу, пробелы, крайние границы и прочее.

Файлы

wapmorgan/BinaryStream — Библиотека для удобного чтения бинарных файлов.

Ne-Lexa/php-buffer — Удобное чтение и запись бинарных файлов.

ankitpokhrel/tus-php — Реализация сервера для протокола возобновляемых загрузок файлов — tus.io.

Изображения

flyimg.io — Приложение для изменения размеров, обрезки и сжатия изображений на лету.

kosinix/grafika — Библиотека для работы с изображениями. Среди возможностей из коробки: умный кроп, перцептивный хэш, сравнение изображений.

undemanding/difference — Библиотека позволяет оценить различия между изображениями.

thephpleague/glide — Библиотека для работы с изображениями. Туториал по использованию.

ErikvdVen/php-gif — Создание динамических GIF файлов по запросу.

wapmorgan/Imagery — Обертка над GD для работы с изображениями.

Скриншоты

spatie/browsershot — Библиотека для создания скриншотов веб-страниц на основе Headless Chrome.

paragonie/easydb — Простая и удобная обертка над PDO. Доступно кэширование подготовленных запросов paragonie/easydb-cache.

wizaplace/github-to-mysql — Скрипт для синхронизации данных из GitHub (issues, labels, . ) в MySQL.

zeeshanu/git-profile — Утилита позволяет легко переключаться между разными конфигурациями Git.

php-composter/php-composter — Управление Git-хуками с помощью Composer.

bouiboui/tissue — Библиотека позволяет создавать Issue на Github прямо из исключений в коде.

malukenho/PsyGit — Библиотека для работы с Git из PHP.

CaptainHookPhp/captainhook — Менеджер Git-хуков для PHP-проектов. Хуки конфигурируются в composer.json.

patrickschur/language-detection — Библиотека для определения языка по заданной строке.

TBPixel/xml-streamer — Пакет для потокового чтение XML-данных, совместим с PSR-7.

asyncphp/paper — Асинхронный конвертер HTML в PDF.

smalot/pdfparser — Библиотека для получения информации из PDF-документов.

Работа с архивами

maennchen/ZipStream-PHP — Библиотека позволяет создавать zip-архив на лету и писать в поток.

wapmorgan/UnifiedArchive — Утилита для унифицированного доступа к 9+ различным форматам архивов.

simplepie/simplepie — Простой парсер Atom/RSS фидов.

miniflux/miniflux — Минималистичная читалка RSS.

corpsee/php-censor — CI-сервер на PHP. Форк практически заброшенного PHPCI.

OndraM/ci-detector — Позволяет определить используемый CI-сервер и получить данные о билде.

simpleci/simpleci — Система непрерывной интеграции, основанная на Docker.

Аутенфикация

SocialConnect/auth — Библиотека для аутентификации через соц. сервисы (OAuth1/2, OpenID, OpenIDConnect). 20+ провайдеров из коробки (VK, FB, G+, Twitter, Steam и т.д.).


Adldap2/Adldap2 — Аутентификация через LDAP и работа с Active Directory в стиле Active Record.

hybridauth/hybridauth — Одна из самых популярных библиотек для аутентификации с помощью соцсетей.

Video / Audio

wapmorgan/UnifiedArchive — Библиотека для унифицированного доступа к архивам различных форматов. Также в виде утилиты командной строки — wapmorgan/CAM.

wapmorgan/UnifiedPlaylist — Библиотека для чтения всех популярных форматов плей-листов: aimppl, asx, xspf, zpl, m3u, pls, upf.

jack-theripper/transcoder — Инструмент для кодирования, конвертации, и получения метаинформации для аудио и видео.

nahid/jsonq — Query builder для JSON.

webmozart/json — Полноценный енкодер/декодер JSON с поддержкой валидации схемы.

paragonie/iaso — Набор инструментов для работы с JSON, включающий парсер, устойчивый к Hash-DoS атаке.

halaxa/json-machine — Потоковое чтение (декодирование) JSON. Для потокового кодирования подойдет violet-php/streaming-json-encoder.

clue/php-commander — Инструмент для создания простых консольных приложений с лаконичным интерфейсом.

nategood/commando — Библиотека для реализации консольных команд с простым fluent-интерфейсом.

cilex/cilex — Фреймворк для создания инструментов командной строки.

nunomaduro/collision — Whoops для консольных приложений — отображает красивые и информативные отчеты об ошибках.

php-school/cli-menu — Интерактивные меню для командной строки.

getopt-php/getopt-php — Библиотека для парсинга аргументов командной строки.

Кеширование

phpsocialnetwork/phpfastcache — Мощный компонент для кэширования с поддержкой множества драйверов.

php-ai/php-ml — Реализацией алгоритмов машинного обучения на PHP.

RubixML/RubixML — Библиотека для применения машинного обучения на PHP. Альтернатива php-ai/php-ml.

Статический анализ кода

vimeo/psalm — Инструмент статического анализа для поиска ошибок в PHP-приложениях.

exakat/exakat — Статический анализатор. Также доступен список всех подобных инструментов: exakat/php-static-analysis-tools.

etsy/phan — Статический анализатор для PHP.

ovr/phpsa — Еще один статический анализатор для PHP

edsonmedina/php_testability — Статический анализатор для проверки на тестируемость.

nunomaduro/phpinsights — Консольный инструмент прогоняет проверки качества кода и выводит в красивом виде.

Deploy

Deployer Популярный инструмент для деплоя deployer.org

banago/PHPloy — Инструмент развертывания по FTP/SFTP с поддержкой нескольких серверов, подмодулей и откатов.

phanan/kupo — Автоматизированный чек-лист для проверки сайта перед запуском.

jonathantorres/construct — Инструмент генерирует структуру папок и файлы для нового PHP-проекта.

CodeSniffer

wimg/PHPCompatibility — Набор правил для PHP_CodeSniffer для проверки кода на совместимость с различными версиями PHP. Туториал по использованию.

behance/php-sniffs — Несколько дополнительных правил для PHP_CodeSniffer.

slevomat/coding-standard — Расширенный стандарт кодирования для PHP_CodeSniffer.

doctrine/coding-standard — Правила для PHP_CodeSniffer на базе PSR-1/2 с дополнениями

Composer

wikimedia/composer-merge-plugin — Плагин для Composer, который объединяет несколько composer.json файлов налету. Удобно для разделения проекта на внутренние компоненты со своими зависимостями.

PHPUnit

jwage/phpchunkit — Надстройка над PHPUnit, позволяет разбивать большие наборы тестов на куски и выполнять параллельно.

ScriptFUSION/PHPUnit-Immediate-Exception-Printer — Печатает информацию о возникших ошибках во время выполенения тестов не дожидаясь их конца.

spatie/phpunit-snapshot-assertions — Пакет для снэпшот-тестирования с помощью PHPUnit а-ля Jest от Facebook.

mcustiel/phiremock — Инструмент для мока HTTP-запросов и REST-сервисов для использования в приемочных тестах.

mikeerickson/phpunit-pretty-result-printer — Расширение для PHPUnit выводит результаты в красивом сгруппированном виде:

Markdown

Captcha

Поиск

teamtnt/tntsearch — Полнофункциональный движок полнотекстового поиска на PHP.

parpalak/rose — Встраиваемый поисковый движок с поддержкой русского языка.

jobbyphp/jobby — Продвинутый менеджер cron-задач.

soy-php/soy — Инструмент для запуска задач.

WebSocket

morozovsk/websocket — Простой WebSocket-сервер с поддержкой PHP 7 и интеграцией с Yii/Yii2.

ratchetphp/Pawl — Асинхронный WebSocket клиент.

Работа с почтой EMAIL

gabrielbull/omnimail — Библиотека для отправки писем с помощью популярных сервисов рассылки: AmazonSES, Mailgun, Mandrill и другие.

egulias/EmailValidator — Валидатор email-адрессов с несколькими стратегиями.

PeeHaa/mailgrab — Простой SMTP-сервер для отладки писем.

goetas-webservices/soap-client — Реализация SOAP 1.1 клиента на чистом PHP (без ext-soap).

Бекапы

sebastianfeldmann/phpbu — Инструмент для создания резервных копий файлов и баз данных. Умеет шифровать бэкапы и отправлять в хранилище (Amazon s3, Dropbox, rsync, SFTP, FTP).

WebPush

web-push-libs/web-push-php — Реализация протокола WebPush для отправки уведомлений в браузер.

Мониторинг

spatie/server-monitor-app — Монитор состояния сервера, умеет отправлять уведомления по email и в Slack.

wapmorgan/ServerAvailabilityMonitor — Утилита мониторит серверы на доступность и присылает отчеты об ошибках на почту. Поддерживает http, mysql, pgsql, memcache и redis.

Платежи

Payum/Payum — Мощная библиотека для обработки платежей. Поддерживает множество провайдеров и сценариев оплаты.

Парсинг (HTML)

https://github.com/zomberg/phpquery — PHPQuery библиотека для парсинга HTML кода через PHP

Imangazaliev/DiDOM — Простая и быстрая библиотека для парсинга HTML.

tgalopin/html-sanitizer — Библиотека для обработки, чистки и санитайзинга HTML-данных, пришедших от пользователя.

zhuravljov/yii2-queue — Очередь задач для Yii 2. Умеет работать через базу данных, Redis, RabbitMQ, Beanstalk и Gearman.

bizley/yii2-migration — Генерирует миграцию на основе текущего состояния базы и предыдущих миграций.

tunecino/angular-yii2-model — Сервис для AngularJS 1.x для использования REST API Yii 2.

vesnateam/sandstorm — Веб-интерфейс для работы с миграциями.

phundament/app — Шаблон докеризированного приложения на Yii 2.

Тестирование

vamsiikrishna/vex — Простой инструмент для тестирования нагрузки, реализованный на PHP.

paratestphp/paratest — Параллельный запуск тестов PHPUnit.

mlambley/swagception — Генерирует приемочные тесты для Codeception на основе вашей Swagger 2.0 (Open API 2.0) спецификации.

Indatus/trucker — Пакет для использования удаленных ресурсов API (обычно RESTful) как моделей в стиле ActiveResource.

webmozart/key-value-store — Библиотека предоставляет абстрактный API для работы различным key-value хранилищами.

Графы

https://github.com/koriym/print_o — Библиотека написанная на PHP для визуализации графов и связей.

algb12/GraphDS — Легковесные структуры данных и алгоритмы для работы с графами.

Интеграция

unreal4u/telegram-api — Реализация Telegram API на PHP 7 с поддержкой асинхронности.

Шелл скрипты

Сервера очередей

xobotyi/beansclient — Клиент для сервера очередей beanstald, без зависимостей и со 100% покрытием тестами.


php-enqueue/enqueue-dev — Очередь сообщений с поддержкой транспортов AMQP (RabbitMQ, ActiveMQ), STOMP, Amazon SQS, Redis, Doctrine DBAL, Filesystem, а также добавлена поддержка MongoDB.

Мастер Йода рекомендует:  Свойство position

GraphQL

railt/railt — Реализация GraphQL для PHP-приложений.

thecodingmachine/graphqlite — Еще один GraphQL фреймворк для PHP. Вводный пост с обзором в поддержку.

Программирование

samdark/hydrator — Извлечение данных и заполнение данными объектов.

biberlabs/ddd-embeddables — Коллекция объектов-значений для использования в своих приложениях.

spatie/opening-hours — Инструмент позволяет сконфигурировать рабочие часы и затем делать запросы, чтобы определить «открыто» ли в конкретную дату.

Gurukami/php-array — Хелпер для работы с многомерными массивами.

cakephp/chronos — Библиотека для работы с датой и временем на PHP. Переработанный и дополненный Carbon. Пост с описанием и примерами.

layershifter/tld-extract — Пакет для корректного парсинга доменных имен с использованием Public Suffix List.

maciejczyzewski/bottomline — Набор полезных функций на каждый день.

dunglas/phpdoc-to-typehint — Инструмент под PHP 7 для преобразования типов из PhpDoc в нативные тайпхинты.

ronanguilloux/IsoCodes — Библиотека для валидации различных стандартных кодов: Zip-коды 175 стран, телефонные номера, номера кредитных карт, ISBN, национальные идентификационные коды и другие.

DusanKasan/Knapsack — Удобная библиотека для работы с коллекциями.

gabrielrcouto/php-gui — Инструмент позволяет создавать десктопные приложения с графическим интерфейсом на PHP без необходимости устанавливать дополнительные расширения.

kelunik/acme-client — Сервис Let’s Encrypt позволяет бесплатно генерировать подтвержденные SSL-сертификаты. По ссылке PHP-клиент для Let’s Encrypt для тех кому не подходит оригинальный на Python. Пост об использовании.

niklongstone/regex-reverse — Генерирует строку на основе регулярного выражения.

thephpleague/route 2.0 — Популярный роутер на основе FastRoute. Теперь с поддержкой PSR-7.

domnikl/statsd-php — PHP-клиент для передачи статистики в statsd.

jakubkulhan/bunny — Простая и быстрая реализация клиента AMQP (RabbitMQ) с синхронным и асинхронным (ReactPHP) режимами.

JBZoo/Utils — Хелперы на каждый день.

niutech/node.php — Инструмент позволяет запускать node.js приложение из PHP даже на обычном хостинге.

sebastianfeldmann/phpbu — Инструмент для управления бэкапами БД и файлов.

Alroniks/dtms — Расширение класса DateTime для работы с микросекундами в PHP. Прислал iklimchuk.

sebastianbergmann/object-graph — Позволяет выводить граф объектов PHP.

formapro/pvm — Мощная библиотека для описания бизнес-процессов, например BPMN.

makasim/yadm — Эффективная библиотека для работы с MongoDB в PHP. Очень быстрое сохранение и гидрация.

rybakit/msgpack.php — Сериализация в MessagePack на чистом PHP.

spatie/crawler — Мощный краулер на базе Guzzle, а также Chrome и Puppeteer для рендеринга JavaScript-сайтов.

nesk/rialto — Инструмент для управления ресурсами Node.js из PHP. Может быть использован для реализации взаимодействия с Node.js библиотеками.

nette/utils — Набор полезных функций на каждый день

cyrus-and/fracker — Инструмент позволяет в удобном виде отслеживать вызовы функций в PHP и будет полезен для исследователей безопасности.

Понравился пост? Поделитесь ссылкой с друзьями, они оценят:

Комментарии

О моем блоге

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

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

Последние публикации

© 2014 — 2020 — Блог программиста.
При перепечаке матералов сайта активная гиперссылка на сайт обязательна.

Парсинг сайта с помощью CURL и phpQuery на PHP

Сегодня я расскажу про то, как парсить сайт спомощью библиотеки php CURL и библиотеки phpQuery.

phpQuery — это аналог jQuery, только на PHP. Все методы, которые есть в jQuery, должны присутствовать и этой библиотеке. Это удобно тем, что можно легко перемещаться по DOM дереву html документа и с легкостью находить нужные элементы.

Первым делом нам нужно получить html содержимое нужной страницы сайта для парсинга. Можно сделать это несколькими способами. Первый, самый простой — это использовать функцию file_get_content, указав url страницы в качестве параметра:

Так же, в эту функцию есть возможность добавлять заголовки и т. д, с помощью использования потоковых контекстов:

Чтобы этот способ работал, опция allow_url_fopen в php.ini должна быть включена.

Так же получить содержимое web сайта можно с помощью сокетов (pfsockopen), но проще воспользоваться библиотекой php CURL, если она установлена на вашем сервере. Ниже я продемонстрирую, как получить содержимое страницы сайта с помощью библиотеки CURL.

Получение http страницы без параметров через CURL

Получение http страницы с get параметрами:

Получение web страницы по протоколу https:

Получение http страницы, которая загружается через редиректы (следование 302):

Отправка POST запроса с помощью CURL:

Включаем куки в CURL запросе (нужно при парсинге личных кабинетов):

Включить в запросе GZIP сжатие (нужно, если тело ответа приходит в виде непонятного набора текста, то есть сервер отправляет сжатый gzip’ом текст):

Вывести заголовки ответа от сервера. Часто нужно для отладки, если сервер не присылает правильного тела ответа или не присылает его вообще:

Хочу отметить, что самым важными параметрами при парсинге являются:

Стоит отметить, что все эти параметры (кроме первого) следует добавлять при необходимости. Поэксперементируйте с этими параметрами, если у вас не будет получаться без них. Так же не забывайте про параметр «CURLOPT_HEADER», он вам поможет при поиске проблемы.

Итак, что делать, если http страница получена через CURL, или каким-либо другим способом? Самое время воспользоваться phpQuery для парсинга полученного результата. Скачать библиотеку можно здесь.

Как мы видим phpQuery — это полный аналог jQuery.

Чтобы ознакомиться с полным наборов функций phpQuery, нужно зайти как ни странно, в документацию jQuery. Главная фишка phpQuery, как и jQuery — это использование css селекторов, это упрощает процедуру парсинга нужных элементов страницы в разы. Посмотреть методы и селекторы jQuery можно здесь.

Конечно, есть другие способы парсинга полученной с помощью php curl страницы, но парсинг при помощи phpQuery для меня наиболее удобен и эффективен.

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

Hi! Примерно 2 года назад я столкнулся с задачей парсинга большого количества сайтов. Предстояло хранить настройки в БД(MySQL). Классическими методами и библиотеками было неудобно по различным причинам (неповоротливость, слишком много кода для получения конечного результата и прочее) и поэтому решил написать свою библиотеку на php parserSites.

Основное преимущество parserSites – с помощью одного доступного метода вы можете добраться до нужного блока, обработать его как захотите и вывести в переменную. Для меня это был выход из ситуации.

Библиотека состоит из:

1) Методов для настройки cUrl
2) Методов для обработки данных

Методы для настройки cUrl:

Методы для обработки данных

Для примера приведу страницу с содержанием:

В переменную нужно получить ‘+79258324835’, а также ссылку на персональную страницу. Как это сделать с помощью библиотеки?

Метод lego получает входные данные и цепочку методов с параметрами, которые обрабатывают данные шаг за шагом. То есть последующий метод работает с результатом предыдущего.

метод1(#)параметр1|#| метод2(#)параметр1|#| метод3(#)параметр1(#)параметр2
Таблица методов с их параметрами.

Парсер на PHP с записью контента в БД

Нескольким читателям моего блога было интересно узнать «как объединить крон, базу данных и php парсер». Я постарался написать максимально простой и лаконичный скрипт, чтобы любой новичок смог в нём разобраться. Он состоит всего из одного файла index.php и 50 строк кода.

Я использовал 2 библиотеки:

  • RedBean PHP, которая упрощает работу с БД и защищает от SQL инъекций ->читать подробнее
  • phpQuery — порт jQuery на PHP, который позволяет добираться до нужных блоков в дебрях документа

Парсить в учебных целях мы будем один сайт о моде и красоте. Остановимся мы только на парсинге 10 статей, чтобы понять суть.

А вот и сам скрипт — файл index.php

Соединение с БД — файл db.php

Если мы запустим парсер, то в базе данных автоматически появятся 2 таблички. В таблице postprev запишется информация о превью статей (картинка, заголовок, небольшой текст и ссылка на сам пост). В таблицу post запишется уже полная информация о статьях.

Парсинг сайтов. Библиотека phpQuery. Урок 3

Дата публикации: 2020-09-07

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

В видеоверсии урока вы найдете подробное комментирование создаваемой функции. Здесь же я приведу итоговый код урока:

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Как видим, функция parser() получаем и парсит контент заданной страницы. Затем она проверяет, есть ли следующая страница для парсинга и, если таковая есть, функция рекурсивно вызывает себя, передавая параметром новый адрес.

Количество страниц, которые необходимо спарсить, задается в параметре $end. Все достаточно просто. На этом текущий урок завершен. Удачи!

Разработка веб-приложения на PHP

Создайте веб-приложение на PHP на примере приема платежей на сайте

Похожие статьи:


Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (4)

Подскажите пожалуйста как тут вытащить пагинацию?
У меня почему то идет по кругу одна и та же страница.

Задайте лучше Ваш вопрос на форуме, здесь код ломается и не понять суть проблемы.

Меня зовут Фомичев Георгий.
Я являюсь основателем Endurance. Мы делаем роботов и чатботов.

Мне интересна тема парсинга сайта с целью получения той информации, которая нам нужна.
Скажите пожалуйста, есть ли у Вас API?
для нашего бота:
old.endurancerobots.com/pogovorite-s-nashim-chatbotom

В идеале мы хотели бы
передавать Вам запрос HTTP / JSON, например, «что такое квант»
и передавать ссылку «https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%BD%D1%82 »

и получать обратно текстовые блоки где найдена та или иная информация (в идеале с учетом синонимов)
Также вопрос, есть ли какие либо дополнительные параметры, которые можно вводить и регулировать при парсинге?

Мастер Йода рекомендует:  Применение PHP Методы на стороне сервера, которые помогут вам в разработке интерфейсов PHP

С Уважением, Фомичев Георгий
Основатель Endurance
+79162254302

PROG-TIME

Парсинг PHP

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

Где скачать?!

Скачиваете последнюю версию и добавляете файлы в свой проект. После этого вам нужно подключить библиотеку к вашему проекту, для этого прописываем request и путь к файлу phpQuery/phpQuery/phpQuery.php

Основы работы с библиотекой PHPQuery

Тот кто раньше работал с библиотекой jQuery, без труда сможет разобраться с phpQuery.

Мы будем использовать phpQuery в связке с CURL.

Прописываем базовый код для CURL и записываем результат в переменную(в моем случае это $result ).

После, прописываем $pq = phpQuery:: newDocument ($result); , здесь создается объект в котором находится весь код страницы и в этом объекте мы будем искать нужный нам элемент. Далее прописываем код поиска элементов.

Элемент можно найти на тегу элемента, классу элемента или идентификатору элемента.

По тегу – $elem = $pq->find(‘тег’);

По идентификатору – $elem = $pq->find(‘#имя_идентификатора’);

По классу – $elem = $pq->find(‘.имя_класса’);

Для примера я буду искать контейнер в коде главной страницы на моем сайте в котором находится название сайта. Класс site-title .

Далее прописываем код, который заберёт HTML код из найденного элемента.

Полный код запроса выглядит так:

Методы для выборки:

find – для поиска элементов в дереве DOM
html – возвращает строку. Получает HTML-содержимое первого элемента в наборе.
text – получает текст выбранного элемента в наборе. Если таких элементов несколько, получит содержимое всех элементов, разделенные пробелом

Обычно для выборки используют только несколько методов, но phpQuery позволяет использовать все методы аналогичные jQuery.

Хочешь научиться программировать?!

Заходи в нашу группу Вконтакте, там много полезной и интересной информации

Парсинг и обработка HTML на PHP?

Я предпочитаю работать со встроенными XML-объектами, такими как DOM и XML Reader .

Если Вы хотите воспользоваться внешними библиотеками, я советую использовать только те из них, которые не просто парсят строки, а работают из структурой DOM/libxml (SimpleHtmlDom к ним не относится, не советую Вам эту библиотеку). Вот список рекомендуемых мною:

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

Последнее, что я бы Вам порекомендовал (то есть крайне не рекомендовал бы!), это извлекать данные из HTML с помощью регулярных выражений. Коротко говоря, они совсем не предназначены для этой цели. И хотя в интернете полно примеров разбора HTML регулярными выражениями, эти примеры зачастую подходят только для частного случая. Немного поменяется разметка — и регулярка не сработает. А написать универсальное регулярное выражение — ой как не просто.

Парсинг web-страниц на php

less than 1 minute read

В этом нелегком деле нам поможет PHP Simple HTML DOM Parser.

Самая последняя версия доступна на sourceforge.net.

На сегодняшний день последней является версия 1.5. Её и будем скачивать:

Скачали, распаковываем в папку, которая доступна по вэбу, допустим /var/www/html/webparser :

Исходя из примера на странице парсера при вызове файла со следующим содержанием будут выведены все объекты img на главной странице mysite.com

При вызове файла со следующим содержанием будут выведены все сслыки с главной страницы сайта mysite.com

Даже не пробуйте делать var_dump($element) , поскольку это приведет в зависанию вашего компьютера и/или сервера, на котором Вы развернули парсер.

Вооружившись тестовыми данными я решил попарсить песочницу хабра. Следующий код выведет первые десять постов:

20 крутых PHP-библиотек на начало 2020

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

Если мы не включили в этот список какую-то новую библиотеку, которая вам нравится, поделитесь ею в коментариях 🙂

Requests for PHP

Эта библиотека, у которой нет зависимостей, позволяет отправлять HTTP запросы. Она предоставляет методы для добавления заголовков, обращения к данным ответа, обработки форм и всего остального, что вам может понадобиться. Все это аккуратно собрано в чистый и простой для использования API.

Rinvex Country

Rinvex Country — это PHP-пакет, который позволяет разработчикам получать детальную информацию о странах со всего мира. Имея под рукой больше 50 методов, вы можете узнать площадь Анголы, валюту Кипра, самоназвание Намибии или даже имя Финлядии, используемое в FIFA. Есть куча доступной информации, причем источники вполне надежны.

Botman

Это PHP-библиотека для разработки ботов для мессенджеров. Работает с самыми популярными платформами сообщений, а именно Facebook Messenger, Slack, Telegram, WeChat и другими. Также имеется готовый шаблон проекта на Laravel.

Charts

Этот пакет для Laravel позволяет генерировать настраиваемые графики из различных наборов данных. Он работает как PHP-обертка для нескольких встроенных JavaScript-библиотек графиков, предоставляя возможность создать всевозможные диаграммы, измерители, полосы загрузки, используя один единственный инструмент.

Swap позволяет получить курсы валют из различных сервисов, таких как Fixer, Google и Yahoo. Ответы на запросы могут быть без проблем закэшированы и получены позднее. Эта библиотека также доступна в виде пакета Laravel.

Math PHP

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

PHPUnit

PHPUnit — это продвинутый фреймворк для тестирования, который дает возможность командам разработчиков тщательно тестировать свой код. Unit-тесты написаны в виде объектно-ориентированных standalone классов с помощью многочисленных методов для обработки значений, зависимостей и т.д. Также предоставляется простой консольный интерфейс для запуска тестов и вывода отчетов.

Atoum

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

Simple Regex Language

PHP-реализация Simple Regex Language — более понятного для человека языка для написания регулярных выражений. Библиотека имеет множество методов, которые могут быть вызваны цепочкой, формирующие читабельные и понятные RegEx-правила. У этой библиотеки также есть реализации на JavaScript и Python.

Stash

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

PHP VCR

Аналог популярной библиотеки на Ruby для тестирования взаимодействия с HTTP. PHP VCR записывает HTTP-запросы и хранит их в «кассетах», которые могут быть воспроизведены позже. Также доступен набор средств для тестирования, делая возможным детальное инспектирование и сравнение записей.

OAuth 2.0 Server

Эта библиотека дает возможность без проблем настроить OAuth 2.0 сервер и установить все уровни аутентификации необходимые для защиты вашего API. Она полностью соответствует стандартам и поддерживает все права, определенные в протоколе OAuth. Кстати, Laravel Passport разработан на основе OAuth 2.0 Server.

Imagine

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

Очень простой и легкий для понимания скелет PHP-приложения, содержащий только самые основные функции, необходимые для каждого проекта. Этот пакет не претендует на то, чтобы быть фреймворком, который может все, наподобие Laravel, но благодаря своей простоте, MINI может быть использован для создания менее сложных приложений в кратчайшие сроки.

AWS SDK

Официальная библиотека для работы с веб-сервисами Amazon (AWS). SDK позволяет подключиться к AWS любому проекту на PHP и подключиться ко всем доступным сервисам. Также есть обертка для Laravel, которую можно найти здесь.

Легковесная библиотека для работы с URL. C Purl вы можете получать данные из URL-адресов, манипулировать запросами, проверять строки на соответствие URL и многое другое.

Daux.io

Генаратор сайтов документаций, на основе структуры папок и Markdown-файлов. Daux.io включает подсветку синтаксиса, 4 темы оформления, навигацию с ЧПУ и многое другое.

Dompdf

Dompdf — это генератор PDF, который использует обычную разметку HTML и конвертирует ее в .pdf файлы. Эта библиотека понимает большинство CSS-правил, которые могут быть встроены прямо в разметку или подключаться из стороннего файла.

// указываем неймспейс use Dompdf\Dompdf;

// создаем объект и передаем разметку $dompdf = new Dompdf(); $dompdf->loadHtml(‘hello world’);

// (Не обязательно) Устанавливаем размер листа и ориентацию $dompdf->setPaper(‘A4’, ‘landscape’);

// Сгенерировать PDF $dompdf->render();

// Вывести сгенерированный результат в браузер $dompdf->stream();

Instaphp

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

Latitude

Библиотека без зависимостей для создания SQL-запросов с помощью методов, которые могут быть вызваны цепочкой. Она поддерживает большинство типов запросов и работает с MySQL, Postgres, SQL Server и другими базами данных. Также есть хелперы для экранирования символов, что позоволяет избежать SQL-инъекции.

Добавить комментарий