heroku+S3で遅延証明書をクローリングするアプリを作った話

  • 17
    Like
  • 1
    Comment
More than 1 year has passed since last update.

この記事はフィードフォースエンジニア Advent Calendar 2015 - Adventar13日目です

昨日、12日目は 今年ソーシャルPLUSで捨てられた技術たち | feedforce Engineers' blog でした!

自己紹介

ドーモ、社内ニンジャスレイヤー推進おじさんのかせいさんです
普段はアプリケーションエンジニアとして、Railsアプリの運用、改善を進めております

今日は何話すの?

heroku+S3で動作する遅延証明書クローラーを作ったので、それの技術的要素についてのお話をします

遅延証明クローラー?

小田急線の遅延証明書のページは過去1週間分しか残しておらず、月末にまとめて印刷しようとすると困ったことになるので、定期的にクローリングしてS3に保存してくれるスクリプトを作ってみました

クロールした後、こんな感じにクロールした結果の一覧を生成してくれます
(リンクをクリックすると、遅延証明のスクリーンショットが表示される仕様です)

odakyu_-_Vimperator.png

コードはこちら → https://github.com/kasei-san/delay_certificates

どんな仕様なの?

  • 小田急線の遅延証明書のページを定期的にクローリングすること
    • 小田急線以外も簡単に追加できること
  • クローリングした結果を保存して、簡単に見れること
  • なるたけ金銭的なコストは掛けたくない

技術的要素

上記を考慮した結果、こんなかんじになりました

  • 遅延証明書は PhantomJS でスクリーンショットを取る
    • HTMLのままだとcssとか画像の保持など考える事が多いので、
  • Heroku で動作させる (無料なので)
  • スクリーンショットの格納先は AmazonS3 (安いので)

以下、技術的要素で自分がハマった所や知らなかった所をご紹介します

遅延証明書はPhantomJSでスクリーンショットを取る

Selenium を使えば簡単にできます
こんなかんじ

driver = Selenium::WebDriver.for(:phantomjs)
driver.get("http://www.google.co.jp/)
driver.save_screenshot(File.join("./google.png"))

こんな風に取れます(画面サイズなどはデフォルトのまま)

google.png

Herokuで動作させる

Herokuで動作させるにあたって、いくつか課題がありました

  • HerokuでPhantomJSを動かす
  • Herokuで単純なrubyスクリプトを定期的に実行させる

HerokuでPhantomJSを動かす

Herokuのサーバには、標準でPhantomJSは入っていないので、インストールする必要があります

PhantomJSのbuildpackを追加する

https://devcenter.heroku.com/articles/buildpacks

Herokuにはbuildpacksという、あらかじめビルドされたバイナリパッケージのコンテナがあります

普通は、こんな感じに使用する言語のbuildpackを指定するのですが...

heroku create myapp --buildpack heroku/python

PhantomJSのbuildpackもあるので、rubyとPhantomJSそれぞれをインストールしなければなりません

複数のbuildpackをHerokuに入れたい

heroku-buildpack-multiを使います

heroku-buildpack-multiを使う旨を宣言する

heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git

.buildpacks ファイルに、インストールしたいbuildpackを記述する

https://github.com/heroku/heroku-buildpack-ruby
https://github.com/stomita/heroku-buildpack-phantomjs

あとは普通に git push heroku master すればrubyとPhantomJSがインストールされます。簡単!

スクリーンショットが文字化けする!!

Herokuのサーバには日本語フォントがないらしく、PhantomJSで日本語のページのスクリーンショットを取ると文字化けします
そのため、.fonts ディレクトリを用意して日本語フォントを置いてあげる必要があります

Herokuで単純なrubyスクリプトを定期的に実行させる

こちらについては別記事にまとめたので、そちらをご参照下さい

感想

HerokuではRails以外を動かしたことが、いままで無かったので色々わからない所が多かったのですが、いざやってみると色々な事が(無料で!)できるのだなぁと思いました
今まで、趣味でアプリを作るならwebサービスだろ! などと息巻いておりましたが、それにこだわらず、日々の不便を解消するようなスクリプトを作るのも中々楽しかったです
みなさんもよろしかったら、Heroku+S3で便利スクリプトライフを是非!

明日、14日目は koshigoeさんのGraphQL話です!