Статьи

Мощные пользовательские объекты с PHP-клиентом Diffbot

Некоторое время назад мы рассматривали Diffbot , ИИ машинного обучения для обработки веб-страниц, как средство для извлечения портфолио авторов SitePoint . В этом руководстве основное внимание уделялось использованию только интерфейса Diffbot, и использование созданного API повлекло бы за собой проверку связи конечной точки API вручную. Кроме того, с тех пор дизайн страниц, которые мы обработали, изменился, и поэтому API больше не работает надежно.

В этом уроке, помимо перестройки API, чтобы он снова работал, мы будем использовать официальный клиент Diffbot для создания пользовательских сущностей, которые соответствуют данным, которые мы ищем (портфолио авторов).

Diffbot logo

Бутстрапирование

Мы будем использовать Homestead Improved как обычно. Следующие несколько команд загрузят окно Vagrant, создадут папку проекта и установят клиент Diffbot.

git clone https : //github.com/swader/homestead_improved hi_diffbot_authorfolio; cd hi_diffbot_authorfolio 
 ./ bin / folderfix . sh vagrant up ; vagrant ssh mkdir - p Code / Project / public ; cd Code / Project ; touch public / index . php composer require swader / diffbot - php - client 

Кроме того, мы можем установить vardumper Symfony как требование к разработке, просто чтобы получить более хорошие результаты отладки.

 composer require  symfony / var - dumper -- dev 

Если мы теперь передадим index.php следующий контент, при условии, что мы добавили homestead.app в файл /etc/hosts нашего хост-компьютера, мы должны увидеть «Hello world», если мы посетим http://homestead.app в нашем браузере:

 <? php // index.php 

 require   '../vendor/autoload.php' ; echo "Hello World" ; 

Инициализация Diffbot

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

 define ( 'TOKEN' ,   'token' ); 
 use   Swader \Diffbot\Diffbot ; $d =   new   Diffbot ( TOKEN ); 

Это все, что нам нужно для инициации Diffbot. Давайте проверим это на примере статьи.

 

Пользовательский API

Во-первых, нам нужно перестроить наш API из последнего поста , чтобы он снова мог работать. Мы делаем это, войдя в панель разработчика и перейдя на https://www.diffbot.com/dev/customize/ .

Давайте создадим новый API:

API creation screenshot

После ввода примера URL-адреса, например www.sitepoint.com/author/bskvorc/ , мы можем добавить несколько настраиваемых полей, например author :

Author field creation

Мы можем использовать этот же подход для определения таких полей, как bio и nextPage , чтобы активировать автоматическую нумерацию страниц Diffbot:

Next page field creation

Нам также нужно определить коллекцию, которая будет собирать все карточки статей и обрабатывать их. Создание коллекции влечет за собой выбор элемента, селектор которого повторяется несколько раз. В нашем случае это элемент li класса .article-list .

Defining a new collection

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

Defining fields inside the collection

Primary category field definition

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

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

 http : //api.diffbot.com/v3/diffpoint?token=token&url=http://www.sitepoint.com/author/bskvorc/ 

Diffpoint custom API result

Мы видим, что API успешно нашел все страницы в наборе и вернул даже самые старые сообщения.

Расширение клиента

Давайте посмотрим, будет ли пользовательский API работать так, как ожидается.

 echo $d -> createCustomAPI ( 'http://www.sitepoint.com/author/bskvorc' ,   'diffpoint' )-> call ()-> getBio (); 

Это должно отражать правильную биографию.

Этот шаг, в некотором смысле, необязательный. Мы могли бы использовать возвращенные данные как есть, и просто перебирать ключи и массивы, но давайте представим, что наши данные намного сложнее, чем простая страница портфолио, и сделаем это правильно, независимо от того.

Нам нужны два новых класса: фабрика сущностей и сущность. Давайте создадим их в /src/AuthorFolio.php и src/CustomFactory.php относительно корня нашего проекта ( src находится в корневой папке).

AuthorFolio

Давайте начнем с новой сущности. Согласно документации , у нас есть абстрактный класс, который мы можем расширить.

 <? php // src/AuthorFolio.php 

 namespace   My \Custom ; 

 use   Swader \Diffbot\Abstracts\Entity ; 

 class   AuthorFolio   extends   Entity 
 { 

 } 

Мы расширяем абстрактную сущность и даем нашей новой сущности свое собственное пространство имен. Это необязательно, но полезно. На этом этапе объект уже можно было бы использовать — он по существу идентичен объекту с подстановочными знаками, который использует магические методы для разрешения запросов на различные свойства возвращаемых данных (именно поэтому метод getBio в приведенном выше примере работал без необходимости определять что-нибудь). Но цель состоит в том, чтобы получить подробный класс AuthorFolio с поддержкой пользовательских, специфичных для SitePoint данных и, возможно, некоторых быстрых методов. Давайте сделаем это сейчас.

API вернет полный список статей автора, но не их количество. Чтобы узнать, сколько постов имеет автор, нам нужно count свойство article, поэтому давайте обернем этот процесс в ярлык. Мы также можем сообщить PHPStorm, что у класса будет свойство article, использующее тег @property , поэтому он перестает жаловаться на доступ к полю магическими методами:

 <? php // src/AuthorFolio.php 

 namespace   My \Custom ; 

 use   Swader \Diffbot\Abstracts\Entity ; 

 /** * Class AuthorFolio * @property array articles * @package My\Custom */ 
 class   AuthorFolio   extends   Entity 
 { 
     public   function  getType () 
     { 
         return   'authorfolio' ; 
     } 

     public   function  getNumPosts () 
     { 
         return  count ( $this -> articles ); 
     } 
 } 

Другими методами, которые мы могли бы определить, являются totalLikes , activeSince , favoredCategory и т. Д.

CustomFactory

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

 <? php // src/CustomFactory.php 

 namespace   My \Custom ; 

 use   Swader \Diffbot\Factory\Entity ; 

 class   CustomFactory   extends   Entity 
 { 
     public   function  __construct () 
     { $this -> apiEntities =  array_merge ( $this -> apiEntities , 
             [ 'diffpoint'   =>   '\My\Custom\AuthorFolio' ] 
         ); 
     } 
 } 

Мы объединили исходный список API-сущностей с нашей собственной пользовательской привязкой, тем самым сказав классу Factory, чтобы он следил как за стандартными типами и API, так и за нашими новыми. Это означает, что мы можем продолжать использовать эту фабрику для API-интерфейсов Diffbot по умолчанию.

Подключить фабрику

Чтобы сделать наши классы автоматически загружаемыми, мы, вероятно, должны добавить их в composer.json :

    "autoload" :   { 
     "psr-4" :   { 
       "My\\Custom\\" :   "src" 
     } 
   } 

Мы активируем эти новые сопоставления автозагрузки, запустив composer dump-autoload .

Далее мы создаем новую фабрику, подключаем ее к нашему экземпляру Diffbot и тестируем API:

 $d =   new   Diffbot ( TOKEN ); $d -> setEntityFactory ( new   My \Custom\CustomFactory ()); $api =  $d -> createCustomAPI ( 'http://www.sitepoint.com/author/bskvorc' ,   'diffpoint' ); $api -> setTimeout ( 120000 ); $result =  $api -> call (); 

 dump ( $result -> getNumPosts ()); 

Result image

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

Вывод

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

Хотя это был довольно простой пример, нетрудно представить сложные варианты использования для более сложных сущностей, или, возможно, несколько из них распределены по нескольким API, причем все они обрабатываются одним EntityFactory, причем каждый пользовательский API соответствует особому типу Entity. С хорошо обученной визуальной нейронной сетью единственным пределом обработки является воображение.

Если вы хотите узнать больше о клиенте Diffbot, ознакомьтесь с полной документацией и поэкспериментируйте с самим собой — просто не забудьте получить свежий бесплатный двухнедельный демо-токен!