Help us understand the problem. What is going on with this article?

【php】webサイトから、欲しい情報を3行で取得する方法

More than 1 year has passed since last update.

「webサイトから欲しい情報だけを集めたい」そんなことはありませんか?

「スクレイピング」という技術を使うことによって、カンタンにwebサイトから欲しい情報を取得することが出来ます。

スクレイピングとは

WebサイトからWebページのHTMLデータを収集して、特定のデータを抽出、整形し直すことである。

引用:IT用語辞典

今回は「phpQuery」を使ってスクレイピングを実装します。
名前の通りで、phpを使います。

phpQueryの導入方法

公式サイトからzipファイルをダウンロードします。

解凍したら中にある「phpQuery-onefile.php」をお好きなところに配置してください。
今回は、わかりやすくルートに配置しました。

root/
 ├ index.php
 └ phpQuery-onefile.php

それでは、Wikipediaの「ウェブスクレイピング」ページより、見出し要素の「ウェブスクレイピング」を取得したいと思います。
コピペしやすい様に、スクレイピングに必要な3行を先に記載します。

index.php
<?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を読み込む

index.php
<?php
  require_once("./phpQuery-onefile.php");
?>

「phpQuery-onefile.php」のパスを指定してください。
ルートに配置しているなら、コピペでOKです。

require_once:外部ファイルを一度だけ読み込む

2行目 取得したいwebサイトを読み込む

index.php
<?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行目 見出し要素を取得、表示

index.php
<?php
  echo phpQuery::newDocument($html)->find("h1")->text();
?>

$htmlの中にサイトの情報が沢山詰まっています。
欲しい部分をピックアップして、出力してみましょう。

見出しの「スクレイピング」は<h1>要素なので、上記の様に指定します。

表示結果

index.php
ウェブスクレイピング

簡単にスクレイピング出来ましたね。

ちなみに「->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();
?>

こんな感じです。

表示結果

index.php
5 脚注

「:eq(4)」を加えることで、4番目の要素を指定して取得できます。
(要素は0番目から始まるので、5番目が欲しい時は4を指定します。)

他にも便利なオプションがあります。

:eq() 指定した番号の要素を取得する。
:even 偶数の要素を取得する。(※0番目から始まります)
:odd 奇数の要素を取得する。(※0番目から始まります)
:gt() 指定した番号以降の要素を取得する。
:lt() 指定した番号までの要素を取得する。

詳しくはこちらを参考にしてください。

最後に

webから情報を集めたいけど、どうやって調べたら良いのか分からない人向けに書きました。
その中に、スクレイピングという手段があることを知る機会になっていただけたら幸いです。

a-hikkoshi
当社は、親会社である株式会社エイチームの経営理念をそのままに、引越しの比較サービス開始以降、大切にしてきた「三方よし」の理念を基本として、世の中に求められるサービスの創造を目指します。
https://hikkoshi.a-tm.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした