#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をセットすればいいじゃんというツッコミはなしで・・・
0 件のコメント:
コメントを投稿