歌の練習用に歌詞カード作るの
大変じゃない!?
かぼちゃの私も弾き語りでライブやってました!
今までは直接Wordに歌詞書いて印刷してました!
楽に作りたいな~
ていうのと、その時Pythonが気になってて
Pythonで何か作ってみたいな~
って思ってたから
スクレイピング技術をPythonで身に付けて
歌詞カード作りを楽にしよ~!
と言う結果に。一石二鳥!
まあ気になる人は参考にして見てね!
スクレイピングツールの概要
全体の設計
今回は うたまっぷ さんから
歌詞をスクレイピングさせてもらいました!
①Pythonプログラム
・歌詞情報をスクレイピング
・DBに保存
を行って
②DB
曲を選んで歌詞ファイルを作成!
てかんじですね!
実行環境と各ファイルについて
■環境
OS:Windows10 64bit
Python:Ver 3.8.3
■Pythonファイル
EXEファイルに変換!
■DB
Accessを使いました!
■歌詞ファイル
txtファイルで生成!
Scrapyで覚えたプログラムの工夫!
Scrapyはフレームワークなので
とても作りやすくて便利でした!
全体の作り方は公式ドキュメントや
他の記事にもたくさんあるので割愛!
自分がつまずいた部分を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に設定しないといけないので注意です!
この辺りも含め下記ドキュメントを参考にしてね~!
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で初めてツール作れて嬉しかったのと
色々めちゃくちゃ勉強になった!!
もっとできる様に頑張ります!