WindowsのSchedulerを使ってslackに最新記事を定期的に通知させてみた


こんにちは、Takaです。
今回はWindowsのSchedularを使って、定期的にslackにスクレイピングした記事を通知するプログラムを作成したのでアウトプットしようと思います。

環境

windows10
python 3.7.2
selenium 3.141.0

スクレイピング

今回はAIに関する記事をスクレイピングしたかったので。AI+のサイトをスクレイピングしました。
しかしながら、javascriptで書かれた動的なサイトだったので、BeautifulSoupではスクレイピングできないと判断しました。そこで今回はSeleniumを使ってスクレイピングを試みました。
seleniumを使うことで、一定時間たった後のサイトをスクレイピングすることができます。

seleniumをインストールしていない方はコマンドラインから

pip install selenium

と入力すればインストールできます。
Anacondaであればcondaに変えてもインストール可能です。(もちろんpipも可能)

また、Webブラウザーの代わりとしてWebDriverというものが必要になります。
WebDriverは最新のものであればほぼすべてのブラウザに対応しているので、自分が使っているブラウザに合わせてインストールしてください。
私はChromeなのでChromedriverをインストールしました。
Chromedriverのインストールですが、まずこちらのサイトにアクセスしてもらい、All versions available in Downloadsをクリックします。

そして、一番上にあるChromeDriver 74.0.3729.6をクリック

そうすると、下のようなサイトに移るので、自分のosと同じものをクリックしてダウンロードすれば完了です。

以上でseleniumを使う準備は整いました。

slack

slackで通知を送るAppを作成します。
まず、slackのincoming Webhookを作成します。そしてそのURLを取得する必要があります。取得方法はこちらのサイトを参考にしてください。
取得したURLはpythonのコード上で使用するので、どこでもいいので記録してください!

次にslackに通知を送るライブラリをインストールします。
これは

pip install slackweb

でインストールできます。
使い方としては

import slackweb
slack = slackweb.Slack(url="incoming webhookのURL")
slack.notify("こんにちは")

とすれば、slack上で「こんにちは」とAppが発しているのがわかると思います。

コード

以下が今回実装するコードになります。

import slackweb
from selenium import webdriver
slack = slackweb.Slack(url="incoming webhookのURL")

url = "https://www.itmedia.co.jp/news/subtop/aiplus/"
href_list = []
#chromedriverをC直下に置いてあります。
driver = webdriver.Chrome('C:\chromedriver.exe')
#暗黙的待機を設定
driver.implicitly_wait(5) #5秒待機後にスクレイピングする

driver.get(url)

#id = new_Articleを取得
for quote in driver.find_elements_by_id("newArticle"):
    #aタグを取得
    for i in quote.find_elements_by_tag_name("a"):
        href = i.get_attribute("href")
        href_list.append(href)

href_list = list(set(href_list))

for href in href_list:
    slack.notify(text=href)

input("Press ENTER to close the automated browser")
driver.quit()

Task Scheduler

それでは、作ったコードを定期的に実行するためにTask Schedulerを使ってみましょう。
Task Schedulerは、まずWindowsのコントロールパネルを起動します。

次に、システムとセキュリティを開きます。

開いたら、管理ツールのタスクのスケジュールを開きます。

タイムスケジューラーを開くことができました。左上にある操作をクリックし、基本タスクの作成をクリックします。

ここに、プログラムの名前と説明を入力します。

次にどのくらいの頻度で行うかをチェック

いつから始めるかを決めます

今回は、自分で書いたプログラムを定期的に実行したいのでプログラムの開始をチェックします。

最後にこちらの画面ですが、注意が必要です。

まず、pythonで書かれたコードを実行する場合プログラム/スクリプトの部分にpython.exeのパスを打ち込みます。これはAnacondaに搭載背れているpython.exeでもいいです。わからなければwindowsボタンからpython.exeと検索すれば出てくるはずです。
次に、引数の追加では実行するファイルの名前だけ入力します。この時、パスは入力しなくて大丈夫です。
最後の開始の部分に実行するファイルのパスを入力します。
画面は少し違いますが、僕の場合はこのようになりました。
これで完了です。
このプログラムを実行するとslackに新着記事が送られます。

まとめ

今回は、簡易的なbotを作ってみました。Task Schedulerのネックは僕がインターネットに接続していないと起動しないことです笑
まだまだ改善の余地があるので、今度は違う形でbotを作成してみようと思います。

参考

https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=020402
#WindowsタスクスケジューラでPythonを走らせる