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


#はじめに#
スクレイピングを勉強していて、何かアウトプットできないかと思い、大学のお知らせを通知するコードを練習がてら書きました。ただのメモです。[こちらの記事](https://qiita.com/kitarikes/items/427e1a22aae45ae16a28)などを参考にしました。


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

```python

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()

```

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

```python
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を使い通知させます。

```python
 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)
```

#全体のコード#

```python

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)](https://qiita.com/kitarikes/items/427e1a22aae45ae16a28)
#参考文献#
・[Pythonクローリング＆スクレイピング［増補改訂版］
―データ収集・解析のための実践開発ガイドー](https://gihyo.jp/book/2019/978-4-297-10738-3)