ただの風邪。

音楽のことを中心にいろいろと書いています。

■カテゴリ別ショートカット

レビュー(音楽) レビュー(本) エッセイ、考えごと

ウェブスクレイピングで77年分のビルボード年間トップ100を取得してみた。

f:id:tortoisetaughtus:20170620200808j:plain

 先日の記事では、The McGill Billboard Projectの提供する楽曲データセットを使ってちょっと遊んでみたわけだが、せっかくならもっと大局的なデータが欲しい。そこで、Pythonでのウェブスクレイピングによって1940年から2016年までのビルボード年間トップ100を取得してみた。

billboardtop100of.com

 ソースは上のウェブサイトになる。APIなどの提供はなく、公式のプロジェクトなんだかなんなんだかよくわからない殺風景なサイトだが、そのぶん構造は単純で、最初に手を出すにはぴったりだった。ソースを見てみるとランキング表示部分はテーブルでレイアウトされており、チャート順位・アーティスト名・曲名の3要素を取り出すのはいかにも容易そうだ。

 使用したライブラリは、requests、BeautifulSoup、sleep、csvの4つ。ウェブとの通信用、HTMLのパーシング用、サーバーを叩きすぎないためのタイマー用、そしてデータ出力用。

 手順としては、

  • 連番を用いてイージーにURLを生成
  • URLが存在するかどうか念のためチェック
  • request.get()でHTMLデータを取得してBeautifulSoupに渡す
  • 必要なデータを含んでいるタグ(<td>)を列挙し、リスト化
  • 長いリストを3つの要素ごとに分割して、2次元化([a,b,c,d,e,f, …]→[[a,b,c],[d,e,f], …])
    • ここでタグや空白、改行などの不要な要素を主にstrip()などできれいにしてあげる。
  • 2次元リストは一発でCSVにぶち込めるので書き込むだけ。
  • あとは最後の年に至るまで延々ループ(タイマーで適度にアクセスの間隔は確保)

 と書くといかにもすんなりいったみたいだけど、一日潰れてしまった。*1さらに今見返したら、もとのコードのスパゲッティ加減にうんざりしてしまった。それでも動いたんだから偉い……

 あえて晒すほどではないが、データはこんな感じ。3つのカラムからなるシンプルなCSVにすぎない。

docs.google.com

 さて、アーティストと曲名がわかったからには正確なリリース年や曲長、楽曲の構造なども収集していきたい。いろいろ探してみたけど、SpotifyのAPIGeniusのAPIが使い良さそうだった。とくにSpotifyが提供するメタデータには曲長やBPM、拍子のほかに、もし活用できれば面白い項目、たとえば「踊れるかどうか(danceability)」とか「明るいか暗いか(valence)」といったものが存在する。恐らくAIがプレイリストを作成するときのためにオーディオを独自にアナライズしたものだろう。一方Geniusは歌詞そのものにはアクセスできないものの、アノテーションメタデータを活用可能。スクレイピングも考慮すると、Geniusの提供するリリックにはほとんど必ず[Verse]とか[Hook]とか[Chorus]といった構成上の役割が併記されていることは特筆に値する。

 以上、報告まで。コードは冗長な部分を整理したものを以下に載せておきます。

gist044b9f2fdda3bdb78ab0c77515698078

*1:加えて、いくらかのページはテーブル化されていないテクスト形式になっていたために、めんどくせーなーと思いつつそれはそれで処理した。こちらは割愛。