0
1

More than 3 years have passed since last update.

ポータルサイトからお知らせをLINEに通知する(メモ)

Last updated at Posted at 2021-03-08

はじめに

スクレイピングを勉強していて、何かアウトプットできないかと思い、大学のお知らせを通知するコードを練習がてら書きました。ただのメモです。こちらの記事などを参考にしました。

ログインコード

このコードで最初のログインをします。


webdriver.get('サイトURL')

    #ユーザー名入力
    webdriver.find_element_by_xpath('//*[@id="userId"]').send_keys("ユーザー名")
    #パスワード入力
    webdriver.find_element_by_xpath('//*[@id="password"]').send_keys("パスワード")

    time.sleep(3)
  
    #クリックボタン
    webdriver.find_element_by_xpath('//*[@id="loginButton"]').click()

スクレイピング

内容をスクレイピングするコードです。

contents=[]
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date1 = details.find_element_by_css_selector('div.date').text
        title1 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date2 = details.find_element_by_css_selector('div.date').text
        title2 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date3 = details.find_element_by_css_selector('div.date').text
        title3 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date4 = details.find_element_by_css_selector('div.date').text
        title4 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date5 = details.find_element_by_css_selector('div.date').text
        title5 = details.find_element_by_css_selector('div.text').text
    contents.append([date1,title1,date2,title2,date3,title3,date4,title4,date5,title5])

    return contents  

contentsにリストとして格納します。for文でまとめたかったのですが、サイトの構造や技術不足でうまくできませんでした。

LINEへの通知

LINE Notifyを使い通知させます。

 method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": contents}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)

全体のコード


import sys

import time
from selenium.webdriver import Chrome, ChromeOptions, Remote

#トークンを指定します
LINE_TOKEN = "LINE_TOKEN"
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"


def main():

    options = ChromeOptions()
    webdriver = Chrome(options=options)

    logging(webdriver)

    time.sleep(3)

    contents = scrape_contents_list(webdriver)

    send_to_line(contents)




def logging(webdriver):

    webdriver.get('サイトURL')

    webdriver.find_element_by_xpath('//*[@id="userId"]').send_keys("ユーザー名")
    webdriver.find_element_by_xpath('//*[@id="password"]').send_keys("パスワード")

    time.sleep(3)

    webdriver.find_element_by_xpath('//*[@id="loginButton"]').click()


def scrape_contents_list(webdriver):

    contents=[]
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date1 = details.find_element_by_css_selector('div.date').text
        title1 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date2 = details.find_element_by_css_selector('div.date').text
        title2 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date3 = details.find_element_by_css_selector('div.date').text
        title3 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date4 = details.find_element_by_css_selector('div.date').text
        title4 = details.find_element_by_css_selector('div.text').text
    for details in webdriver.find_elements_by_css_selector('セレクター'):
        date5 = details.find_element_by_css_selector('div.date').text
        title5 = details.find_element_by_css_selector('div.text').text
    contents.append([date1,title1,date2,title2,date3,title3,date4,title4,date5,title5])

    return contents   



def send_to_line(contents):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": contents}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)




if __name__ == '__main__':
    main()    

おわりに

通知はしっかり来ました。しかしリスト型で処理されるので、見栄えは良くありませんでした。
今後はsystemdのタイマーなども使い定期的に実行されるようなプログラムをつくりたいと思います。

参考記事

時間割をLINEで自動通知する。(selenium+LINE Notify)

参考文献

Pythonクローリング&スクレイピング[増補改訂版]
―データ収集・解析のための実践開発ガイドー

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1