##概要
RSS配信されてない障害情報ページをPythonでHTMLを取得して文字列判定するコードを書いてみた。
他にいい方法あればコメントなどで教えてください。
##コード概要
- URLにアクセスしてHTMLを取得
- HTMLの文章を抜き出す
- 文章チェック(指定の文字列があるかどうか)
- 異常があればSlackに飛ばす
##参考サイト
PyEnv
Chrome Driver
SlackのWebhook作成手順
#事前準備
Amazon Linux2を前提としています。
- インスタンス作成(t2.microとか適当に)
- Python環境の用意
もう環境がある人は適当に読み飛ばしましょう。
sudo yum update -y
#Pyenvを取得
sudo yum install git -y
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
#環境変数を設定してリロード
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
#Pythonビルド関連の準備
sudo yum install gcc -y
sudo yum install @development zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel findutils -y
#インストール出来るバージョンの一覧を取ってインストール
#Pyenv global 3.7.5とかするとサーバ全体に反映される
pyenv install --list
pyenv install 3.7.5
pyenv local 3.7.5
- ヘッドレスChromeのインストール
sudo yum -y install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
#テスト
google-chrome --headless --disable-gpu --window-size=1024,768 --hide-scrollbars --screenshot='yahoo.png' https://www.yahoo.co.jp
- Pythonのライブラリインストール
pip install --upgrade pip
pip install selenium
pip install beautifulsoup4
pip install slackweb
pip install chromedriver-binary==78.0.3904.70
注意点ですがChromeDriverが対応しているバージョンと、Chromeのバージョンが違うとエラーを起こします。
/opt/google/chrome/chrome --version
上記でChromeのバージョンを取れるので、
このページ
でバージョンを確認して指定するほうが安全です。
コード
本編です。
「vim check.py」とかで編集します。
最後2行は稼働を確認したらコメントアウトしておきましょう。
# coding: UTF-8
# URLにアクセスしてHTMLを取得
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_binary
options = Options()
options.binary_location = '/opt/google/chrome/chrome'
options.add_argument('--headless')
options.add_argument("--no-sandbox");
driver = webdriver.Chrome(options=options)
driver.get('チェック先URL')
html = driver.page_source
driver.quit()
#HTMLの文章を抜き出す
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
html=soup.find('div').get_text()
#文章チェック
word = '障害情報現在、正常にサービスをご利用いただけます。'.encode('utf-8')
pos=html.find(word.decode("utf-8"))
#異常があればSlackに飛ばす
import slackweb
slack = slackweb.Slack(url="SlackのWEBHOOKURL")
if pos == -1:
slack.notify(text="異常が発生しているようですURLを確認してください\nURL")
#else:
# slack.notify(text="現在、正常です")
動作確認
python check.py
おまけ
cronに登録する場合はこんな感じ
pyenvの下のPythonを見に行くように書きましょう。
*/10 * * * * /home/ec2-user/.pyenv/shims/python /root/check.py >> /var/log/check.log 2>&1