APIを持たないサイトAPIを使用する方法

多くの場合、サードパーティのサイトからデータを受信するタスクがありますが、このサイトがAPIを介してこのデータを便利に受信する機能を常に提供するわけではありません。 この場合の唯一の解決策は、ページのhtmlコンテンツを解析することです。 正規表現を作成すると、cssセレクターを使用して必要なコンテンツを取得できるライブラリが表示されましたが、これは簡単にしたい難しいタスクのようです。



今日は、APIスタイルでhttpリクエストを記述し、必要な形式でサーバーの応答を解析できる小さなライブラリについてお話したいと思います。



注:他の人のデータを使用する場合は、著作権を忘れないでください。



設置



ライブラリはcomposerを介してインストールできるので、必要なことは、「sleeping-owl / apist」依存関係:「1. *」をcomposer.jsonに追加し、composer updateを呼び出すことだけです。



このライブラリはどのフレームワークにも依存しないため、任意のフレームワークで使用することも、純粋なPHPプロジェクトで使用することもできます。 Guzzleはネットワークリクエストに使用され、symfony / dom-crawlerはdomツリーの操作に使用されます。



使用する



インストール後、必要なサイトのAPIを具体化する新しいクラスの作成を開始できます。 ライブラリは、クラスを作成する方法と場所に制限を課しません。 SleepingOwl \ Apist \ Apistクラスを拡張し、ベースURLを指定する必要があります。



use SleepingOwl\Apist\Apist; class HabrApi extends Apist { protected $baseUrl = 'http://habrahabr.ru'; }
      
      





基本的な説明に必要なのはこれだけです。 次に、このクラスに必要なメソッドを追加できます。



 public function index() { return $this->get('/', [ 'title' => Apist::filter('.page_head .title')->text()->trim(), 'posts' => Apist::filter('.posts .post')->each([ 'title' => Apist::filter('h1.title a')->text(), 'link' => Apist::filter('h1.title a')->attr('href'), 'hubs' => Apist::filter('.hubs a')->each(Apist::filter('*')->text()), 'author' => [ 'username' => Apist::filter('.author a'), 'profile_link' => Apist::filter('.author a')->attr('href'), 'rating' => Apist::filter('.author .rating')->text() ] ]) ]); }
      
      





ここで、getメソッドは使用されるhttp要求のタイプであり、他のメソッドも使用できます(post、put、patch、deleteなど)。

最初のパラメーターはこのメソッドのURLであり、相対または絶対のいずれかです。

2番目のパラメーター -これは、このライブラリーを作成した理由です。 このメソッドを呼び出した結果として取得する必要がある構造を記述します。 配列または単一の値のいずれかです。 つまり、上記の方法の場合、結果は次の形式になります。



 $api = new HabrApi; $result = $api->index();
      
      





注:結果は配列型になりますが、ここでは便宜上json形式を使用しています。



 { "title": "", "posts": [ { "title": "     Shellshock ( 2)", "link": "http:\/\/habrahabr.ru\/company\/host-tracker\/blog\/240389\/", "hubs": [ "  ", " ", " " ], "author": { "username": "smiHT", "profile_link": "http:\/\/habrahabr.ru\/users\/smiHT\/", "rating": "26,9" } }, { "title": "        PentestIT", "link": "http:\/\/habrahabr.ru\/company\/pentestit\/blog\/240995\/", "hubs": [ "  PentestIT", "   IT", " " ], "author": { "username": "pentestit-team", "profile_link": "http:\/\/habrahabr.ru\/users\/pentestit-team\/", "rating": "36,4" } }, ... ] }
      
      





3番目のオプションパラメータは、追加のリクエストパラメータ、変数の取得または投稿、ダウンロードしたファイル、リクエストヘッダーなどです。 完全なリストについては、Guzzleのドキュメントをご覧ください



フィルターを作成する



これがどのように機能するかについてのいくつかの言葉:データのロード後にApist :: filter($ cssSelector)を介して作成されたすべてのオブジェクトは目的の値に置き換えられ、データを検索するセレクターだけでなく、呼び出しの文字列全体も保存します、それに適用されました。 データを読み込んだ後、彼はこれらのメソッドを見つかった要素に適用しようとします。



適用できるメソッドの種類を以下に示します(必要な順序で組み合わせることができます)。



プロジェクトWebサイトの例で使用されているHabrApi.phpデモクラスのソースは、 ここで表示できます



GitHubのソース | ドキュメントと例



UPD:バージョン1.2.0では、yamlファイルからapiを初期化する機能が追加されました。詳細はドキュメントに記載されています



All Articles