PHPでwebサイトクロールに挑戦 #3「データ構成」

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

#1 システム考案
#2 HTML取得

データ構成を考える

前回までで、データの取得を簡単に行う事は理解できたので、今回は取得したデータをどう保持するかを考えたいと思います。

取得データの階層を考える

サブドメイン
┗サイト内URL

上記のような構造で管理をすれば、サブドメイン毎にURLをのHTMLソースを保持して管理すればいいと考えられます。

問題点

しかし・・・、この方法は、WEBサイトが静的ページである事が条件になります。
もし、同じURIのHTMLのソースが動的に変更するようなWEBページの場合は、取得する毎にWEBページが変更扱いになり、結果膨大なデータを扱わないといけなくなります。

もう一つやっかいな問題として、Query-Stringによる、同一URLだけど、ユニークURLがユーザー分だったり、カテゴリ分存在するようなケース。

wordpressなども、パーマリンク設定で、URLでユニークを持ったり、クエリで記事ユニークにしたりと変更もできちゃうので、こういった場合の事も検討しておく必要があります。

今回の仕様

とりあえず、今回は、任意URLが静的ページである事として、URL単位でデータ保持をして、その差分をバージョン管理するような仕組みを検討したいと思います。

改めてデータ保持階層構造

/data(URLマスターに依存する※アクセスURLを保持)
┗URL-ID.data(URL内のHTMLソース)

/Master
┗URL-LIST(ID,URL)

/history
┗URL-ID-date.data

/log
┗update.log

フロー

1、1日1回cronで登録してあるURLからHTMLソースを取得してくる。
2、取得してきた際に、HTMLソースに変更がなければ、更新しない。
3、取得してきたHTMLソースに変更がある場合、historyフォルダに過去バージョンを移動して、最新版をdataフォルダに設置する。
4、uodate.logに取得できた(変更が無かった場合は無視する)ページのデータをレコード登録する。

データの扱い

今回のデータは、SQLを使わず、テキストデータで扱います。
SQLツールを使うかどうかは今後のアップデートで検討したいと思います。

実際に構築

今回はPHPではなく、shellのみで作成してみました。
Githubにソースを置いておきます。
https://github.com/yugeta/crawl

crawl.sh

master/url/list

主要なニュースサイトを登録してみました。
とりあえず、HTMLソースが結構高速に取得できる事が確認できたのですが、今回のソースでは以下のような問題が発見されました。

1、文字エンコードがUTF-8以外は文字化けする
2、wgetオプションにより改行コードが取得できていない(不具合)
3、history対応ができていない
4、差分判定が入っていない

とりあえず、上記問題については、次回以降で解決していきたいと思います。

でも、RSSをセットすればいいじゃんというツッコミはなしで・・・

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です