PHPでスクレイピング&本文抽出をする方法・ライブラリ

引用する記事のタイトル&本文の抜粋を取得したい!

ということで、PHPスクレイピング&本文抽出する方法を調べてみました。

[amazonjs asin=“4839956472” locale=“JP” title=“実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック”]

本文抽出に使用するライブラリ

いろいろと選択肢はあったのですが、今回はfivefilters.orgPHP Readabilityを使ってみることにしました。

BitBucketのPHP Readabilityのレポジトリのものより、同じfivefilters.orgのFull-Text RSSレポジトリに使われているPHP Readabilityのほうが新しいっぽいのでこっちを使います。

ちなみにFull-Text RSS最新版のダウンロードは有償ですが、古いバージョンは無料で利用できます。また、APIの提供などもされているようなので気になる人は公式サイトをチェックしてみてください。

git cloneして、libraries / readability を好きなディレクトリに移動します。

$ git clone https://bitbucket.org/fivefilters/full-text-rss.git

PHP Readabilityの使い方

PHP Readabilityの使い方は簡単で、Readability.phpをrequireしてnew Readability($html, $url)とするだけです。


require_once '/PathToLibrary/readability/Readability.php';

//取得する記事URLを指定
$url = 'http://web-tsukuru.com/270';

//URLからHTMLを取得してUTF8にエンコーディング
$html = file_get_contents($url);
$html = mb_convert_encoding($html, "UTF-8", "ASCII,JIS,UTF-8,EUC-JP,SJIS" );

//tidy_parse_stringが使用可能であれば、
//tidy::cleanRepairでHTMLの誤りなどを修正
if (function_exists('tidy_parse_string')) {
  $tidy = tidy_parse_string($html, array(), 'UTF8');
  $tidy->cleanRepair();
  $html = $tidy->value;
}

//Readabilityを初期化
$readability = new Readability($html, $url);
$result = $readability->init();

if ( empty($result) ) return false;

//タイトルを取得
$title =  $readability->getTitle()->textContent;

//記事本文を取得
$content = $readability->getContent()->innerHTML;

//再度、tidy_parse_stringを使用
if (function_exists('tidy_parse_string')) {
  $tidy = tidy_parse_string($content, array('indent'=>true, 'show-body-only' => true), 'UTF8');
  $tidy->cleanRepair();
  $content = $tidy->value;
}

タイトルの取得は、

$title =  $readability->getTitle()->textContent;

記事本文の取得は、

$content = $readability->getContent()->innerHTML;

のようにできます。

記事本文はHTMLをそのまま取得しているので、strip_tags()などでHTMLを除去すると良さそうです。

そのほかのPHPで本文抽出する方法

有名なReadabilityは本文抽出に使えるAPIを非商用で提供しているみたいです。APIだと提供終了する可能性があるので、ちょっと微妙ですが軽く使ってみるには良さそうですね。

Readability Developer APIs

そのほか、今回は使ってないですが以下のようなライブラリがあるみたいです。 https://github.com/scotteh/php-goose https://github.com/essence/essence

また、Quoraに投げられた「HTMLから本文抽出する一番の方法は?」という質問も参考になります。

Quora | What’s the best method to extract article text from HTML documents?

PHP以外だとJavaのboilerpipeあたりが有名みたいです。