リニューアルを効率化するスクレイピング処理をPHPで実行する方法

大規模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」よりダウンロード下さい。
※ リファレンスもこのサイト内にあるので、適宜参照して下さい。

PHP Simple HTML DOM Parser

解凍すると、いろいろファイルが入っているんですが、実例のファイルがほとんどです。
メインで使うのは、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の引数に古い方のファイルリストをいれた配列を入れて実行しましょう。

手作業でやると単純で眠気を誘う作業なので、どうしてもミスしてしまいがちですが、これさえあればミスすることもないですね。
ブログの記事を新デザインに当てはめたいけど、記事がエクスポートできない場合などに利用してみるといいかもです。

この記事を書いた人
ねづ
妻と娘(1歳)と3人暮らし。
「旅行」と「筋トレ」をテーマにしてブログを書いてます。

独身時代に海外旅行(主に東南アジア)にハマり、マイル修行も経験。ANA&JAL両方とも上級会員(SFC&JGC)になりSPGアメックス所有して、オトクな旅行を追求。
結婚&子供ができた後は、子連れ旅行しながら、筋トレという新たな趣味に目覚めて、週3〜4でジム通い中。
この記事が面白かったらいいねしよう!
記事のタイトルとURLをコピーするコピーしました!
こちらの記事もどうぞ
こちらの記事もどうぞ

コメントを残す

コメント※必須
名前※必須
メール※必須(非公開)

NEZU.log プログラミング リニューアルを効率化するスクレイピング処理をPHPで実行する方法
このブログを書いている人

運営者 : ねづ

妻と娘(1歳)と3人暮らし。
「旅行」と「筋トレ」をテーマにしたブログです。

独身時代に海外旅行(主に東南アジア)にハマる。ANA&JAL両方とも上級会員(SFC&JGC)になりSPGアメックス所有して、オトクな旅行を追求。
結婚&子供ができた後は、子連れ旅行しながら、筋トレという新たな趣味に目覚めて、週3〜4でジム通い中。

詳しいプロフィールはこちら

LINE@作成しました!お気軽にどうぞ!
友達登録は下記QRコードを読み取ってください
LINE@ QRコード

カテゴリ一覧
キーワードで記事を探す
下記から更新情報を受け取れます!