無料漫画のおまとめ更新通知サービス

このページは個人開発の記録です。

スポンサーリンク

要件

この要件は随時更新します。

  1. 既存の無料で読める(合法)漫画サイトをクローリングしてデータを集める。
  2. クローリングしたデータを取得出来るAPIを準備する。
  3. APIからブラウザに更新情報として表示する。

この要件をそれぞれ別リポジトリにして、独立した形にしたいと思います。もし人気が出てきたりした場合等、バックエンドはAPIにしておきたいと思います。その場合、フロントはVue.jsで初SPAにしたいと思います。Vue Routerを使用予定です。最終的にはアプリ版もリリースしたい為、バックエンドはAPIにしました。

また、AWSの知見もたまってきていますので、なるべくAWSを使用したスケーラブルな環境で立ち上げたいと思います。費用はかかりますが、これはもう必要経費として計上してガチでやっていこうかと思います。

3.の細かいところとしては、

  • お気に入りの漫画の更新情報を見れる
  • お気に入りの漫画の更新情報の通知を受け取れる(LINE、メール
  • 盛り上がりグラフ(Googleトレンドのグラフを反映
  • 盛り上がりグラフ(twitterでタイトル検索して前日の件数を記録しておき、グラフを反映
  • TOPに月間人気ランキング、週刊人気ランキングを出せる
  • Amazonの人気ランキングを出す
  • 他プラットフォームの電子書籍ランキングを出す

ハードル上げすぎかもしれませんがとりあえずやってみます!

それではよろしくお願いいたします。

(2021/1/20更新)

2020/10/24~2020/12/3の開発記録

どのようなサービスにするか、競合分析をして、実現出来そうなイメージをふんわり固めました。

概要設計の1つとしてDB設計をしました。ER図を描いて必要なテーブルと項目を洗い出しました。クロールログテーブルがかなりふわっとしてしまいました。ひたすら溜め込むログなので、とりあえず突っ込むテーブルになりました。他、コミックテーブル、ユーザテーブル、メディアテーブル等はきっちり描けるところなので細かい項目まで洗い出せました。

このフェーズが一番わくわくしますね。このプロジェクトは自分でやりますが、今後流れに乗って来たら概要設計だけやって外注してみたいです。

どのような技術で構成するかについても少し検討しました。

今回AWSをなるべく駆使してスケーラブルで安定稼働出来る構成を作っておきたいと思っていますので、クローラーはLambda(Python)にしました。Goも対応しているのですが、まだ経験がない為今回入れると時間取られそうな為外しました。今回はきっちりと集客・売上を上げる為に、改善を積み重ねられる状況を大事にしたいと思った為です。

LambdaはCloudWatchEventでスケジューリングします。AWS Batchもありますが、簡単なLambdaにしました。

DBは最初からAWS RDSのAuroraを選択します。(高そう)クローリングログはS3に入れてストリーミングとか考えましたが、ログだけに開発時間がとられるのもモチベーションが沸かないので、最初はDBに入れる方向で進めます。

APIはAWS API Gatewayを選択します。EC2にLaravelを入れようか迷いましたが、スケーラブル方針なので思い切ってAPI Gatewayにしました。(高そう

ドメインはRoute53で取得します。

SSLはAWS Certificate Managerにします。

と、これだけ駆使すると実際の金額的な不安がありますが、とりあえずスタートしたいと思います。

今回6時間 計6時間

2021/1/20~2/23の開発記録

windowsで開発しようか迷いましたが、macで開発しようと思います。

とりあえずPython3.7をインストールしました。

AWS自宅環境のIAMユーザを作成し、MFA設定をしました。スマホが壊れた場合を考慮して、Chrome拡張機能のAuthenticatorを使用してバックアップしました。

クローラーの開発に取り掛かる為、集めるデータサンプルを先ず手動で取ってみる事にしました。いくつかコミック単位で取ったところ、そもそもページの更新情報だけでなく、新連載コミックも膨大になるのでクローリングしないと厳しい事がわかりました。それに伴いER図を修正しました。クローリング見積りが一気に2倍になった瞬間でした。

Lambda→RDSを実現する為のAWS構成調査を進めました。久々にVPC設定やると何が必要だっけ?みたいなど忘れしてしまい、昔やったRailsをAWSにデプロイした記録をあさり直しました。以下参照

【まとめ】AWSにRuby on Rails の環境を構築するまでの手順
AWS(Amazon Web Services)にRuby on Rails の環境を構築するまでの手順をこのページにまとめていきます。 ...

他、SPA+バックエンドのAWS構成まで概要が見えてきました。現状の予定構成としてはこうです。

Route53+ACMでドメインとssl

CloudFrontをCDNとして、基本S3にして、S3に設置したVue.jsが同ドメインのAPIをパス/apiなどで呼び出します。同ドメインなのでCloudFrontに再度アクセスが行って、/apiのパスの場合はAPI Gatewayを見るように設定します。

API GatewayはAPI種別でLambdaを呼び分けます。(最初は1つで進める)

LambdaはプライベートサブネットのRDS(Aurora)を呼びます。

という感じです。現状では。クローラーの部分だけの開発なのに全体まで考えてしまいましたが、少し先が見通せた感じがしてきました。

RDSをAuroraにしようとしましたが、$30/月はするのでMySQLにしました。

使った事がなかったのですがRDSの接続情報をコードに書かずに済むAWS Secrets Managerなるサービスを見つけました。

Lambda から RDSへ接続するプロトタイプを作っていますが疎通確認に4時間ほど構成に時間がかかりました。

設計した各種テーブルをCREATEしました。

AWSの構成を変えました。LambdaからRDSへ接続するのにProxyを使用する事にしました。

RDS ProxyがDBログイン情報を保存したSecretsManagerを使用し、LambdaがRDS Proxyを使用するので、LambdaにはDBログイン情報が必要ないと思って苦戦していたのですが、これは必要なようです。どうも納得がいかないのでAWSサポートプランに入って問い合わせ中です。

(返答ありました。RDS ProxyがRDSに接続するには、SecretsMangerを使用出来ますが、LambdaがRDS Proxyを使用するのにIAM認証であればDBログイン情報は必要ありませんが、IAM認証を使わない場合はDBログイン情報は必要です。IAM認証のコネクション上限でどちらにするか決めれば良さそうです。)

IAM認証を使用すれば不要となりますが、IAM認証だとリクエスト上限がある為避けました。

LambdaからRDS Proxyを使用してRDSに接続するまでの事を以下の記事にざっくりアウトプットしておきました。

AWS Lambda > RDS Proxy/Secrets Manager > RDS 構成の概要手順
LambdaからRDSに接続しようとした際のベストプラクティスを模索して辿り着いた1つの箇所として記録しておきます。 用途としては、...

合わせてセキュリティグループやIAMロール・ポリシーも全て見直し、構成図にもセキュリティグループとIAM情報まで記載したものを作りました。絶対忘れるし重要な設定なので、個人開発でもここまで書いた方が良いと感じました。疲れた。

とは言え、ようやくLambdaからRDSへ接続出来るしっかりした枠が出来ました。

次回からはようやくクローラーのコードを書けるはずです。

と思って書いてみたところ、LambdaからDBへのアクセスは出来るもののインターネット接続ができない事に気づきました。NATゲートウェイを設置していなかった為だったのでまたまた構成をいじりました。

また、PythonでLambdaを書く場合のデプロイについて以下の記録をしておきました。

AWS LambdaにPythonのライブラリを含めて環境構築する手順
AWS LambdaにPythonのライブラリを含めて環境構築する手順を記録しておきます。色々方法あると思いますが、手っ取り早い方法です。...

今回24時間 計30時間

2021/2/24~2021/3/17の開発記録

前回までで、無事DBへのアクセスとインターネット接続が出来たのでクローラーの開発に入る事が出来ました。素のpythonを使用しているため、DBアクセス用のクラスを作成するところを先に作っています。

途中までやって気づきましたが、LambdaでRDS触るのは本当に少しだけならLambdaで良いと思うのですが、がっつり触るとするとフレームワークを自作する事になりかねないなと思いました。Lambdaにフレームワークを入れるのはちょっと違うようにも感じます。そうするとやっぱりEC2でRDSを見るようにした方が良いのではと思ってきました。

RailsをEC2に入れるか検討してみます。

と思いましたが、先ずは開発環境をDockerで立ち上げます。posgreでやろうと思いましたがMySQLになれているので入れ替えたりしました。rails6でMySQL5.7にしました。

railsはこれだけ普及しているのにまだ環境構築がスムーズにはいかないですね。イメージで保存されているものをダウンロードするだけで環境構築出来るレベルのものがもっと見つかりやすくなってほしいです。どこかにあると思うので。

マイグレーションで初期テーブルを構築しました。久々にrailsを触った為思ったより時間がかかりました。とは言え、業務でやってたとしたら2日間で出来たと考えたら悪くはないかと思いなおしました。

railsでバッチ処理を使用する為の調査をしていました。runnerとtaskがあるようですが、クロールバッチとしてはtaskの方が合ってるかなと思いtaskで進めようとしています。ようやくクロールバッチを書き始められます。

rake taskでバッチクローラーを2つ作りました。ActiveRecord(ORM)の使い方も思い出しながら進めました。とりあえずモデルも作ったので一覧や詳細ページでデータ取得するAPIはだいたい出来てしまいました。/api/v1としました。

次回からはいよいよ画面側を作っていきたいと思います。フロントはVue.jsでバックはrailsです。

アウトプットとしてRailsのDocker開発環境構築手順を記録しておきました。

Ruby on Rails6・MySQLの開発環境の構築手順【Docker】
DockerでのRuby on Rails version6 APIモード・MySQLをDBに使用してのバックエンド環境を構築しましたので...

今回26時間 計56時間

2021/3/23~2021/5/12の開発記録

ローカルでのバッチとAPIを利用したローカルでの画面(Vue.js)を構築しようと思います。

Vue.js, VueRouter, Vuexの環境を構築しました。ローカルのAPI・Rails環境に向けて疎通確認をしようとしています。

開発環境構築手順を記録しておきました。

Vue.js+VueRouter+Vuex開発環境構築手順
ローカルでのVue.js+VueRouter+Vuexの開発環境構築をしたので記録しておきます。 検証環境バージョン Node...

SPAサービスのフロントエンド側のVue.jsにおいて、ajaxにaxiosを使用したところ、 CORSポリシーに基づきクロスドメインのエラーとなりました。 開発環境だと、localhost:8080 と localhost:3001 を使用している為別ドメイン扱いとなった為です。これの対応を以下に記録しておきました。

Vue.js axiosのエラー対応「No 'Access-Control-Allow-Origin' header is present on the requested resource」
SPAサービスのフロントエンド側のVue.jsにおいて、ajaxにaxiosを使用したところ、ブラウザの以下のエラーが表示されました。 ...

フロント側をゴリゴリと作成しています。それに合わせてAPI(Rails)側も作成しています。クローリングバッチの改修も必要になりました。

Vue.jsについて記録記事も記載しました。

Vue.js APIで取得したデータでmetaタグ title, description, keywords を設定する
Vue.jsにあまり詳しくないので勉強しながらwebサイトを作っております。 vue-metaやvue-routerを使用する方法も...

今回46時間 計102時間

2021/5/19~の開発記録

SEO関係のタグ

フロントエンド(Vue.js)側にてSEO関係のタグを設置しました。(title,description,keywords,h1)

新着ページを追加する為、バッチの改良と、バックエンド(Rails)側と、フロントエンド(Vue.js)側を開発しました。

ページャー機能

ページャー機能を実装しました。vuejs-paginateを使用しようとしましたが、全件フロント側に渡す方法に見えた為、Rails側でページ引数に応じて返すような形にしました。バックエンドだけ設置したので、フロントはやっぱりvuejs-paginateを使用する事になるかもしれない余白を残しています。

Googleトレンド

漫画のコミック詳細ページに、該当コミックの分析データを盛り込もうとしています。手始めにGoogleトレンドのグラフを貼ろうとしています。APIが公開されているので動的にscriptタグを生成する形です。

非同期でバックエンドから取得したデータに対してGoogleトレンドグラフを使用したい為、Vue.jsの処理呼び出しタイミングの理解が必要でした。

Vue.jsの理解度が低く、公式ドキュメントや検索してだいたいクリアしてきたのですが、コードが冗長になってきたり、使い方あってるのか疑問に感じたりして、改善点を模索しています。

GoogleTrendコンポーネントを作成しました。親となる漫画詳細ページで漫画情報をバックエンドのAPIから非同期で取得した漫画タイトルをキーワードとして、GoogleTrendコンポーネントに渡すようにしました。

コンポーネントはpropとして受け取ったキーワードをwatchして、Googleトレンドのグラフを描画するscriptを実行します。

ロードのタイミング調整が大変でした。Vue.jsでどういうイベントを使用すれば良いのか色々試してwatch、computed、createdを組み合わせて使用する事で、どんなタイミングでもエラーとならない状態になりました。

開発したものがグラフで出てきてくれたので苦労が報われた感じがしました。

↓サンプル

短期、中期、長期でのトレンドが見れるようにしました。

ただ、残念な事に、Googleトレンドでは検索ボリュームの少ないキーワードだと「ここに表示するデータはありません」となってしまうようでした。web漫画はニッチなタイトルが多いので、そもそもこのグラフ使える漫画少ないんじゃね?というオチまでつけてくれたのでした。(泣

次もまたランキング系の情報を埋め込みたいと思います。

6/1まで記録済み

今回17時間 計119時間