手間をかけずに実務で使えるクローラーの作り方

不動産テック勉強会#2でLTしてきました

先日不動産テック勉強会#2でLTしてきました。 登壇者の皆様お疲れ様でした。 また参加者の皆様足を運んで頂いてありがとうございました。 折角なのでその際話した内容を少しリライトしてUPしておきたいと思います。

基本Qiitaのスライド用に書いた記事をそのままコピペしてるので少し読みづらいかもしれませんが 読めないことはないはず。。

クローラーは結構簡単に作れる

  • 今年の春先にクローラー作ってたんですが思っていた以上に簡単に出来た
  • 出来上がったものは弊社で今も運用されていて毎日数十万件のページをクローリングしている
  • そのクローラーがどんな構成になっているのかと作る過程を発表したいと思います

クローラー何に使うの

  • イタンジは不動産系スタートアップ
  • 不動産取引には物件データが不可欠
  • 物件データ含め関係する大量のデータをWeb上から収集したい

出来るだけ早く手間をかけずに実務で使えるクローラーを作りたい

1日数百万ページクローリング出来るスケーラブルでハイパフォーマンスな物にしたい

いい感じのフレームワークないかな。。(゚∀゚)

Rubyクローラー事情

  • Anemone(メンテナンスされてない)
  • cosmicrawler(メンテナンスされてない)
  • Capybara + Poltergeist(重い)

Rubyは厳しそう。。

Scrapyがあるじゃない

Scrapy Cloudなんてのもある

  • Scrapyが動くPaaS
  • API完備
  • レポート、エラー通知、スケジュール実行等必要そうな機能は全部ある

これだ!

全体像をざっくり考える

  • 他サービスで使えるようにRDBにデータ突っ込む所がゴール
  • スクレイピングしたデータを綺麗に整形する必要がある

cloudcraft - ver1

他に考えないといけないこと

  • Scrapy Cloudはデータを保存する期限が決まってる
    • 整形前のデータも保存しておきたい
    • とりあえずS3に突っ込もう
  • 数百万件やるならデータの整形は並列でやらないと終わらない
    • Rubyで並列処理ならSidekiqかな

S3からSidekiqへのデータ受け渡しどうすんの

  • クローリング終わったのをフックに取りに行く?
    • 大量にクロールした後に整形始めるのは非効率
  • 数分おきにS3見に行く?
    • 非効率すぎる。。。

S3 Event Notificationsがあるじゃない

  • これ使ってS3にオブジェクトが作成される度にSNSでエンドポイントをリクエス
  • リクエストされたらSidekiqのjobをRedisにキューイングしよう

ということで完成図

cloudcraft - itandi crawler

まとめ

  • ScrapyとScrapy Cloudは一回触る価値あり
  • クラウドサービスのお陰でクローラーの開発コストはかなり下がっている