Shun40の日々のあれこれをまとめるやつ

DTMとかプログラミングとかその他諸々の話をするブログです。

DTMセール情報を集めるプログラムを作った話

DTMプラグインのセール情報をまとめているWebサイトからセール情報を収集し、結果を表示するプログラムをPythonで作った話です。

背景

DTMerにとって三度の飯よりも大事なのが、プラグインやサンプルパックのセール情報です。ちょうどブラックフライデーも近づいてきているので、DTMerはセール情報に敏感になる時期じゃないでしょうか。

ありがたいことに、世に溢れているセール情報をまとめてくれているWebサイトは複数あるのですが、

  • 各サイトを巡回するのは面倒くさい
    複数サイトの情報をまとめて見たい
  • 自分が興味のないセール情報も多い
    自分が興味のあるセール情報だけ見たいWavesの情報だけ、ピアノ音源の情報だけ…など)

という需要があるかと思いました。

「それ、スクレイピングとかいうやつやればできると思うんですけど…」

と思ったので や り ま し た 。

概要

セール記事をまとめている複数のWebサイトをスクレイピングし、セール記事を収集します。 以下のWebサイトからセール記事を集めます。

収集したセール記事には以下の処理がおこなわれます。

  • タグの自動付与
  • セール期間の自動抽出(うまくいかない場合あり)
  • 日付順ソート

収集結果はHTMLで出力されるので、Webブラウザでセール情報を閲覧できます。

使ったもの

  • Python 3.7.0
  • Pythonパッケージサードパーティ
    • Requests
      HTTPリクエストを投げてHTMLを取得するために使用
    • Beautiful Soup 4
      取得したHTMLから情報を抽出するために使用

作ったもの

最終的にこんな感じで結果を表示するプログラムを作りました。

f:id:Shun40:20181111112231p:plain:w500

プログラムはこちら。

github.com

使い方

1. プログラムのダウンロード

上記GitHubリンク先のリポジトリgit cloneするか、ZIPダウンロードするなりでプログラムをダウンロードします。

2. スクレイピング

web_scraper.pyを実行し、スクレイピングをおこないます。-nオプションで、各サイトからのセール記事取得件数Nを指定できます。スクレイピングするWebサイトの数をMとすると、N * M個のセール記事を収集した後、そこから終了済みのセール記事を差し引いたものが最終的な収集結果となります。収集結果はarticles.pickleへ出力されます。

$ python3 script/web_scraper.py -n 100
> Scraping is started. (Run parallelly)
> HTTP GET Request takes 0.353474 [sec] (source : https://computermusic.jp/category/セール/)
> HTTP GET Request takes 0.348843 [sec] (source : https://sawayakatrip.com/category/dtm・daw関連記事/sale)
> HTTP GET Request takes 0.546751 [sec] (source : https://computermusic.jp/category/%E3%82%BB%E3%83%BC%E3%83%AB/page/2/)
⋮
> HTTP GET Request takes 1.683039 [sec] (source : http://melodealer.com/vstbuzz-bigkick-by-plugin-boutique-50per-off-sale/)
> HTTP GET Request takes 1.492022 [sec] (source : http://melodealer.com/vstbuzz-96-off-ultimate-rmx-30k-bundle/)
> HTTP GET Request takes 1.583438 [sec] (source : http://melodealer.com/ik-multimedia-20year/)
> Scraping finished. Scraping takes 189.67374396324158 [sec]
> Results saved to DTMer's-Wallet-Breaker/articles.pickle

3. HTML生成

html_generater.pyを実行し、収集結果を表示するためのHTMLを生成します。生成の際、2.で出力されたarticles.pickleが必要です。-ob(open browser)オプションをつけると、生成されたHTMLをWebブラウザで自動で開いてくれます。なお、HTMLファイルはhtmlディレクトリの下に生成されます。

$ python3 script/html_generater.py -ob

4. Webブラウザで閲覧

3.で-obオプションをつけると、全セール記事のページが表示されます。

f:id:Shun40:20181111114801p:plain:w500

右側に表示されているタグをクリックすると、タグによる絞り込み結果が表示されます。絞り込みに使ったタグは、セール記事件数の右側に表示されます。("YAMAHA"タグで絞り込みした例↓)

f:id:Shun40:20181111114805p:plain:w500

各タグの()内の数字は、そのタグが付与されたセール記事の件数です。

タグ付けについては、tags.txtに書かれたタグ文字列が読み込まれ、記事のタイトルまたは説明文にタグ文字列が含まれているとそのタグが付与されます。どのタグにもマッチしなかった記事には"None"タグが付与されます。

ユーザによってtags.txtへ新しいタグを追記することも可能です。

None
Ableton
Ableton Live
Accusonus
Addictive Drums
Addictive Keys
⋮
ドラム
バイオリン
ブラックフライデー
ベース
ボーカル
ピアノ

ページのフッターにはスクレイピングしたデータの最終更新日時が表示されます。データが古いと感じたら2.のスクレイピングを再実行しましょう。

f:id:Shun40:20181111114812p:plain:w500

感想

大したことはやっていないのですが、大量のセール情報をタグで絞り込み検索できたりするのは割と便利なんじゃないでしょうか。

プログラムについて話すと、HTML出力するコードはかなり泥臭い実装になっちゃったので、Webフレームワークとか使うともっとスマートにできるのかもしれません。(素人並感)

あとはWebサーバだの使ってデプロイすればちゃんとしたWebアプリとしても動かせそうだけど、そんな気力はありませんでした。(無能並感)

最後に

一人でも多くのDTMerの破産をお祈り申し上げます。