phpQueryを使ってスクレイピングをする方法とは【メンターが回答】

「PHPQueryでスクレイピングして時系列を取得したいのですが、取得の仕方が分かりません。」という質問にTechAcademyの現役エンジニアが解決方法を回答しています。PHPQueryとは何なのか、スクレイピングとは何か、ぜひ理解しておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

※TechAcademyに実際に寄せられた質問に現役エンジニアのメンターが回答しました。

 

田島悠介

質問に対して現役のエンジニアが回答していくシリーズだね!

大石ゆかり

今回はどういう質問でしょうか?

田島悠介

phpQueryでスクレイピングしてtableのtdを取得する方法だね!実際に回答してもらった内容を紹介するね!

大石ゆかり

お願いします!

質問

PHPのphpQueryを使ってスクレイピングを行っています。

下記のURLの時系列を取得したいのですが、取得の仕方が分かりません。

取得しようとしているページ
ヤフーファイナンス1301

 

該当のソースコード

<?php
require_once('phpQuery-onefile.php');
$url = "http://stocks.finance.yahoo.co.jp/stocks/history/?code=1301";
$html = file_get_contents($url);
$doc = phpQuery::newDocument($html);

foreach($doc['div.padT12 table.boardFin tbody tr'] as $row){
  var_dump($row); // foreachに入らないの表示されない
}

exit;
?>

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

メンターからの回答

取得しようとしているページの `table` には、実際には `tbody` 要素が無いため、以下のようにすれば取得できます。

foreach($doc['div.padT12 table.boardFin tr'] as $row){
  var_dump($row->textContent);
}

ブラウザでHTMLソースを見ると `tbody` があるように見えるのですが、これはブラウザが補っているためだと思われます。

 

phpQueryとは

phpQueryとは、jQueryで要素を取得するような書き方でWebスクレイピングができるPHPのライブラリです。

以下のURLからダウンロードすることが可能です。

https://code.google.com/archive/p/phpQuery/downloads

1ファイルにまとまっているphpQueryAllInOne.phpというファイルを使ってphpQueryの導入ができます。

以下は、サイトのtitle(タイトル)を抽出するサンプルコードです。

requireでダウンロードしたphpQueryAllInOne.phpという外部ファイルを読み込み、あとは抽出するサイトや情報を指定するだけで行うことができます。

<?php
require_once('phpQueryAllInOne.php');
$html = file_get_contents('https:◯◯◯.jp');
$dom = phpQuery::newDocument($html);
echo $dom["title"]->text()."\n";

 

スクレイピングとは

Webサイトに載っている情報を抽出する技術で、クローラーとも呼ばれます。

APIとは違い、サイト元が公式に提供している情報ではないため利用規約やルールを守って使用する必要があります。商用で使う際は特に注意が必要でしょう。

 

関連情報

https://code.google.com/archive/p/phpQuery/issues/100

 

以上、phpQueryでスクレイピングをする方法について解説しました。

TechAcademyでは、現役PHPエンジニアのメンターが質問にすぐ回答します。

他にもPHPとHTMLをまとめてコメントアウトする方法をメンターが回答しているので、合わせてご覧ください。

 

回答してくれたメンター

杉本 隆也(すぎもとたかや)

フリーランスのアプリケーションエンジニア。WebアプリやiOSアプリの受託開発をしながら、TechAcademyではPHP/Laravelコースを担当しています。

開発実績: マッチングサービス、カスタマーサービス、決済ツール、SNSアプリ、音遊びアプリなど。

 

田島悠介

phpQueryでスクレイピングしてtableのtdを取得する方法について解説したよ。

大石ゆかり

スクレイピングというのは何でしょうか?

田島悠介

Webページのソースコードなどから任意の箇所を取り出すことなんだ。

大石ゆかり

わかりました。ありがとうございます!

 

TechAcademyでは、オンラインブートキャンプPHP/Laravelコースを提供しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。