おしゃれな人を自動的にキュレーションして表示するシステムが作りたい
先日ある記事(ぐるなびや食べログはもう古い!?
女子大生は「Instagram」(インスタグラム)で
飲食店を探し、雑誌感覚で画像も検索する!)を見つけて、すごくカルチャーショックを受けました。ラーメンをインスタグラムで見つけるなんて僕の常識ではありえなかったのです。でも確かにやってみると、食べログを見るよりなんだかワクワクします。Instagramで加工された写真ですごく食欲をかきたてられました。Instagramというプラットフォームにすごく魅力を感じました(月並)
instagramはおしゃれな人が投稿している。それを使えたらいいなあ
要するに、Instagramには質の良い投稿があふれているのです。それを使いたいと思いました。
クローラーか?APIか?
Web上の情報を取ってくるにはクローラーを定期巡回させか、公開されているAPIを定期的にたたくかの選択肢があります。APIが公開されている時にはそちらを使い、APIでどうしても取れない情報をクローラーで取得するのが定石なので今回はAPIを使うことにします。
参考書籍: Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
Instagram APIを使ってみた
公式ドキュメント -> https://instagram.com/developer/
使えそうなEnd pointとそうでないEndpoint
公式ドキュメントのEndpointsのセクションに例が並んでいます。それぞれどういったレスポンスが返ってくるかは、各項のRESPONSEボタンを押すと見ることができます。
おしゃれな投稿を集められるエンドポイントを探す
ここでは今回のおしゃれなファッションの投稿を集めるという観点でいくつか試したEndpointsの考察を書きます。
/media/popular
InstagramのDocumentationのなかで投稿のことは"media"と呼ばれます。今回は投稿を探したいのでまずmediaセクションをあたりました。/media/popularは最近の人気の投稿を返してくれます。
####good
- like数の大きい投稿がたくさん集められる。
####bad
- popularであるだけなのでファッションに関連した投稿が返ってくるとは限らない。
- 有名人ばかりになってしまい、親近感がわかない
/media/search
このEndpointでは、緯度・経度で場所を指定して、そこから半径5kmまでの位置情報のついた投稿を集めることができます。投稿された時間で絞ることもできます
####good
- サイトを渋谷のファッションなどにしたい場合、ターゲットを絞りやすくなる。
####bad
- 必ずしもすべての投稿に位置情報がついているとは限らないため、取得できる投稿数が少ない。
- 半径5kmまでしか指定できないため、不便。例えば、東京都全域の投稿を集めたいときは面倒。
/tags/[tag-name]/media/recent
このEndpointでは、tagの名前を指定して最近の投稿を集めることができます。
####good
- ファッション関係の投稿を簡単に集められる。
####bad
- like数などでレスポンスを絞ることができないため、大量のデータを一時的に保存して自分でデータを処理しないといけない。
- ファッション関係全ての投稿にタグがツイているとは限らない。
今後の展開
以上のEndpointとクローラーを併用させることになりそうです。こちらの本の内容を参考にして進めていきたいと思います。本の中ではAmazonでAPIから取れるデータと、ブラウザのランキング情報を組み合わせた例が紹介されていました。
参考書籍: Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
余談
railsで定時実行をする方法 -> whenever
私はRuby on Railsで開発を進めています。Railsでタスクを定期実行するにはwheneverが便利です。
https://github.com/javan/whenever
Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails4.1]
僕はAPIを叩くrake taskを作成して、定期実行しています。ただ、このwheneverはデフォルトでは1分ごとの実行が最短間隔のため、毎秒定期実行したい時に困っています。どなたか毎秒定期実行するTipsをコメント欄で共有していただけたら幸いです。
Rubyでinstagramを使う際のライブラリ
RubyでInstagramのAPIを叩くためのライブラリがFacebook社から公開されています。非常にシンプルで使いやすいです。ちなみにPythonもあります。
https://instagram.com/developer/libraries/
Gemの中のinstagram-ruby-gem/lib/instagram/client/以下にEndpointごとにファイルが有り、そのなかのメソッドを呼び出せば使えます。