みんかぶ投資信託売れ筋ランキングの上位10ファンドの基準価額、利回りを指定時間にLINEへ通知する

## 概要

みんかぶ投資信託売れ筋ランキング
https://itf.minkabu.jp/ranking/best_ranking
の上位10ファンドの基準価額と利回りを、指定時間にLINEへ通知する方法です。

https://github.com/ichi-first/japan-investment-trust-ranking

![IMG_3706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/f82f889a-e895-2a32-63c8-9117b9117208.jpeg)

## 背景

現職で投資信託を販売する中で、基準価額や利回りの情報を理解しておく必要がある。毎朝LINEに情報が届くように設定することで、確認する手間をなくすことができると思った。

## スクレイピング

みんかぶのURLから情報を取得するコードは以下の通り

```python
import requests
import bs4


URL = "https://itf.minkabu.jp/ranking/best_ranking"

LINE_NOTIFY_TOKEN = ""


def main():
    line_notify = LineNotify()
    ranking_html = requests.get(URL)
    soup = bs4.BeautifulSoup(ranking_html.text, "html.parser")
    fund_name_list = []
    price_list = []
    rimawari_list = []
    for i in range(10):
        data = soup.find_all("div", attrs={"class": "ranking_name"})[i].text
        fund_name_list.append(data.replace("\n", ""))
    for i in range(20):
        data = soup.find_all("td", attrs={"class": "tar wsnw"})[i].text
        if i % 2 == 0:
            price_list.append(data.replace("\n", ""))
        else :
            rimawari_list.append(data.replace("\n", ""))
    for i in range(10):
        send_data = (
            "\n" + str(i+1) + "位"
            "\n" + "ファンド名：" + fund_name_list[i] +
            "\n" + "基準価額　：" + price_list[i] + 
            "\n" + "利回り　　：" + rimawari_list[i]
        )
        line_notify.send(send_data)


class LineNotify:

    def __init__(self):
        self.line_notify_token = LINE_NOTIFY_TOKEN
        self.headers = {"Authorization": f"Bearer {self.line_notify_token}"}

    def send(self, data):
        data = {"message": f" {data}"}
        requests.post("https://notify-api.line.me/api/notify", data=data, headers=self.headers)


if __name__ == "__main__":
    main()
```

requestsでHTMLの情報取得→bs4で解析→リストに格納→LINE Notify APIを叩いてLINEへ通知　という流れ。

基準価額と利回りはtdタグのclass名が一緒だったため、一旦まとめて取得し、取得の順番が奇数か偶数かによって条件分岐をかけることによってそれぞれの値を取得した。

## AWS Lambda と Amazon EventBridge による定期実行

毎朝決まった時間にLINEへ通知が来るようにするため、AWS Lambda と Amazon EventBrige を使って定期実行する。

### AWS Lambda の設定

1\. 「関数の作成」を選択し、Lambda関数を作成する。

![スクリーンショット 2024-02-24 15.24.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/fed127f6-2bc6-b6eb-ccd9-eeb347acd6bb.jpeg)

2\. 「基本設定」を開き、タイムアウトの時間を1分に設定する。

![スクリーンショット 2024-02-24 15.26.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/8828eb9a-da96-1f23-5730-cf4abbe83601.jpeg)

3\. 「コードソース」を開き、lambda_function内にPythonコードをペーストする。
※変更点2箇所
```python
def main():
#この部分を下記に変更
def lambda_handler(event,context)
```
```python
if __name__ == "__main__":
    main()
#この部分を消去
```

![スクリーンショット 2024-02-24 15.30.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/eb927d65-90c5-370b-6900-b1f5b6bed12d.jpeg)

4\. 「レイヤー」を追加する。
Lambdaではrequestsやbeautifulsoup4等の外部ライブラリを利用するにはレイヤーを用意する必要がある。

![スクリーンショット 2024-02-24 15.36.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/12a72441-a06f-97b6-4205-e1ca318d8cd7.jpeg)

今回は有志の方々が作成したLambda用のPythonライブラリレイヤーを使用する。

https://github.com/keithrozario/Klayers

「List of ARNs」の中から「Python3.12」を選択し、自分のリージョンを選択すると以下のようにライブラリごとのARNが表示される。
requestsとbeautifulsoup4のARNをコピーし、Lambdaにペーストする。

![スクリーンショット 2024-02-24 15.34.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/755a2c22-1d7e-289f-8ac4-934cd4d77514.jpeg)

### Amazon EventBridge の設定

1\. 「ルールを作成」を選択。
![スクリーンショット 2024-02-24 15.37.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/46f9b6d9-0b90-327e-f225-4a8e85d3237e.jpeg)

2\. 「名前」を入力し、「スケジュール」を選択。
![スクリーンショット 2024-02-24 15.38.17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/b655ec51-fccc-fa63-f62a-feb457e6f5bb.jpeg)

3\. 「定期的なスケジュール」を選択し、実行間隔を設定する。
今回は毎朝７時にLINEへと通知するため、以下のように入力する。
![スクリーンショット 2024-02-24 15.39.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/60c88b84-3af4-8716-42e0-64fda4d72f4b.jpeg)

4\. 「Invoke」を選択する。
![スクリーンショット 2024-02-24 15.40.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/6e3a89a6-4959-6c62-467c-2780317738f3.jpeg)

5\. Lambdaで設定した名前を選択する。
![スクリーンショット 2024-02-24 15.40.24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/385ff737-0650-4133-0a80-22c3e73c8804.jpeg)

6\. その後何も変更せず進んでいくと、以下のようにスケジュールが設定される。
![スクリーンショット 2024-02-24 15.41.35 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3720673/21ecc4e2-3a99-2bc1-a6b9-d0c519ecfda8.jpeg)

以上でAWS Lambda と Amazon EventBridge の設定が完了したため、みんかぶ投資信託売れ筋ランキングの上位10ファンドの基準価額、利回りが毎朝7時にLINEへと通知される。