子育て情報アプリを作れるように vol8 ~収集したデータを保存する~

今回はクローラーが収集したデータを
データベースに保存していきたいと思います。
データベースにはPostgreSQLを使っていきます。
PostgreSQLを使う理由は、
Herokuというサービスと連携するのに都合が良さそうだからです。
Herokuについては実際に使う時に記事を書きたいと思います。

今回の目標

  1. PostgreSQLの簡単な使い方を覚える
  2. クローラーで収集したデータを保存する

1. PostgreSQLの簡単な使い方を覚える

インストールや初期設定等はネットで調べて、
とりあえず以下を実行。

(1) brew install postgres
(2) ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
(3) launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

続いて、
コマンドについて少し勉強
データベースの作成
create database データベース名
テーブルの作成
create table テーブル名 (列名1 型, 列名2 型, 列名3 型);
ユーザーの追加
create role ロール(ユーザー)名 WITH LOGIN
パスワードの設定
alter role ユーザー名 with password パスワード;
権限の追加
GRANT SELECT, UPDATE, INSERT ON テーブル名 TO ユーザー名;
データベースの一覧表示
psql -l
データベースの選択
psql データベース名
テーブルの一覧表示
\d
レコードの挿入
insert into テーブル名(列名1, 列名2, 列名3) values(値1, 値2, 値3)
ヘルプの表示
\?

postgresのコマンドについてはかなりアバウトに書いています。
使うときに分からなければ知らべるスタンスでいきたいと思います。
 
とりあえずここまでで、準備完了

2. クローラーで収集したデータを保存する

ここから、実際に子育て情報アプリに実装していきます。

(1) gemの追加

RubyPostgreSQLを使うにはpgというgemを使います。
なので、gemfileに以下を追加します。
gem pg,
そして、インストールするために
bundle installコマンド
を実行

あれ、エラーが出る・・・。
ここはネットの力を借ります。
kgmx.hatenablog.com

上記リンクに書かれている事を試した後、
再度、bundle installコマンドを実行
成功!

(2) データベースの作成

まだpostgreSQLの事全然分かってないので
見よう見まねでコマンドを実行していきます。
まずはデータベースを選択
psql postgres
子育て情報アプリのデータベースを作成
creat database parenting
データベースを切替
\c parenting
テーブルを作成

CREATE TABLE movie_site_data (
  id SERIAL primary key,
  url text not null,
  title text not null,
  description text,
  tags text,
  release_date timestamp with time zone,
  view_count int,
  like_count int,
  dislike_count int,
  comments text,
  thumbnail text
);

ユーザーを追加
create role parenting_user with login
パスワードを設定
alter role parenting_user with password 'parenting_password'

(3) データベースへの接続

Rubyで呼び出すには、
まず、require pg
そして、データベースへ接続するために
PG::connect()を使います。
使い方はこんな感じ。

connection = PG::connect(host: "", )
begin
  connection.exec(SQL文)
ensure
  connection.finish
end

PG::connect()でデータベースへ接続し、
connection.exec()でテーブルを選択したり更新したりし、
終わったらデータベースへの接続を閉じる
これだけです。

(4) リファクタリング

以上を踏まえてプログラミングしていたのですが、
またまた構造を見直すことにしました。
自分がいかに行き当たりばったりなのかが分かります…

今回修正したファイルは

  • postgres-config.sql (新規作成)
  • Gemfile
  • Gemfile.lock
  • crawler.rb
  • movie-crawler.rb
  • youtube-crawler.rb
  • cook-crawler.rb
  • cookpad-crawler.rb
  • qa-crawler.rb
  • yahoochiebukuro-crawler.rb

です。
ほぼ全部 笑
とりあえず、YouTubeのデータを保存する方法だけ書いていきます。
cookpadヤフー知恵袋も修正方法は同じなので省略します。

① postgres-config.sql

このファイルは新規作成したものですが、
postgresのテーブルを作るためのsqlをまとめたものです。
f:id:tumiki_jp:20150914013910p:plain
このファイルをpostgresでインポートします。
\i main/config/postgres-config.sql
そうすることでテーブルが作られます。
すみません、それだけのファイルです・・・。

② crawler.rb


全てのクローラーの継承元になるcrawler.rbなんですが、
runメソッドを拡張しました。
今までは、

という二つの事しかやってなかったんですが、
もう二つ処理を増やしました。

  • クローラーで収集したデータを綺麗にする
  • データベースへ保存する

というものです。
ただ、あくまでもcrawler.rbは全てのクローラーの継承元なので、具体的な処理は書きません。
継承先で書くようにします。
もし継承先で crawl_base()メソッド
creansing_base(crawler_datas)メソッド
save_data_base(creansing_datas)メソッド
をオーバーライドしないで実行した時は例外が発生するようにしています。

③ movie-crawler.rb


movie-crawler.rbも継承元なので、
youtube-crawler.rbに情報を渡していきます。
ただし、
データベースの保存処理に関しては、どんな動画サイトでも同じだと思うので、
このファイルにデータベースへの保存処理を書きました。
やってる事は、単純にINSERT文を実行しているだけです。

query = "INSERT INTO movie_site_data (url, title, description, tags, release_date,
    view_count, like_count, dislike_count, comments, thumbnail)
    VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)"

$マークを書いたところは変数として値をセットできます。

youtube-crawler.rb


今回の修正で、creansing_movieメソッドを使うようになったので、
以前クローラーの処理中に書いていた、犬と猫の動画は飛ばすという処理をこちらに持ってきました。
以前よりはスッキリしたんじゃないかと思っています。

一応できた!  

f:id:tumiki_jp:20150914023518p:plain
少しずつですが、できてきた・・・?
データベースへの保存はまだまだ課題が残っているので、
引き続き対応していきたいと思います。

  • 同じ記事をクローラーを実行する度に保存してしまう
  • Youtubeのタグとサムネイルを取得していない
  • 収集したタイトルや説明文からタグを生成したい
  • データベースへの接続ユーザー、パスワードを別ファイルにしたい
    等々

今回は少しボリュームが多くなってしまったのと、
うまく日本語で説明できない部分があったりした(私の国語力の問題)のと、
早く記事をアップしないといけないと思っていたので、
雑になっています・・。
間違っている所があればご指摘ください!

とりあえず修正したプログラムはGitHubにありますのでよければ見てください。
github.com
 
今回と前回で修正した箇所だけ見たい方はこちら
github.com