モジュールを定期的に実行させるのに便利なscheduleモジュールを紹介します。scheduleは一定の間隔(数分・数時間・数日おき)に同じ作業を実行するような場合に便利なモジュールです。webスクレイピングで情報収集を行う場面などで便利なモジュールとなります。
今回は基本的なscheduleモジュールの使用法をまとめた後、スクレイピングを定期的に実行するモジュールを実装例としてご紹介します。
scheduleのインストール
scheduleモジュールはpipコマンドで入手可能です。コマンドプロンプト上で以下のコマンドを実行するとインストールされます。
pip install schedule
サンプルコード
import schedule
import time
# 実行job関数
def job():
print("job実行")
#1分毎のjob実行を登録
schedule.every(1).minutes.do(job)
#1時間毎のjob実行を登録
schedule.every(1).hours.do(job)
#AM11:00のjob実行を登録
schedule.every().day.at("11:00").do(job)
#日曜日のjob実行を登録
schedule.every().sunday.do(job)
#水曜日13:15のjob実行を登録
schedule.every().wednesday.at("13:15").do(job)
# jobの実行監視、指定時間になったらjob関数を実行
while True:
schedule.run_pending()
time.sleep(1)
scheduleのサンプルモジュールです。ある間隔ごとにjob関数が実行され、「job実行」が表示されるモジュールとなります。schedule.every
は実行するjobと実行間隔を登録する記述となります。数分ごとや数時間ごと、さらに特定日時の実行も可能です。
# 1分毎にjobを実行
schedule.every(1).minutes.do(job)
上記のschedule.every
で登録したjobは以下のschedule.run_pending()
で実行されます。普通にschedule.run_pending()
を呼び出しただけでは、一度jobを実行した時点で、モジュールが終了してしまうため、while文で無限ループ状態にする必要があります。無限ルール状態にすることで、同じ処理を一定間隔で実し続けることが可能です。
while True:
schedule.run_pending()
time.sleep(1)
scheduleを使ってYahooニュースの採取を定期実行
今回紹介したscheduleモジュールを使用して、定期的にスクレイピングを実行するようなモジュールを作成しました。1時間ごとにYahooニュースにアクセスし、ニュースのタイトルとURLを取得するようなモジュールです。
from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
from bs4 import BeautifulSoup
import re
import schedule
import time
def job():
try:
html = urlopen('https://news.yahoo.co.jp/topics')
except HTTPError as e:
print(e)
except URLError as e:
print(e)
else:
# Yahooトピックスにアクセスし、ニュース情報を採取
bs = BeautifulSoup(html.read(), 'lxml')
newsList = bs.find('div', {'class': 'topicsListAllMain'}).find_all('a')
# 取得したListからニュースのタイトルとURLを取得して表示
for news in newsList:
if re.match('^(https://)', news.attrs['href']):
print(news.get_text())
print(news.attrs['href'])
#1時間毎にjobを実行
schedule.every(1).hours.do(job)
while True:
schedule.run_pending()
time.sleep(1)
まとめ
今回は定例的ないjobを一定間隔で実行させることができるscheduleモジュールをご紹介しました。私は主にスクレイピングなどで活用することが多いですが、作業の定期実行にも使えるモジュールではあるので、使用用途はとても広いと思います。
参考文献
Python Scheduleライブラリでジョブ実行
scheduleライブラリを使ってPythonスクリプトを定期実行しよう