PythonのScrapyを使って歌詞カードを自動で作ってみた!

歌の練習用に歌詞カード作るの
大変じゃない!?

かぼちゃの私も弾き語りでライブやってました!
今までは直接Wordに歌詞書いて印刷してました!

楽に作りたいな~
ていうのと、その時Pythonが気になってて
Pythonで何か作ってみたいな~
って思ってたから

スクレイピング技術をPythonで身に付けて
歌詞カード作りを楽にしよ~!

と言う結果に。一石二鳥!
まあ気になる人は参考にして見てね!

おすすめ
動画で見たい方はコチラ

スクレイピングツールの概要

全体の設計

今回は うたまっぷ さんから
歌詞をスクレイピングさせてもらいました!

①Pythonプログラム
・歌詞情報をスクレイピング
・DBに保存

を行って

②DB
曲を選んで歌詞ファイルを作成!

てかんじですね!

実行環境と各ファイルについて

■環境
OS:Windows10 64bit
Python:Ver 3.8.3

■Pythonファイル
EXEファイルに変換!

DB
Accessを使いました!

歌詞ファイル
txtファイルで生成!

Scrapyで覚えたプログラムの工夫!

Scrapyはフレームワークなので
とても作りやすくて便利でした!

全体の作り方は公式ドキュメントや
他の記事にもたくさんあるので割愛!

自分がつまずいた部分を3つに絞って紹介!

かじむー

Pythonで開発自体初めてで作るのに3か月位かかったからホントはもっとめちゃくちゃある。。笑

parseへのパラメータ渡し!

Spiderを実行するとリクエストが行われますよね!
そのレスポンスに対して処理を行うメソッド
parseメソッドですよね!

今回parseメソッドが2つありましてね。
と言うのも、レスポンス処理が2種類ありまして。

1つ目は、あるアーティストの
曲一覧ページへリクエストした際の
レスポンスを処理する「parse
各曲の遷移URLをGetするparse

2つ目はクローリングしてGetした遷移URLに
それぞれリクエストした際の
レスポンスを処理する「parse_words
曲名や歌詞を抽出してItemに登録するparse

何に困ったか?と言うと

parse_wordsをコールバックで呼び出す際に
「歌手名」の情報を渡したかった!!!

でもコールバックに引数は持たせられない
という事で、調べた結果!

メタ情報に持たせろ!という事でした!
なるほどです!

これで「あいみょん」と言う情報を
parse_wordsに渡す事が出来ました!

リクエスト前にURLをチェックする

既にDBにある曲の歌詞は
リクエストしたくない!

でもどうやってそれを伝えようか…?

という事で
リクエスト直前にそれを伝える為に
DownloaderMiddleware拡張して
リクエストを無視する例外IgnoreRequestを使いました!

色々省いて書きましたが
拡張したDownloaderMiddlewareのクラス内に
こんな感じのprocces_requestメソッドを作りました!
※このメソッドはDownloaderMiddlewareのインターフェイス

リクエストを無視したい場合は
IgnoreRequestの例外を発生させます!

リクエストを続行させたい場合は
Noneを返します!

自分で拡張して作ったDownloaderMiddlewareは
setting.pyに設定しないといけないので注意です!
この辺りも含め下記ドキュメントを参考にしてね~!

※参考 例外ドキュメント:IgnoreRequest

ScrapyプロジェクトをEXEファイルに変換

まずは
EXEファイルに変換してくれる
Pyinstallerをインストールしましょう!

そしてScrapyを実行させるrunner.pyを作成!

作成は場所はココ!

参考:Scrapyのクローリング処理を外部のスクリプトから実行する

最後に1つのEXEファイルに集約したいと思います!

こちらの記事を参考に
ScrapyをPyinstallerでexe化する
shellに以下コマンドを実行させました!

※モジュールが足りない!って出たら –hidden-import モジュール名 で追加してね
※上記設定を書込んだrunner.sepcを作って pyinstaller runner.spec 実行でもOK

そして1つのEXEファイルが出来上がったのだが…

プロジェクト内では動くが
他のフォルダーに移すと動かない!!!
なにやらプロジェクトが見当たらないというエラー

そこで 引数 –add-binary を使ってEXEファイルに
プロジェクトを組み込むことに!

※–add-binary 元の場所;移動先
※移動先どこやねん?て人は一回 –onefile 外して実行したものを見ると理解できます!

よし!出来上がったEXEファイルを
別の場所に移して実行してみると…
指定したスパイダーが見つかりません!
と言われ再び実行できず…

初めの段階でsetting.pyが読込めていないらしい!

おそらく原因はscrapy.cfg
プロジェクトのルート内に無いから!

1度–onefile 外してEXEがきちんと動く状態を作った後
その状態を引数を使って作り –onefile すればいける!

とあれこれ試したけど結局断念。笑
–onefileするとダメなんだな…。

今のところEXEファイルとscrapy.cfgの
2つで1セットという状態に。

出来上がった歌詞カード

Accessにあいみょんの楽曲が入ってきました~!

あいみょんの裸の心を選択してOKすると

こんなテキストファイルが生成されます!

これを元に作ったオリジナルの歌詞カードは・・・

まあこんな感じ!!

Pythonで初めてツール作れて嬉しかったのと
色々めちゃくちゃ勉強になった!!

もっとできる様に頑張ります!