「webサイトから欲しい情報だけを集めたい」そんなことはありませんか?
「スクレイピング」という技術を使うことによって、カンタンにwebサイトから欲しい情報を取得することが出来ます。
#スクレイピングとは
WebサイトからWebページのHTMLデータを収集して、特定のデータを抽出、整形し直すことである。
引用:IT用語辞典
今回は**「phpQuery」**を使ってスクレイピングを実装します。
名前の通りで、phpを使います。
#phpQueryの導入方法
公式サイトからzipファイルをダウンロードします。
解凍したら中にある「phpQuery-onefile.php」をお好きなところに配置してください。
今回は、わかりやすくルートに配置しました。
root/
├ index.php
└ phpQuery-onefile.php
それでは、Wikipediaの「ウェブスクレイピング」ページより、見出し要素の「ウェブスクレイピング」を取得したいと思います。
コピペしやすい様に、スクレイピングに必要な3行を先に記載します。
<?php
require_once("./phpQuery-onefile.php");
$html = file_get_contents("https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0");
echo phpQuery::newDocument($html)->find("h1")->text();
?>
##1行目 phpQueryを読み込む
<?php
require_once("./phpQuery-onefile.php");
?>
「phpQuery-onefile.php」のパスを指定してください。
ルートに配置しているなら、コピペでOKです。
require_once:外部ファイルを一度だけ読み込む
##2行目 取得したいwebサイトを読み込む
<?php
$html = file_get_contents("https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0");
?>
URLを[file_get_contents("")]の中に貼り付けます。
次に、適当な変数を用意して、代入します。
これで、サイト全体の情報が$htmlに格納されました。
##3行目 見出し要素を取得、表示
<?php
echo phpQuery::newDocument($html)->find("h1")->text();
?>
$htmlの中にサイトの情報が沢山詰まっています。
欲しい部分をピックアップして、出力してみましょう。
見出しの「スクレイピング」は<h1>要素なので、上記の様に指定します。
表示結果
ウェブスクレイピング
簡単にスクレイピング出来ましたね。
ちなみに「->text()」を外すと、htmlとして出力されます。
#おまけ
##深い階層にある場合はどうするの?
例えばWikipediaの「ウェブスクレイピング」ページより、目次の5番目を取得したい場合はどうすれば良いのでしょうか。
先ほどと同じ感覚で、
<?php
echo phpQuery::newDocument($html)->find("li")->text();
?>
と指定してしまうと、ページ内全ての<li>を取得してしまいます。
このような場合は、「->find()」を複数連結させて必要な情報を探します。
目次の5番目は、
<div class="toc">
↓
<ul>
↓
<li>
↓
<li>の5番目
このような順番で探し当てます。
Chromeのデベロッパーツールなどで、ソース部分を確認して見てください。
windowsなら、F12
MACなら、command + option + i
で開ます。
これをコードにすると
<?php
echo phpQuery::newDocument($html)->find(".toc")->find("ul")->find("li:eq(4)")->text();
?>
こんな感じです。
表示結果
5 脚注
**「:eq(4)」**を加えることで、4番目の要素を指定して取得できます。
(要素は0番目から始まるので、5番目が欲しい時は4を指定します。)
他にも便利なオプションがあります。
:eq() | 指定した番号の要素を取得する。 |
:odd | 奇数の要素を取得する。(※0番目から始まります) |
:gt() | 指定した番号以降の要素を取得する。 |
:lt() | 指定した番号までの要素を取得する。 |
詳しくはこちらを参考にしてください。
#最後に
webから情報を集めたいけど、どうやって調べたら良いのか分からない人向けに書きました。
その中に、スクレイピングという手段があることを知る機会になっていただけたら幸いです。