スクレイピングにも色々あって、クローラにガーッとデータを一気に抜いてきてもらう場合もあれば、IR情報など、更新をウォッチしたいサイトに定期的にクロールするという場合もあると思います。
今回は後者のときのための話です
TL;DR
- 日毎のスクレイピングという場合、更新情報の管理が必要になって面倒
- スクレイピング結果をRSS形式にしておくようにしたら、その辺の手間がなくなって嬉しかった
更新情報をとってくる
例えばニュースサイトで新しい記事が出てきたらその内容を取得したい。
という場合、以下の手順が必要になります
- ニュースサイトの一覧画面からスクレイピングして記事のリストをとってくる
- 記事が未知のURLか、既知のURLか判定
- 未知のURLだったら処理する
これはこれでやれば良いのですが、 記事が未知のURLか既知のURLか判定
という手順が意外と面倒臭かったりします。なぜならこの判断をするには、既知のURLが保存されているストレージが必要だからです。ストレージを管理するということはどこかが状態を持つということで、まあなんというかサクッとやりたい場合は面倒臭いです。
RSSにしてみる
そもそも更新情報というのはRSSの専売特許だと思ったので、
ニュースサイトの記事一覧をRSS形式にするスクリプトを書きました
処理はこれだけです
- 設定ファイルにURLを定義しておいてhtmlを取得
- 設定ファイルに書いておいたCSSセレクタで、情報を抜き出してxml(RSS)にする
- タイトル (title)
- URL (link, guid)
- 更新日時 (pubDate)
- 作成したxmlファイルをパブリックなS3に置く
設定ファイルをいろいろ書いてherokuで1日1回動かしていますが、今の所いい感じです
よかったところ
ストレージ不要で楽になった
先述のニュースサイトをスクレイピングする例だと、
RSSにしてみた場合の処理はこんな感じです
- ニュースサイト記事一覧をRSS形式にしてS3に配備
- そのURLをRSSアグリゲータ(zapier)に監視してもらう
- 未知の記事が現れたときに、zapierがwebhookをくれる
- 通知イベントを受け取ってなんか処理
ストレージ不要で同じことが出来てラクですね
余談ですがzapierはRSSアグリゲータもwebhookも超柔軟に設定出来て便利ですね
スクレイピング結果のデータ形式、仕様があると楽
これは副次的なものなのですが、RSSのようにきちんとした仕様があるデータ形式は楽です。
なぜならデータをどう保存するか自分で考えなくても済むからです。
スクレイピングしたデータをjsonとかsqliteとかcsvとか色々な形式で取っておくかと思うのですが、これを迷わなくなりました。RSS(xml)一択です。また、仕様に色々なデータ属性もあるので、基本的に目についたものに従っておけば過不足ありません。
RSSの仕様がどんなものかは次のサイトが良かったです。
連携しやすい
RSSは古くからある仕様なので連携できるサービスも豊富です。
(zapier, ifttt, slack, feedly ...)
それに大体のスクリプト言語にはRSSを扱うためのモジュールがあります。
その気になればtd-agentからbigqueryに投げたりとか
そんなこと誰もしないと思いますけど、まあデータがポータブルなのはいいことです。
まとめ
- スクレイピング結果をRSSにしておくと便利でした
- 枯れてる仕様ってのはありがたいですね
- htmlをRSSにするスクリプトなんて超簡単なのでオススメです
- 自分でスクリプト書くと仕様が自分で決められるの楽しいですね