Yandex.API、パート1に基づいて、ロシア語のブログに人気のあるエントリの評価を書き込みます

昔々、Yandexのブログ検索で人気のあるエントリーの評価がありました。多くの人にとって、これは日刊紙です。 しかし、彼らはYandexそれを閉じ 、誰もが人気のあるブログエントリの独自の評価を行うことができるようにAPIを提供することにしました。 PHPで記述します。





そのため、開始するには、Blog Search Statistics APIをご覧ください。



ここではすべてが簡単です。過去24時間のブログエントリ統計のRSSフィードがあり、50エントリのページに分割されています。



最初のページには、最新のエントリが表示されます。 取得する必要があるページ番号は、APIにアクセスするURLアドレスのパラメーターp = <ページ番号>によって設定されます(例: http : //blogs.yandex.ru/entriesapi? p=1)。



上記のリンクをたどって、このページのソースコードを確認してください(FireFox / Opera / Chromeがある場合は、 [ 表示 ]- > [ソースを表示 ]またはCtrl + U )。 PHPを使用して読み取り、解析する通常のXMLドキュメントが表示されます。 <item>タグ内のエントリに関する情報に興味があります。 ネストされた要素の名前はそれ自身を表しています。これは次のとおりです。



さて、私たちはそのようなメモを読むことを学びました。次に、スクリプトを教えてそれらを読むようにしましょう。



最初に、XMLを操作するためのツールを決定する必要があります。 PHPマニュアルには、 XML操作の非常に大きなセクションがあり、XMLドキュメントを操作するためのさまざまなツールを見つけることができます。 最も単純で、最も便利であると同時に強力なソリューションの1つは、 SimpleXML拡張機能です。これは、バージョン5以降のPHPに付属し、デフォルトで有効になっています。 彼と一緒に働きます。 私を信じて、これは本当にあなたがXML文書を簡単かつ便利に操作できる非常に優れたツールです。 これを実演します。

$xml = simplexml_load_file('http://blogs.yandex.ru/entriesapi');

echo '<b> :</b> ',

$xml->channel->title, '<br>',

'<b> :</b> ',

$xml->channel->item[0]->title, '<br>',

'<b> : </b> ',

$xml->channel->item[0]->pubDate;







ここではすべてが明確だと思います:最初の行では、人気のあるレコードのテープの最初のページを変数$ xmlにロードします(simplexml_load_file関数はSimpleXMLElementクラスのインスタンスを返します)。これを実際にXMLドキュメントに対応するオブジェクトとしてさらに解釈できます。



そのようなオブジェクトの任意のフィールドを参照する場合、要求されたフィールドの名前に対応する名前を持つXMLツリーの子要素に対して検索が実行され、そのような要素が見つかると、オブジェクトが返されます。これはSimpleXMLElementクラスのインスタンス、またはそのようなオブジェクトの配列でもあります



この作業ロジックのおかげで、次の形式のクエリチェーンを実行できます。$ xml-> someElement-> children-> childrenOfChildren。



XMLドキュメントには多くのitem要素があるため、$ xml-> channel-> itemは1つのオブジェクトではなく、これらの要素へのアクセスを提供するオブジェクトの配列を返します。 この例では、インデックス[0]によってドキュメントの最初のitem要素に目を向け、そのタイトルと公開日を画面(ブラウザ)に表示しました。



SimpleXMLでXMLドキュメントの目的のブランチを取得する別の方法は、XMLツリー要素のクエリ言語であるXPathを使用することです。 SimpleXMLElementクラスにはこのためのxpath(string $ path)メソッドがあり、エラーの場合にSimpleXMLElementまたはFALSEクラスのインスタンスの配列を返します。



XPathの例:



$items=$xml->xpath('channel/item');







XPathを使用せずに同様の要素セットを取得するには、以下を実行する必要があります。



$items=$xml->channel->item;







XPathの使用またはフィールド呼び出しのチェーン化は好みの問題です。このケースでは、XPathを使用してyablogs:linksタイプの要素を参照します。ここでは、「:」記号があります。これらの要素をPHPのオブジェクトのフィールドとして解釈することは困難です。



さて、もう何かをしましょう。 たとえば、24時間ですべてのレコードに関する情報を受け取る関数。 実際、ここに:





  1. define( 'MAX_PAGES'、200);
  2. function load_all(){
  3. $ all_items = array();
  4. for($ i = 1; true; $ i ++){
  5. $ xml = simplexml_load_file( 'http://blogs.yandex.ru/entriesapi?p='。$ i);
  6. $ items = $ xml-> xpath( 'channel / item');
  7. if(empty($ items)){
  8. 休憩;
  9. }
  10. $ all_items = array_merge($ all_items、$ items);
  11. if($ i> = MAX_PAGES)break;
  12. }
  13. return all_items;
  14. }




もちろん、このような関数は非常に遅く動作し、PHPスクリプトの実行時間の制限に遭遇する可能性が最も高くなります:デフォルトでは30秒です。したがって、受信したデータはキャッシュする必要があり、その受信はページを開いたときではなく、crontabタスクスケジューラーを介して実行する必要があります。 受信した情報をデータベースに保存し、MySQLを使用しますが、その詳細については次のパートで説明しますが、ここではXMLの操作に戻りましょう。



このレッスンでは、ロシア語のブログで人気のあるエントリの評価を収集し、最小限の機能とキャッシングを延期し、機能を拡張し、OOPとMVCをコードに提供します。



load_all()関数の結果を長く退屈しないように、制限を設定しましょう。Yandexが発行したRSSフィードの最初の4ページのみを処理します。 特にこのために、定数MAX_PAGESを導入しました。最初の行の値200を4に置き換えます。



評価では、コメント数、リンク数、訪問数でエントリを並べ替えることができます。 レコードのリストを取得できる関数が既にあります。 したがって、タスクはこのリストをソートすることです。



タスクスケジューラを介して呼び出されるスクリプトを使用してデータベース内のすべてのレコードに関する情報を入力し、ユーザーに情報を提供する場合、データベースから情報を取得し、SQL機能を使用して並べ替えを行いますが、レッスンの後半でこれを行います。次に、PHPを使用して簡単なソートを行います。



標準のPHP usort関数はこれに役立ち、関数を使用して配列要素を比較することで配列を並べ替えることができます。



配列の要素はSimpleXMLElementクラスのインスタンスであり、<item>ツリーのXML要素によって初期化されます。



たとえば、投稿内のコメント数を取得する方法を検討してください。

  1. $ xml = simplexml_load_file( 'http://blogs.yandex.ru/entriesapi');
  2. $ item = $ xml-> channel-> item [12]; // 13番目などのXMLアイテム要素を取得します。
  3. $ comments_arr = $ item-> xpath( 'yablogs:comments'); //オブジェクトの配列を取得
  4. $ comments_obj = $ comments_arr [0]; // 1つのオブジェクトが必要です。これはわかっています
  5. $ comments =(int)$ comments_obj; //型を整数(int)にキャストして比較できるようにします




そして今、あなたは比較関数を、さらに普遍的に書くことができます。

  1. $ cmp = 'yablogs:comments'; //このパラメーターを比較し、
  2. // usortで使用する場合、比較関数の要件があります:
  3. //パラメータは2つだけで、
  4. //配列の比較された要素に対応し、
  5. //したがって、$ cmpをグローバル変数にする
  6. 関数cmp($ a、$ b)
  7. {
  8. グローバル$ cmp;
  9. $ a = $ a-> xpath($ cmp);
  10. $ b = $ b-> xpath($ cmp);
  11. $ a =(int)$ a [0];
  12. $ b =(int)$ b [0];
  13. if($ a == $ b){
  14. 0を返します。
  15. }
  16. return($ a> $ b)? -1:1;
  17. }




関数sort_byがあり、そこに配列への参照と、並べ替えに使用するXML要素に対応する文字列を渡します(比較基準)。 次に、sort_byは標準のusort関数を呼び出し、配列への参照を渡し、比較基準をグローバル変数$ cmpに割り当てます。





  1. 関数sort_by($ sort_by、$ i)
  2. {
  3. グローバル$ cmp;
  4. $ cmp = $ sort_by;
  5. usort($ i、 'cmp');
  6. }




ほぼ完了しました。たとえば、次のようにコメントの数でソートされたレコードを出力できます。

  1. $アイテム= load_all();
  2. sort_by( 'yablogs:comments'、&$ items);
  3. foreach($アイテムを$アイテムとして){
  4. $ comments = $ item-> xpath( 'yablogs:comments');
  5. $ links = $ item-> xpath( 'yablogs:links');
  6. $ visits = $ item-> xpath( 'yablogs:visits24');
  7. echo "<a href='$item-> link '> $ item-> title </a> <br>"、
  8. 「コメント:$コメント[0] <br>」、
  9. 「リンク:$リンク[0] <br>」、
  10. 「表示:$訪問[0] <hr>」;
  11. }




リストをどのように正確にソートするか、パラメータURI sort_byを渡します。これは、PHPで$ _GET ['sort_by']として使用できます。 PHPコードの開始を示す<?Phpタグの前に、さまざまな種類のソート用の3つのリンクを作成しましょう。

  1. <div style = "text-align:center;">
  2. <a href="index.php/?sort_by=comments">ほとんどのコメント</a>
  3. <a href="index.php/?sort_by=visits24">最も訪問された</a>
  4. <a href="index.php/?sort_by=links">最も多く引用されている</a>
  5. </ div>




PHPでソート基準を取得し、それに応じてすべてをソートするだけです。 これを行うには、sort_by( 'yablogs:comments'、&$ items)の行を次のように置き換えます:

  1. if(isset($ _ GET ['sort_by'])){
  2. $ crit = $ _ GET ['sort_by'];
  3. } else {
  4. $ crit = 'comments';
  5. }
  6. sort_by( 'yablogs:'。$ crit、&$ items);




最後に、CSSスタイリングを追加して、評価を改善します。

  1. <スタイル>
  2. div {padding:20px; 背景色:#EEE;}
  3. hr {境界:なし; border-bottom:1px破線の黄色;}
  4. </ style>




ここで行ったことのソースをダウンロードできます: http : //www.nayjest.ru/userfiles/yabdex.blograting.by.nayjest.zip



ご覧のとおり、すべてが非常に簡単です。



次のレッスンでは、本格的なWebサービスを作成する方法を説明します。すべてがOOPのnoshkoになり、データベース、MVCアーキテクチャ、有効なHTML、キャッシング、さらにはAJAXなどの作業が行われます(コメントで提案されています)。 。



おもしろくて役立つことを願っています 次のレッスンを見逃さないように、 Twitterでフォローしてください。 ご意見をお寄せいただき、ありがとうございます!



All Articles