2018/12/12
認証などが必要なサイトの情報を使っての通知処理
はじめに
前投稿の続きです。
あるサイトから情報を取得し、そこにある期限とされる日付文字列を見て
一定の期間内の場合はメールで通知する、というものです。
あるサイトから情報を取得し、そこにある期限とされる日付文字列を見て
一定の期間内の場合はメールで通知する、というものです。
利用する技術項目は
- 1. selenium
2. BeatutifulSoup
の2つ。
インストール
python3等のインストールは省略。
いつもどおり必要なモジュールはpip3でインストールします。
いつもどおり必要なモジュールはpip3でインストールします。
1 | pip3 install bs4 selenium |
手順
まずはログインフォームをブラウザで表示します。
インスペクタ等を利用してソースからユーザー名やパスワードのフォーム項目
送信ボタンをseleniumにて取得します。
例)
あとは文字を送信、ボタンを押すの挙動を実装。
ログイン後の画面まで待機。
一覧表示などの画面へ遷移する必要があれば
とする。
インスペクタ等を利用してソースからユーザー名やパスワードのフォーム項目
送信ボタンをseleniumにて取得します。
例)
1 | mail = wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "input[name='mailaddress']"))) |
あとは文字を送信、ボタンを押すの挙動を実装。
1 2 | mail.send_keys(login_name) login_button.click() |
ログイン後の画面まで待機。
1 | wait.until(expected_conditions.url_contains('ログイン後に表示されるURL')) |
一覧表示などの画面へ遷移する必要があれば
1 | driver.get('一覧表示URL') |
とする。
ここからはスクレイピングの処理。
1 2 3 4 5 6 7 8 9 10 11 12 | soup = BeautifulSoup(driver.page_source, "lxml") table = soup.find('table', class_='一覧テーブルのクラス') for row in table.tbody.find_all('tr'): cells = row.find_all('td') dt_str = cells[日付のあるTDタグのインデックス] try: dt = ddt.strptime(dt_str.text.strip(), '%Y-%m-%d') dt_two_weeks_prev = (dt - datetime.timedelta(days=LIMIT_DAY)) if ddt.now() >= dt_two_weeks_prev and ddt.now() <= dt: notify_domains.append({"名称":cells[名称のあるインデックス].text, "期限": dt_str.text.strip()}) except: pass |
notify_domainsに格納したデータをメールなどの本文に渡してあげれば完了
おまけ
LinuxでHeadlessな監視スケジュールしたpythonのスクリプトを実行する際に
Chromeを動作させる必要があったが、若干苦戦した箇所の共有。
Chromeを動作させる必要があったが、若干苦戦した箇所の共有。
CentOS6だと難しい。
と言う事でCentOS7前提。
Chromeのインストールは
1 2 3 4 5 6 | [google-chrome] name=google-chrome baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch enabled=1 gpgcheck=1 gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub |
1 | yum install google-chrome-stable |
こちら参照
これでChromeインストールしてその他は同じ。
CentOS6だとインストールに必要なモジュールがそもそも用意されていないなど
情報を探すのが大変そうだったのでOSを入れ替えました。
Author Profile
スターフィールド編集部
SHARE