大規模webサイトをリニューアルする際に、コンテンツをそのまま新テンプレートに当てはめたいという場合があります。そういったとき、一括処理する方法として「スクレイピング」という手法を紹介します。
目次
スクレイピングとは
とりあえず用語の定義は以下のようになっています。
スクレイピング
英語で”scrape”とは「削ること」。 特に、ウェブサイトのデータを必要な部分だけ抽出して利用すること。
“ウェブサイトのデータを必要な部分だけ抽出して利用”がまさにそれです。
例えばbodyタグの中、id=”contents”、aタグのhref属性の中身のみなどいろいろな使い方ができます。
準備するもの
準備するものは以下の3つです。
- ・CUI上でのphp環境
- ・Simple HTML DOM Parser
- ・スクレイピングするファイルリスト
たったこれだけでできるみたいです。
とりあえず、一つ一つ見て行きましょうか。
CUI上でのphp環境
MacやLinuxだと用意しやすいのですが、windowsだとちょっと面倒かもしれません。
自分はlinux(centOS6.0)上で実行したので、導入方法もわかりません。
「windowsしかないわボケ!」という方は下記をご覧下さい。
Microsoft Windows のコマンドラインでの PHP
ちなみに、virtualBoxなど利用して仮想PCを立てれば簡単にlinux環境をつくれるので、それでもおkです。
phpのバージョンは5でいいと思います。自分は5でやりました。
Simple HTML DOM Parserの用意
今回はスクレイピングに際して、Simple HTML DOM ParserというPHPライブラリを使います。
下記のサイト(公式)からzip形式でダウンロードできます。
※ ページ内の「Download latest version form Sourceforge」よりダウンロード下さい。
※ リファレンスもこのサイト内にあるので、適宜参照して下さい。
解凍すると、いろいろファイルが入っているんですが、実例のファイルがほとんどです。
メインで使うのは、simple_html_dom.phpです。
スクレイピングするファイルリスト
これがないと始まりません。
どのページのソースをどのヘージに使うかってわからないままでは何もできないです…(´・ω・`)
スクリプトを組む
用意するものは以上で、さっそくスクレイピングのスクリプトを組んでみましょう。
今回は仮で「old.htmlのid=”contents”のhtmlをnew.htmlに移す」という内容で行います。
old.htmlは以下のような記述にします。
<html> <body> <div id="contents">ここが対象のソースだよ!</div> </body> </html> </pre>
では、phpを書いていきます。
記述内容は以下のような感じになります。
<?php require_once('simple_html_dom.php'); function scrape($oldFile, $newFlie){ //対象htmlを取得 $html = file_get_html($oldFile); //取得したhtmlから対象の要素を指定 $element = $html->find('#contents', 0); //指定した要素からソースコードを取得 $source = $element->outertext; //新規ファイルにソースコードを流し込む file_put_contents($newFlie, $source); } scrape('old.html','new.html'); ?>
まず、require_once()でsimple_html_dom.phpを読み込みます。
その上で、Simple HTML DOM Parserのメソッドを利用した関数を作成していきます。
まず、file_get_html()でhtmlファイルを取得します。
なお、「http://~」から記述して、web上から取得することも可能です。
その後、find()を利用してidで対象の範囲を指定します。
※ この時点では指定しただけで、まだソースは取得できていません。
ソースを取得するには、outertextやinnertextを使用します。
outertextは指定のidを含めたソースコード、
innertextは指定のid内のソースコード、
を取得します。新規idに置き換える場合などは後者を利用します。
最後にfile_put_contents(A,B)というAにBの内容を流し込むというメソッドでソースコードを移します。
このときにAというファイルが存在しない場合、Aを生成して流し込んでくれます。
これだと複数ページある場合に、毎回scrape関数を実行しないといけません。
複数ページある場合の例は、次項で紹介します。
大量のhtmlファイルを処理しよう
htmlを大量に処理する場合は、htmlファイル名を配列に格納し、for each文でループ処理します。
まずは配列を作成します。↓みたいな感じです。
$list = array( '01.html', '02.html', '03.html', '04.html', '05.html', '06.html', '07.html', '08.html', '09.html', '10.html');
ディレクトリがある場合は、「hoge/01.html」のように記述すればおkです。
※スクレイプ用のphpを同じディレクトリに置かない場合は階層を合わせましょう。合わせないと処理ができません。
続いて、for eachで配列ベースのループ処理を行います。
foreach($list as $val){ hoge($val); }
これで移行完了です。
移行前と移行後のファイル名が違う場合
ファイル名が違う場合は、上記の処理内容だと実行できないので、古いファイルリストと新しいファイルリストのそれぞれの配列を作成して実行すればOKです。
具体的には、$newFileの引数に新しいファイルリストをいれた配列を、$oldFileの引数に古い方のファイルリストをいれた配列を入れて実行しましょう。
手作業でやると単純で眠気を誘う作業なので、どうしてもミスしてしまいがちですが、これさえあればミスすることもないですね。
ブログの記事を新デザインに当てはめたいけど、記事がエクスポートできない場合などに利用してみるといいかもです。