PHP スクレイピングでWebページの情報を取得する方法

投稿日:

YQLが終了したため、Webページの情報を抜き出す方法を探していました。
グーグル先生に聞いてみると、phpQueryがいいとのこと。

しかも、DOM検索の指定方法が jQueryとほぼ同じ!
jQueryスキーな私にはなんとも使い勝手の良い感じでした。

注意 Webスクレイピングについて

なんでもかんでも、何時でも何度でも勝手に取得していいものではありません。
各サイトの利用規約や、サーバーへの負荷を考え行わないと大変なことになります。

下記記事などを参考にするとよいかと思います。

Webスクレイピングの注意事項一覧
 https://qiita.com/nezuq/items/c5e827e1827e7cb29011

YQLについて

YQL(Yahoo Query Language)とは、Web上のリソースにアクセスできるサービスです。

このサービスを使いクロスドメイン環境でWebページの情報を取得していましたが、
2019年1月にサービスが終了することになりました。

クロスドメイン環境で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)のようにしますよね。一緒です。

-開発
-,

Copyright© 打ち聞かせ , 2019 All Rights Reserved Powered by STINGER.