はじめに
こんにちは。
今回は以下のfinvizのWebページで参照することができるS&P500指数のヒートマップの画像をダウンロードしてSlackに投稿するプログラムを書いてみました。
finviz.com
S&P500とは、米国の主要な企業500社の時価総額を加重平均した、言わば米国の代表的な株価指数のことです。
そしてこのヒートマップを見ることでこれら500社の株価動向を直感的に把握することができます。ほとんど緑色であれば全体的に上昇傾向、逆に赤色であれば下落傾向、ということが分かります。
例えば以下の画像は全体的に株価が下がっている場合のヒートマップです。
このようにヒートマップを見ることで株価の動向を簡単に把握できるのでとても便利なのですが、毎日finvizのサイトを見に行くのも面倒だったので、Slackに自動で通知してくれるような仕組みをつくってみた、という感じです。
動作環境
今回動作させている環境は以下の通りです。
OS:CentOS 7.8 (2003)
プログラミング言語:Python3.6.8
ブラウザ:Firefox78.6
スケジューラ:cron
現在私が使っているVPSについては以下の記事に書いています。参考まで。
www.77-lifework.com
処理の流れ
実装としては結構簡単です。というのもfinvizのサイト側がヒートマップを画像として出力する仕組みを用意してくれているので、
これに従って操作し、画像のURLをダウンロードしてくれば問題ありません。
Pythonのコード
from bs4 import BeautifulSoup from selenium import webdriver import time import urllib.request import datetime import os import sns_post from selenium.webdriver.chrome.options import Options from selenium.webdriver.firefox.options import Options # 例外発生通知用のslack URL SLACKURL_ex = 'xxxxxx' # slack設定値 SLACKURL = 'xxxxxx' # main処理 def main(): header = '【S&P500 HeatMap】 finbiz_heatmap.py\n' sendMessage = header # スクレイピング対象URL URL = 'https://finviz.com/map.ashx' # スクレイピング実行 try: # ブラウザ設定 options = Options() options.add_argument('--headless') # 対象URLにアクセス #driver = webdriver.Chrome() #driver = webdriver.Chrome(options=options) #driver = webdriver.Firefox() driver = webdriver.Firefox(options=options) driver.get(URL) time.sleep(10) #HeatMapの画像リンクを発行 driver.find_element_by_id('share-map').click() time.sleep(20) heatmapLink = driver.find_element_by_id('static').get_attribute('value') sendMessage += heatmapLink # HeatMapのリンクをslackに投稿 sns_post.slackPost(SLACKURL,sendMessage) except AttributeError as e: message = "[例外発生]"+os.path.basename(__file__)+"\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)+"\n" sns_post.slackPost(SLACKURL_ex,message) except Exception as e: message = "[例外発生]"+os.path.basename(__file__)+"\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args) sns_post.slackPost(SLACKURL_ex,message) finally: # 起動したブラウザを閉じる driver.close() driver.quit() if __name__ == '__main__': main()
SlackのURLの「xxxxxx」の部分は皆さんの環境のURLを入れましょう。
pythonとslackを連携する方法については以下に記載しているので参考にしてみてください。
www.77-lifework.com
処理としては、まず「driver.get(URL)」の部分でヒートマップをGoogleChromeで表示させています。
そして「driver.find_element_by_id('share-map').click()」の部分で以下の「Share map」の要素をクリックしています。
すると以下のようにヒートマップの画像が保存されたURLが発行されるので、これを「heatmapLink = driver.find_element_by_id('static').get_attribute('value')」の部分で読み取っています。
最後に「sns_post.slackPost(SLACKURL,sendMessage)」の部分で、画像リンクをslackに送信しています。
ここで使用している「slackPost」というメソッドは「sns_post.py」という別のファイルの中に記載してあり、それを呼び出すかたちとしています。
コードとしては、以下です。
import slackweb import twitter import requests # slack送信メソッド def slackPost(webhookurl,message): slack = slackweb.Slack(url = webhookurl) slack.notify(text = message)
おわりに
今回はfinvizのWebページからヒートマップの画像をダウンロードしてSlackに投稿する方法についての記事でした。
最後まで読んでいただきありがとうございました。