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

2015年8月9日

PHP テクノロジー プログラミング 特集

#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

#!/bin/bash url_list="master/url.list" ymdhis=`date +%Y%m%d%H%M%S` # Make-Directory if [ -e "data" ];then echo "data-folder-exists" else mkdir "data" fi if [ -e "log" ];then echo "log-folder-exists" else mkdir "log" fi cat ${url_list}|while read line do #set-line-column-data flg=`echo ${line}|cut -d, -f 1` id=`echo ${line}|cut -d, -f 2` name=`echo ${line}|cut -d, -f 3` url=`echo ${line}|cut -d, -f 4` #check-flg if [ "${flg}" != "0" ];then continue fi #source-get html=`wget --output-document=/dev/null -q -O - ${url} 2>/dev/null` #source-write echo ${html} > "data/${id}.html" #log-write echo "${ymdhis},get,${id},${url}," >> "log/${id}.log" # view echo "get | ${url}" done 0,001,Yahooニュース,http://news.yahoo.co.jp/, 0,002,Googleニュース,https://news.google.co.jp/, 0,003,エキサイトニュース,http://www.excite.co.jp/News/, 0,004,ライブドア・ニュース,http://news.livedoor.com/, 0,005,NHKニュース,http://www3.nhk.or.jp/news/, 0,006,朝日新聞,http://www.asahi.com/news/, 0,007,InfoSeek,http://news.infoseek.co.jp/, 0,008,2ちゃんねる,http://www.2nn.jp/, 0,009,J-Castニュース,http://www.j-cast.com/, 0,010,gooニュース,http://news.goo.ne.jp/, 0,011,ニコニコニュース,http://news.nicovideo.jp/, 0,012,産経ニュース,http://www.sankei.com/, 0,013,産経ニュース速報,http://www.sankei.com/flash/newslist/flash-n1.html, 0,014,毒女ニュース,http://www.officiallyjd.com/, 0,015,読売ニュース,http://www.yomiuri.co.jp/, 0,016,毎日新聞,http://mainichi.jp/, 0,017,mixiニュース,http://news.mixi.jp/, 0,018,日刊現代,http://www.nikkan-gendai.com/, 0,019,ロイター,http://jp.reuters.com/news, 0,020,日本経済新聞,http://www.nikkei.com/, 0,021,@niftyニュース,http://news.nifty.com/, 0,022,ロケットニュース,http://rocketnews24.com/, 主要なニュースサイトを登録してみました。 とりあえず、HTMLソースが結構高速に取得できる事が確認できたのですが、今回のソースでは以下のような問題が発見されました。
1、文字エンコードがUTF-8以外は文字化けする 2、wgetオプションにより改行コードが取得できていない(不具合) 3、history対応ができていない 4、差分判定が入っていない
とりあえず、上記問題については、次回以降で解決していきたいと思います。 でも、RSSをセットすればいいじゃんというツッコミはなしで・・・

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。