子育て情報アプリを作れるように vol9 ~同じデータを何度も保存しない~

前回、クローラーで収集したデータを データベースへ保存する所まで実装しました。
しかしながら、前回のプログラムだと
クローラーを実行する度に同じデータをデータベースに保存してしまいます。
そこで、今回は同じデータを保存しないように
重複チェックを行いたいと思います。
また、重複した場合はデータベースに保存されたデータを 書き換えます。

今回の目標

  1. 重複をチェックする

1. 重複をチェックする

重複チェックに何のデータを使うか

収集した全てのデータにURLを持っているので
URLにしようと思います。
もしURLが途中で変わる事があったら

その時は諦めます笑
もしかしたら動画のタイトルでチェックする方がいいのかな・・・?

いつチェックするか

重複のチェックはデータベースに保存されているURLと比較を行うので、
データベースの更新処理が実装されている直前に行います。
なので、
movie-crawler
cook-crawler
qa-crawler
のsave_dataメソッドの中に書いていきます。

実際に作る

やる事は単純。

  1. データベースに同じURLがあったらUPDATE
  2. データベースに同じURLがなかったらINSERT文

それぞれ別のSQL文として実行します。それだけです。
修正箇所は

  • movie-crawler.rb
  • cook-crawler.rb
  • qa-crawler.rb

の3つで、
それぞれのsave_data_baseメソッド内の処理を修正します。

内容が同じなのでmovie-crawler.rbだけ掲載します。
修正前
f:id:tumiki_jp:20150918013956p:plain

修正後 f:id:tumiki_jp:20150918014404p:plain

ソースコード内にあるresult.cmdtuples
更新したレコード数がセットされていますのでログとして件数を出力しています。

特に難しいところはなかったですが、
最初は、UPDATE文とINSERT文を一回で実行しようとしていました。
しかし、複数SQL文(複文というらしい?)を一気に実行することは
できないっぽい事がネットに書かれていたのでやめました。
(実際にエラーが発生しました。)
まぁ特に分けても現状問題ないのでこれでいきます。

 

今回は短めですが、 
少し改良されたので良しとします。
では、今回はこの辺で。

次回は、
YouTubecookpadの検索キーワードを
外部ファイルから読み込むようにしたいと思います。