- ベストアンサー
サイト上のデータからデータベースを更新する方法
- サイト上のデータからデータベースを自動更新する方法を探しています。現在は手動で更新していますが、少しでも自動化したいです。
- 初心者のため、簡単な方法を探しています。過去のデータを保持しながら、新しいデータをデータベースに追加したいです。
- サイト上のデータが更新されるたびに、データベースも更新されるようにしたいです。PHPとMySQLを使用しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
書き忘れましたが、 >これは、バッチ処理で行うようなかたちになろうかと存じますが、 バッチ処理は基本的には行いません。Windowsのバッチ処理やUNIIXのshellスクリプトも含めて、書くのが結構大変です。質問者さんは、PHPなどのスクリプト言語を書けるのですので、そこから命令を実行させて結果を受け取るのがずっと楽ですし、高機能なものができます。 実行環境としてLinuxも考えているのであれば、互換性の関係からPHPだけで書くのが良いと思います。 PHPの場合はshell_exec()などを使うようですね。
その他の回答 (4)
- ki073
- ベストアンサー率77% (491/634)
diffというのはUNIX系のOSに備わっている命令です。 >PHPにもxdiff_file_diff 詳しいことは分かりませんが、同じ様なものかもしれません。どっちみちファイルにして差分を解釈しないといけないのでPHPで差分をとるのと、楽な方を使えばよいと思います。 変更、追加、削除がwebサイトで分からないのなら、データベースに持っているデータと全部突き合わすしかなさそうです。 データをデータベースに持つのではなく、適当な方法でシリアライズ(XML,YAML, JSONなど)して保存するのが楽かもしれません。 このあたりは総合判断ですね。 Web siteの更新をチェックする方法ですが、まず更新が行われているか判断できるURLを見つけます それをhttp://www.xxx.xxx/index.htmlとすると a) 書き換えた日時が得られるなら、以前の情報と比較する スクリプト言語にそういう命令があるかもしれません。 UNIX系OSの場合には curl -I http://www.xxx.xxx/index.html で Last-Modified: Wed, 16 Nov 2011 09:39:08 GMT のような情報が得られます b) あるいは、そのURLを読み込んで、テキストレベルで以前のものと比較する いずれにしても、情報をファイルに保存しておき比較することが必要です。
お礼
ありがとうございます。
- ki073
- ベストアンサー率77% (491/634)
変更や削除についてですが、webサイトのデータからそれが分かるようになっていれば、その情報をもとにデータベースを書き換えていく方法で対応できますが、それが分からない場合は a) データ容量がそれほど多くないので、新たにデータベースを作り直す。 b) データベースから全データを読み込んで、webサイトのデータの差を調べ、それに従ってデータベースを更新する 全部がテキストデータならdiffを使うと簡単にできます。 webサイトのデータが変更、追加、削除がわかるようになっているのでしょうか? >本番とテストでOSが異なるのはよろしくないでしょうか? 差を理解した上で使うのであれば問題ないと思います。改行コードや文字コードでつまずかないようにしてください。 お手軽にやりたいのならSQLite3の選択もあります。MySQLとSQLite3の両方を用意していますが、最近はSQLite3しか使っていないです。限界が見えたらMySQLにデータを移そうと思っていますが、まだその機会はないです。少人数でしか使っていないのでそのせいかも知れませんが。
お礼
ありがとうございます。 > webサイトのデータが変更、追加、削除がわかるようになっているのでしょうか? なっていません。 > 全部がテキストデータならdiffを使うと簡単にできます。 diffというのは、C言語でしょうか? C言語をやったことがないので、私には難しそうです。 探してみたところ、PHPにもxdiff_file_diffという関数があるようですね。 また、No.1で教えていただいたことに戻ってしまい恐縮ですが、「1) Web siteの更新をチェックする」について、よろしければ質問させてください。 これは、バッチ処理で行うようなかたちになろうかと存じますが、何分初心者なもので、「バッチ 作り方」等のキーワードで検索して出てくるページに理解が及びません。 このあたりの知識について、どの辺りから勉強していけばよろしいでしょうか? (ざっくりとした質問で恐縮です。)
- ki073
- ベストアンサー率77% (491/634)
まず確認ですが 1) データの構造ですが、普通はIDや見出しなどがあって、それに対していろいろな情報が付随してる場合が多いと思いますが、そのような構造をしていますか? 2) データ一件あたりのどれくらいの文字数(あるいはバイト数)はどれくらいでしょうか。また件数は何件くらいを想定していますか。 3) データは追加だけで、削除や一部変更などはないか。 4) OSは何を使っているのでしょうか 5) データベースソフトはMySQLなのか。その場合MySQLは別にサーバーを作っているのか を教えてください。 さて、 新しく得られた hoge1 hoge4 hoge2 hoge3 を順番にデータベースを検索して登録されているか確認します。 そうするとhoge4が見つからないので、追加登録します IDはデータベースの中にIDの最大値を見つけ+1してhoge4とする。 参考 http://sasuke.main.jp/max.html これでどうでしょうか。 IDは自動で振った方が重複やつけ忘れもないんですが。
お礼
ありがとうございます。 お陰様で追加の場合のやり方は、分かりました。 後は、頂いた確認事項3)にある削除の場合のやり方が分かりませんので、 二度手間になってしまい恐縮でございますが、 よろしければ、改めてご教示いただければ大変助かります。 なお、以下、頂いた確認事項にお答え申し上げます。 > 1) データの構造ですが、普通はIDや見出しなどがあって、それに対していろいろな情報が付随してる場合が多いと思いますが、そのような構造をしていますか? はい。そのような構造をしています。 > 2) データ一件あたりのどれくらいの文字数(あるいはバイト数)はどれくらいでしょうか。また件数は何件くらいを想定していますか。 200バイト、10000件くらいを想定しています。 3) データは追加だけで、削除や一部変更などはないか。 削除や一部変更もあり得ます。 4) OSは何を使っているのでしょうか 本番はLinuxです。 テスト環境は、Windows7(64bit)です。 本番とテストでOSが異なるのはよろしくないでしょうか? 5) データベースソフトはMySQLなのか。その場合MySQLは別にサーバーを作っているのか を教えてください。 MySQLです。 レンタルサーバを利用しており、WEBサーバーとデータベースサーバが別かどうか把握しておりません。 すみません。
- ki073
- ベストアンサー率77% (491/634)
少し手を加えれば十分可能なように思います。 整理すると 1) Web siteの更新をチェックする 一番単純なのが、更新されそうなページを定期的に読み込み、以前の状態と比較することです。 2) 更新があればデータを読み込む Simple HTML DOM Parserで作ったものがあればそれを使う 3) データベースと照合し、更新のあったところを書き換える データ数が少ないのなら丸ごと書き換えも可能。最初に作ったものがそのまま使える。更新分だけを変更したいのなら、データベースを読み込みつつ変更。 どこがわからないのでしょうか。 分けて考えて少しずつ作られてはいかがでしょか。 そのwebサイトが一般の公開されているものでしたら、こちらでも見てみますが。 私自身はPHPをほとんど使いませんので具体的なプログラムを提示できませんが、以上のことを簡単にでいるライブラリがあるはずで、それを組み合わせばそんなに手間がかからずにできるはずです。 rubyなら何を使えば簡単にできるかは思い浮かべられますので、PHPでも同じ様なものがあるはずです。
お礼
ありがとうございます。 ご提案の通り分けて考えたうえで、どこが分からないか明確にしたいと負います。 一旦、1)は置いておいて、2)及び3)について考えてみます。 以下のソースを持つページがあったとします。 <p>hoge1</p> <p>hoge2</p> <p>hoge3</p> まず、以下のように「Simple HTML DOM Parser」を使ってこのページのデータをデータベースにinsertします。 <?php require_once('simple_html_dom.php'); $html=file_get_html("http://www.example.com/"); $hoge=$html->find('p'); foreach($hoge as $value){ $name[]=$value->plaintext; } $pdo=new PDO("mysql:host=localhost;dbname=dbname","user","pass"); for($i=0;isset($name[$i]);$i++){ $pdo->query("insert into hoge values($n+1,'$name[$n]')"); } ?> そうすると、データベースは以下のようになります。 id name 1 hoge1 2 hoge2 3 hoge3 次に、上記のページが以下に更新されたとします。 <p>hoge1</p> <p>hoge4</p> <p>hoge2</p> <p>hoge3</p> この場合にhoge4のidを4として、データベースに取り込むスクリプトの組み方が分かりません。 以上、よろしければ、改めてご教示いただいたくお願い申し上げます。
お礼
ありがとうございます。