はじめに
こんにちは。
今回は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日前の日付を設定し、一致するものを通知しています)
これで自分からサイトをチェックする必要がなくなりました、めでたしめでたし。