77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

pythonを使って株主優待の変更や廃止をslackに通知する

はじめに

こんにちは。
今回はpythonによるスクレイピングを使って、株主優待の内容変更を発表した企業の情報をslackに通知する仕組みをつくっていきます。
というのも私自身、優待狙いで株式を購入したり保有しているのですが、いつの間にか優待内容が改悪されていたり、お得な優待の新設を見逃していたり、と、なかなか最新の情報に反応できずどうしたものかと思っていました。
で、そんなとき、優待の速報を出してくれているありがたい以下のサイトを見つけたのです。
www.invest-jp.net


ここをチェックしていれば優待内容の変更を追うことができます、
が、いちいち見にいくのが面倒だなー、更新されたら連絡してくれれば良いのになー、と思った結果、今回のプログラムを組むに至ったのです。
というわけで、プログラムの中身の話に移っていきましょう。

処理の流れ

実装する処理についてですが、まずは先ほどの優待速報URLにアクセスし、発表されている優待一覧の情報を取得します。
今回は、「発表日」が本日日付(プログラムを実行した日)と同一であるものについて、その企業コードと発表内容のリンクをslackに通知するようにします。

この処理を実装したpythonコードをVPS(Virtual Private Server)上に配置し、cronで毎日夕方に実行することにしました。


ちなみに今回の主題ではないですが、VPSについては価格の安さからWebARENAのCentOSを使用しています。
興味がある方は下のリンクから見てみてください。
WebARENA (Indigo)





対象のサイトに更新がなければslackへの通知は行わず、更新があるときのみ内容を通知するようにしています。

Pythonのコード

今回組んだコードは以下です。
発表されている内容を1行ずつ取得し、本日日付と等しいものを探し、見つかれば内容をslackで送信、としています。
slackへの連携部分については以下記事で解説していますので、ご覧ください。
www.77-lifework.com

from bs4 import BeautifulSoup
from selenium import webdriver
import slackweb
import time
import datetime
import os
from selenium.webdriver.chrome.options import Options

# 例外発生通知用のslackのURL
SLACKURL_ex = 'ご自身のslackURLを記入'

# 定数宣言
SLACKURL = 'ご自身のslackURLを記入'

# slack送信メソッド
def slackPost(webhookurl,message):
    slack = slackweb.Slack(url = webhookurl)
    slack.notify(text = message)

# main処理
def main():

    # 日付
    today = datetime.date.today()

    header = '【優待変更】' + os.path.basename(__file__) + '\n'
    sendMessage = header

    # スクレイピング対象URL
    URL = 'https://www.invest-jp.net/yuutai/news'

    # スクレイピング実行
    try:
        # Chrome設定
        options = Options()
        options.add_argument('--headless')

        #対象URLにリクエスト
        driver = webdriver.Chrome(options=options)
        driver.get(URL)
        time.sleep(10)

        # 文字コードをUTF-8に変換し、html取得
        html = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(html, "html.parser")

        table = soup.find('table', class_='table table-striped')
        
        # 表の情報を取得
        rows = table.find_all("tr")

        for row in rows:
            if row.find('a', target='_blank') is not None :
                target_array = []
                target_array.append(row.find_all('td'))
                target_num = target_array[0][0].get_text()
                target_date = target_array[0][2].get_text()
                target_url = target_array[0][3].find('a').get('href')

                # 本日発表分をslackで送信
                if  target_date == str(today):
                    sendMessage += target_num + ':  ' + target_url + '\n'

        if sendMessage != header:
            slackPost(SLACKURL,sendMessage)


    except Exception as e:
        message = "[例外発生]"+os.path.basename(__file__)+"\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
        slackweb.Slack(url = SLACKURL_ex).notify(text = message)


    finally:
        # 起動したChromeを閉じる
        driver.close()
        driver.quit() 

if __name__ == '__main__':
    main()


このコードを実行すると、画像のようにslackに通知されました!
(テスト用に2日前の日付を設定し、一致するものを通知しています)


f:id:J-back:20200920214628p:plain:w600


これで自分からサイトをチェックする必要がなくなりました、めでたしめでたし。


ちなみに、ここで作成したようなスクレイピングツールは少し勉強すれば、すぐに作成して動作させることができます。
私が読んで参考にした書籍のリンクを以下に貼り付けておきますので、よかったらチェックしてみてください。

最後に

今回はpythonでプログラムを組んで、株主優待の変更内容を通知する仕組みをつくりました。
こういった自動化処理が使えるところは身近にいろいろあるので、今後も少しずつやっていこうと思います。
最後まで読んでいただき、ありがとうございました。