PHPでウェブスクレイピング
- 2019.05.30
- PHP
- PHP, phpQuery, ウェブスクレイピング
他サイトから取得したHTMLソースから目的のテキストなどを取り出したい時、ソースを文字列として扱うよりもDOMとして操作すると簡単に取り出せる事がわかりました。
HTMLソースの取得は別記事(PHPでサイトのソースを取得する)を参照してもらうことにして、スクレイピングについて書いていきます。
目次
サンプルコード
例えば、ページのタイトルを取得する場合
//phpQueryの読み込み require_once("./phpQuery-onefile.php"); //ソースをDOM操作可能な形に変換 $html_dom = phpQuery::newDocument( $html_source ); //スクレイピング $scraped_str = $html_dom["title"]->text(); echo( $scraped_str );
※$html_source
にHTMLソースが入っているものとします。
解説
phpQueryの読み込み
require_once("./phpQuery-onefile.php");
スクレイピングするには、「phpQuery」というライブラリを使います。
下記よりダウンロードしてrequire_once
などで読み込みます。
phpQueryのダウンロード
https://code.google.com/archive/p/phpquery/downloads
ソースをDOM操作可能な形に変換
$html_dom = phpQuery::newDocument( $html_source );
HTMLソースを「phpQuery」に渡して、変換したものを受け取っています。
スクレイピング
$scraped_str = $html_dom["title"]->text();
変換後は、要素を配列のように扱うことができます。
サンプルコードでは、title要素を取得しています。
text()
は、その要素内にあるテキストを取得する場合に使用します。
要素の指定方法
ID名で抜き出し(#menu
というIDの場合)
$scraped_str = $html_dom["#menu"]->text();
class名で抜き出し(.main
というclassの場合)
$scraped_str = $html_dom[".main"]->text();
同じclass名が複数ある場合
対象が複数ある場合はすべて取得してしまうので、class名の後に:eq(0)
とすると何番目のclassか指定できます。ちなみに1番目が0、2番目が1となります。
$scraped_str = $html_dom[".main:eq(0)"]->text();
リンク先のアドレスの取得
$scraped_str = $html_dom[".main"]->find("a")->attr("href");
または
$scraped_str = $html_dom[".main > a"]->attr('href');
画像のアドレスの取得
$scraped_str = $html_dom[".main"]->find("img")->attr("src");
複数の要素を指定
img
とa
要素の両方
$scraped_str = $html_dom["img, a"];
子要素の指定
ul
要素の中のli
要素
$scraped_str = $html_dom["ul li"];
その他
他にも様々な指定方法があるようです。
-
前の記事
PHPでサイトのHTMLソースを取得する 2019.05.30
-
次の記事
【PHP】includeしたプログラム等をすぐに出力させないでバッファリングしておく方法(ob_start) 2019.06.04
コメントを書く