YQLが終了したため、Webページの情報を抜き出す方法を探していました。
グーグル先生に聞いてみると、phpQueryがいいとのこと。
しかも、DOM検索の指定方法が jQueryとほぼ同じ!
jQueryスキーな私にはなんとも使い勝手の良い感じでした。
注意 Webスクレイピングについて
なんでもかんでも、何時でも何度でも勝手に取得していいものではありません。
各サイトの利用規約や、サーバーへの負荷を考え行わないと大変なことになります。
下記記事などを参考にするとよいかと思います。
Webスクレイピングの注意事項一覧
https://qiita.com/nezuq/items/c5e827e1827e7cb29011
YQLについて
YQL(Yahoo Query Language)とは、Web上のリソースにアクセスできるサービスです。
このサービスを使いクロスドメイン環境でWebページの情報を取得していましたが、
2019年1月にサービスが終了することになりました。
On Jan. 3, 2019, YQL service at https://t.co/g4W9RhdMLk will be retired. YQL based services that use https://t.co/g4W9RhdMLk, including users of https://t.co/5IkUaEykdl, will no longer operate. Yahoo Weather API users see the tweet below for info about continuing your service.
— Y! Developer Network (@ydn) December 31, 2018
クロスドメイン環境でWebページの情報が取得出来なくなったため、
別の方法を探していた所、phpQueryに出会いました。
phpQueryをダウンロードする
phpQueryとは
サーバーサイドで動作する jQueryをベースにした、DOM制御用ライブラリです。
ライセンスに関してですが、下記URLから最新の情報を確認するのが正しいとは思いますが、執筆時現在(2019/09/15)では、MITライセンスと記載されています。
phpQuery
https://code.google.com/archive/p/phpquery/
ダウンロードする
公式サイトのダウンロードページからダウンロードします。
今回は ”one file release"を phpQuery-x.x.x.xxx-onefile.zip をダウンロードします。
https://code.google.com/archive/p/phpquery/downloads
指定URLからDOM情報を取得する
今回はブログのトップページを読み込み、各記事のタイトル名を取得したいと思います。
プログラム全体は以下です。
<?php
// ライブラリを読み込む
require_once("./phpQuery-onefile.php");
// 指定URLからHTMLを取得し、 phpQueryオブジェクトに変換する
$contents = file_get_contents("https://kazunori-toybox.com/blog/");
$html = phpQuery::newDocument($contents);
// クラス名「kanren」の子孫である h3 を取得
$titleList = $html->find(".kanren h3");
// 取得した h3 全てに対して処理を行う
foreach( $titleList as $title){
$t = pq($title);
echo $t->text()."<br/>";
}
?>
phpQueryライブラリを読み込む
// ライブラリを読み込む
require_once("./phpQuery-onefile.php");
ダウンロードした phpQuery を使用できるようにライブラリを読み込みます。
今回のサンプルでは phpと同じ階層に配置しています。
HTMLコンテンツを読み込み、phpQueryに変換
// 指定URLからHTMLを取得し、 phpQueryオブジェクトに変換する
$contents = file_get_contents("https://kazunori-toybox.com/blog/");
$html = phpQuery::newDocument($contents);
グーグルで調べていると、ここは一行で書かれていたり、
phpQuery::newDocument
の部分をキャッシュせずそのまま find
関数をコールしている物を見かけますね。
サンプルですからわかりやすくキャッシュしておきましょう。
指定DOMのテキストを取得する
今回は、ブログトップページから各記事のタイトルを取得するのが目的です。
デベロッパーツール を使って調べてみると
<div class="kanren">
の中に<dl>
が並んでおり、その中にある<h3>
が目的のタグであることがわかります。目的のDOMが判明したので、phpQueryオブジェクト
$html
からjQueryと同じ関数find
を呼び出し取得します。// クラス名「kanren」の子孫である h3 を取得
$titleList = $html->find(".kanren h3");
セレクタの指定方法は、以下のサイトを参考にすると良いかと思います。
phpquery - Selectors.wiki
https://code.google.com/archive/p/phpquery/wikis/Selectors.wiki
CSSセレクタのチートシート
https://webliker.info/css-selector-cheat-sheet/
jQuery日本語リファレンス
http://semooh.jp/jquery/api/selectors/
繰り返し処理
// 取得した h3 全てに対して処理を行う
foreach( $titleList as $title){
$t = pq($title);
echo $t->text()."<br/>";
}
pq($title)
とすることで、phpQueryの関数群を使用できるようにしています。jQueryでも
$(this)
のようにしますよね。一緒です。