特集記事

【仕様】仮想通貨ニュースまとめ・分析サイト「COTONOCA」【Python・ウェブアプリ】

おはようございます。フェネックです。

この記事では、個人開発した仮想通貨ニュースまとめサイト「COTONOCA」の仕様をお伝えします。

COTONOCAの実装や開発にご興味を持ってくださる方や、もしかすると一緒に開発してくださる方、それと、Pythonでスクレイピングするツールを制作されている方向けに書かせていただきます。

プログラミングしたことないよ、って方にはぜんぜん楽しくない、難しいお話になると思います。これから楽しくないお話をしますので、逃げてください! 転ばないでください!

動作環境

05_V1.0_動作環境

レンタルサーバ

サイトを構築したレンタルサーバはConoHa Wingです。ConoHa VPSではありませんので、su権限は使えません。ConoHaはCloud Linux、Apacheで実装されていて、元から入っているPython2/3を動かせます。

ソフトウェア

当サイトではFlask、matplotlib、Requests、Beautiful Soupなどを用いるため、Anacondaを使っています。PythonもConoHaの初期装備ではなくて、Anacondaパッケージ内にあるライブラリを利用しています。Anacondaのインストールは、ConoHaサーバにpyenvをインストール後に行いました。インストーラからだとエラーが起きてインストールできなかったため、GitHub経由で行いました。

(開発されている方へ:numpy利用中に一度だけ起きた現象なのですが、プログラムをまったく変更していないのに突然「numpy C-extensions failed」でプログラムを実行できなくなったことがありました。numpyの再インストールするとエラーが解消されましたので、もし同じ状況に陥ったら試してみてください。)

WSGIサーバ

Flaskに組込まれているWSGIサーバは開発用で、本番環境で使うのは安全ではないそうなので、公式推奨のWaitressというWSGIサーバを利用しています。condaコマンドでWaitressをインストール後、Flaskプログラムの末尾に書くおまじない「if name == ‘main’:」周辺の記述を数行変更するのみで対応できました。

ウェブページ初回アクセス時は「.htaccess」がCGIプログラムを叩き、CGIがFlaskプログラムにgetメソッドを送信して画面表示させています。入力フォームがsubmitされた場合は、CGIからPOSTメソッドが送信され、Flaskプログラムで受け取ります。そのため、CGIプログラム内に「if os.environ[‘REQUEST_METHOD’] == ‘GET’:」のような判定文を設けて、GET/POSTの送信処理を分岐させています。

定期自動実行

スクレイピングの定期自動実行はLinuxコマンドのcronで行なっています。ConoHa Wingのサーバ管理画面には「ジョブスケジューラ」というcronコマンドを簡単に設定できるメニューがあって、それを使って実行日時・実行ライブラリ(AnacondaのPython)・実行ファイル(mainプログラム)を指定しています。

(開発されている方へ:ConoHaのGUIを使わずに、SSH接続後にCUI操作で設定を変更してもGUI側に即時反映されたので、cronを使い慣れている方はそちらのほうが設定しやすいかもしれません。)

操作表示機能

01_V1.0_操作表示

操作対象

サイト選択 (Site Select)

チェックボックス。複数選択可能。
「ALL」のチェックがON/OFFされたとき、その他項目のON/OFFが即時で連動します。

仮想通貨検知 (Detect crypto)

ラジオボタン。「Include」「Irrelevant」「Both」の三択。

検索範囲 (Detect range)

ラジオボタン。「Direct only」「Include indirect」の二択。
ラジオボタンじゃなくても大丈夫なのですが、見た目がわかりやすいのでそうしています。

カテゴリ選択 (Category)

セレクトボックス (プルダウン)。「ALL」「DeFi」「NFT」「Web3」「CBDC」の五択。

銘柄検索 (Asset)

テキストボックス。和英とも30文字まで入力できます。
入力された英語の小文字は大文字に変換されます。

確定 (Apply)

ボタン。入力フォームの全設定を確定、画面表示に反映します。

初期化 (Restore All)

ボタン。入力フォームの全設定を初期状態に戻し、画面表示に反映します。

【TBD】アセット個別削除

ボタン。複数表示可能。
Asset(ティッカー)設定中のみ、Assetに設定したテキスト文字列のボタンが表示されます。
ボタンを押下すると、該当する銘柄のAsset設定が解除され、ボタンは消えます。

※将来対応予定。V1.0では押すことのできないボタンが表示されます。

表示判定

and 条件

入力フォームの設定はすべて&条件で画面表示に反映されます。
Asset(ティッカー)未設定の場合に限り、Asset設定を無視します。

or 条件

「検索範囲 (Detect range)」->「Direct only」の場合、直接用語から検知した銘柄を表示します。
Include indirect」の場合、直接用語から検知した銘柄に加え、間接用語から検知した銘柄も表示します。

入出力機能

入出力

02-01_V1.0_入出力_IO

種類

データベース、ログファイルの種類は以下のとおり。

記事データベース:サイト上に表示するニュース記事の情報をまとめたデータベースです。
検索データベース:アセット・カテゴリを検索するときに用いる、検索用語を記載したデータベースです。
検索ログ:フォームで入力した内容を保存するログです。サイトの品質・性能改善に利用します。
記事ログ:「記事データベース」の内容に加え、ニュース本文を保存するログです。AIによるテキストマイニングに将来利用予定です。

I/O

データベース・ログファイルの入出力されるタイミングは次のとおりです。

記事データベース:(出力) メインプログラム実行時 / (入力) 初回アクセス時・ブラウザ更新時
検索データベース:(出力) 出力対象外 / (入力) メインプログラム実行時
検索ログ:(出力) 検索時・ブラウザ更新時 / (入力) 入力対象外
記事ログ:(出力) メインプログラム実行時 / (入力) 入力対象外

フォーマット

02-01_V1.0_入出力_フォーマット

CSV

記事データベース

親ファイル「_all_news.csv」と、各サイト名の子ファイルで構成されます。
親ファイルにはすべての子ファイルのデータが含まれます。
上図は1記事(1行)に対するデータフォーマットです。

検索データベース

「直接用語」「間接用語」「カテゴリ」の3つのファイルに分割されています。
あらかじめ編集された用語のみを用いて検索するので、用語の動的取得は行われません。
上図は1銘柄、または1カテゴリに対するデータフォーマットです。

LOG

検索ログ

上図は検索1回に対するフォーマットです。

記事ログ

上図は1記事に対するフォーマットです。

グラフ描画機能

03_V1.0_グラフ描画

種別

対象期間の各銘柄のボリュームを表す

円グラフ: 1ヶ月/6ヶ月/12ヶ月で記事数の多い銘柄トップ10を表示します。
【TBD】折れ線グラフ:将来対応予定です。

【TBD】各サイトの運営拠点における、銘柄の割合を表す

将来対応予定です。

動作

生成タイミング

スクレイピング自動実行時と、サイトアクセス時・表示設定変更時に画像が生成します。

画像出力

スクレイピングの定期自動実行時のみ。このとき出力された画像ファイルは現在未使用です。将来サイトの動作軽量化のために利用することがあるかもしれませんし、ないかもしれません。
ユーザ操作時は画像をファイル出力せずに、Base64のデータ送受信のみが行われます。

補助機能

04_V1.0_補助

下記2機能とも、ローカル環境でのみ利用する、開発者向けのサイト制作補助機能です。
どちらも、ニュースサイトまとめ・分析サイトには組み込まれておらず、別プロジェクトで管理されています。

アセット画像取得

仮想通貨銘柄の画像をCoin Market Capから自動ダウンロードするツールです。
Seleniumで実装されており、Clome Driverを用いて画像を一括取得します。
ツール利用時点の全銘柄(約8000)の画像を、すべて取得できることを確認済みです。

検索ワード取得

仮想通貨銘柄の「名前」と「ティッカー」をCoin Market Capから取得するツールです。
画像取得同様SeleniumとClome Driverで動作します。
こちらもすべての名前・ティッカーを取得できることを確認済みです。

さいごに

ウェブサイトCOTONOCAに関するご連絡は、わたしのTwitterまでお願いします。

当ブログのフォームからでも大丈夫ですが、Twitterのほうがお早めにお返事できると思います。

開発者のかお

さいごまで読んでくれて、どうもありがとう!