BeautifulSoupだけを使って歌詞をスクレイピングしたい

BeautifulSoupだけを使って歌詞をスクレイピングしたい

このページを読む前に必ず確認してほしいこと

と言っても、そこまで張り詰めなくても構いません。著作権法とスクレイピングに関する利用規約についてです。

まず、著作権法について。歌詞は基本的に著作者がどのように扱うかということについて権利を持っています。ですので、勝手に商用利用したり、著作者に不利益が発生するようなことをしてはいけません。歌詞をスクレイピングする際は必ず「情報解析の範囲内」でしましょう。

次に、スクレイピングに関する利用規約について。昨今、サーバーに高負荷をかけるなどして、サイトを運営する人に対して困ったことが増えてきています。利用規約を読めば「当サイトではスクレイピングを禁止しています」などと記載されていることも多いので、そのサイトでスクレイピングをする前には必ず、利用規約をよく読み、その上でスクレイピングをしましょう。

本題

「この歌詞良いなあ、歌詞をコピーしてみんなと共有したい!」と思ったことは誰しもあると思います。

ちょっと前までは、カーソルを合わせてコピーしてペーストするといったことができたのですが、ここ最近、できなくなってきましたね。たぶん、スマホが普及し始めたあたりからだと思います。

それでも歌詞をコピーしたいといって、わざわざ毎回のようにChromeとかで「ソースを表示する」を押して、HTMLをコピーするのは面倒です。

今回はこの部分を自動化して、快適に歌詞を取得するプログラムを作ってゆきたいと思います。

使用するメソッド等

本当にBeautifulSoupだけです!

あとは標準搭載のもの(requestsとかでHTMLを取得する)がありますが、Python3が入っていれば、なんとでもなります。

  • BeautifulSoup

とりあえず、コード

import requests
from bs4 import BeautifulSoup

def main():
    # URL の指定
    url = "https://utaten.com/lyric/%E5%A4%A7%E8%B2%AB%E5%A6%99%E5%AD%90+%26+%E5%9D%82%E6%9C%AC%E9%BE%8D%E4%B8%80/%E8%B5%A4%E3%81%A8%E3%82%93%E3%81%BC/"
    # ページの取得
    html = requests.get(url).text
    # HTML の保存
    with open("config.html", mode="w", encoding="utf-8") as file:
        file.write(html)

    # BeautifulSoup にかける
    soup = BeautifulSoup(html, "html.parser")

    # 記事のメインの部分を指定
    article = soup.find("article", class_="contentsBox movie_box")

    # タイトルの取得
    span = article.find("span", class_="movieTtl_mainTxt")
    title = span.text[1:-1]

    # 作者の取得
    dl = soup.find("dl", class_="lyricWork")
    dds = dl.find_all("dd")
    lyricist = dds[0].text
    composer = dds[1].text

    # 歌詞の取得
    div = soup.find("div", class_="hiragana")
    div.find("span", class_="rt").extract()

    # 出力
    print(title)
    print(lyricist, composer)
    print(div.get_text())

if __name__ == '__main__':
    main()

今回は山田耕筰氏の「赤とんぼ」を取得するプログラムです(著作権的な関係で)

これを実行すると、

$ python tool.py
赤とんぼ
三木露風 山田耕筰

夕焼小焼の、赤あかとんぼ
負おわれて見みたのは、いつの日ひか

山やまの畑はたけの、桑くわの実みを
小籠こかごに摘つんだは、まぼろしか

十五じゅうごで姐あねやは、嫁よめに行いき
お里さとのたよりも、絶たえはてた

夕焼小焼ゆうやけこやけの、赤あかとんぼ
とまっているよ、竿さおの先さき

このように、歌詞が取得できます。

コードの説明

今回はUtaTenのサイトから歌詞を取得しました(利用規約的な関係で)

まず、URLの指定で、URLを指定します。これをimport sysなどを使って標準入力にするのもアイディア的に良きだと思います。

次にHTMLを取得します。これをしなければスクレイピングにならない!

それでお待ちかね、BeautifulSoupによって、歌詞をスクレイピングしやすい形式に変えてゆきます。これ以降ではタイトルの取得や作者の取得、さらに歌詞の取得をしてゆきます。

歌詞の取得は少々手間取りました。というのも、UtaTenに載っている歌詞はルビなどのデータをどうやって消してゆこうか迷ったからです。

これを標準搭載のreなどでやろうとすると、まあ大変!(昔、BeautifulSoupというものを知らなかったからそうやったことがあった)

とりあえず、便利になるところは便利にしてゆくべきだということで、今回はBeautifulSoupを使いましたが、環境依存とかあったりメソッドを無駄にいれたくなかったりする方は、reで試みても悪くないと思います。

他の歌詞サイトでも同様ですが、HTMLとのにらみ合いっこでなんとかなるものです。スクレイピングで歌詞をラクに取得したい場合は、HTMLとの戦いだと思ってください。

最後に

スクレイピングは数をこなすことだと思います。だから、利用規約が許す限り、どんどん練習してゆくことが大切だと思います。

とはいえ、利用規約はどんどん厳しくなってきているし、そろそろ、スクレイピングが全面的にダメになる時代が来るかもしれません。

それでも、ここで学んだことは、きっとどこかで活用できることがあると思います。スクレイピングがダメになっても、Pythonのことは嫌いにならないでください()