PHPでウェブスクレイピング

他サイトから取得した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などで読み込みます。

ソースを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");

複数の要素を指定

imga要素の両方

$scraped_str = $html_dom["img, a"];

子要素の指定

ul要素の中のli要素

$scraped_str = $html_dom["ul li"];

その他

他にも様々な指定方法があるようです。

公式サイトのオプション一覧
https://code.google.com/archive/p/phpquery/wikis/Selectors.wiki