77Lifeworkベータ版

77Lifeworkベータ版

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

【Python】自動でfinvizのWebページからヒートマップを取得してSlackに投稿する方法

はじめに

こんにちは。
今回は以下のfinvizのWebページで参照することができるS&P500指数のヒートマップの画像をダウンロードしてSlackに投稿するプログラムを書いてみました。
finviz.com

S&P500とは、米国の主要な企業500社の時価総額を加重平均した、言わば米国の代表的な株価指数のことです。
そしてこのヒートマップを見ることでこれら500社の株価動向を直感的に把握することができます。ほとんど緑色であれば全体的に上昇傾向、逆に赤色であれば下落傾向、ということが分かります。
例えば以下の画像は全体的に株価が下がっている場合のヒートマップです。
f:id:J-back:20211001002645p:plain:w600


このようにヒートマップを見ることで株価の動向を簡単に把握できるのでとても便利なのですが、毎日finvizのサイトを見に行くのも面倒だったので、Slackに自動で通知してくれるような仕組みをつくってみた、という感じです。

動作環境

今回動作させている環境は以下の通りです。
OS:CentOS 7.8 (2003)
プログラミング言語:Python3.6.8
ブラウザ:Firefox78.6
スケジューラ:cron

CentOSVPS上で24h稼働させています。

現在私が使っている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」の要素をクリックしています。
f:id:J-back:20211001003526p:plain:w600


すると以下のようにヒートマップの画像が保存されたURLが発行されるので、これを「heatmapLink = driver.find_element_by_id('static').get_attribute('value')」の部分で読み取っています。
f:id:J-back:20211001003936p:plain:w600


最後に「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に投稿する方法についての記事でした。
最後まで読んでいただきありがとうございました。