Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
61
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@dgkmtu

【Python】scheduleを使ってモジュールを定期実行させよう

モジュールを定期的に実行させるのに便利なscheduleモジュールを紹介します。scheduleは一定の間隔(数分・数時間・数日おき)に同じ作業を実行するような場合に便利なモジュールです。webスクレイピングで情報収集を行う場面などで便利なモジュールとなります。

今回は基本的なscheduleモジュールの使用法をまとめた後、スクレイピングを定期的に実行するモジュールを実装例としてご紹介します。

scheduleのインストール

scheduleモジュールはpipコマンドで入手可能です。コマンドプロンプト上で以下のコマンドを実行するとインストールされます。

pip install schedule

サンプルコード

sample_schedule.py
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を取得するようなモジュールです。

scraping_schedule.py
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スクリプトを定期実行しよう

61
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
61
Help us understand the problem. What is going on with this article?