Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
139
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@dia

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

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

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
139
Help us understand the problem. What are the problem?