Python スクレイピングを自動で定期実行する!【Schedule】

スポンサーリンク
プログラミング

どうもヨスケです。

プログラムの勉強も習慣化して、だいぶ色々な処理が実行できるようになってきました。

めんどくさい仕事を勝手にやってくれるし、プログラム便利~っと思っているのですが、人間はどんどん欲が出るものです。

もう、勝手に処理してくれないかな♪

あと、「人間はミスする生き物」なので、実行し忘れもあります。

ということで、今回のお題です。

■この記事でできるPythonプログラミング
作成したPythonプログラムを定期的に自動で実行できるようにする!

成果物:Yahoo!ニュースの主要トピックスを定期的に取得する

スポンサーリンク

定期処理をしたいベースのプログラム

以前作った、Yahoo!ニュースの主要トピックスを取得してCSVファイルに書き込むプログラムをベースに遊んでみたいと思います!

Scheduleライブラリ

「Schedule」と呼ばれるライブラリが、一定時間間隔(数分、数時間、数日)で処理を繰り返すような場合に便利です。

 

使い方

まずはライブラリのインストール

ターミナル画面で

pip install schedule

あとはPythonのコードの中で、定期実行したい処理をメソッドとして定義し、処理間隔を登録します。

def job():
    print('実行!')

#1分毎のjob実行を登録
schedule.every(1).minutes.do(job)

#2時間毎のjob実行を登録
schedule.every(2).hours.do(job)

#AM5:00のjob実行を登録
schedule.every().day.at("5:00").do(job)

#水曜日のjob実行を登録
schedule.every().wednesday.do(job)

登録しただけだと処理されません。schedule.run_pendingで処理します。

※schedule.run_pendingを呼び出すだけだと1回処理になりますので、今回は無限ループ。

#登録したjobを実行。今回は無限ループで実行
while True:
    schedule.run_pending()
    time.sleep(10)

Yahoo!ニュース主要トピックスを定期的に抽出

コード全部見せ!

いつものごとく、コード全部見せです。

よくわからないところは「おまじない」だと思って、そのまま使ってしまいましょう。ヨスケもそうですし、プロではないので、それで十分です。

#requestsとBeautiful Soup のイン ポート
import requests 
from bs4 import BeautifulSoup
#csvのインポート
import csv
#datetimeのインポート
import datetime
import schedule
import time

#定期処理内容 Yahoo!ニュースの主要トピックスのタイトルとURLを取得
def job():
    #ターゲットURLの変数化
    url = "https://news.yahoo.co.jp/"

    # このあたりはおまじない!わからなくてもOK! 狙いのURLのhtmlをタグごとに解析します。
    r = requests.get(url)
    content_type_encoding = r.encoding if r.encoding != 'ISO-8859-1' else None
    soup = BeautifulSoup(r.content, 'html.parser', from_encoding=content_type_encoding)

    # Beautiful Soup の find() で、主要ニュースの部分のみを抽出します。
    today = soup.find("section", attrs ={"id":"uamods-topics"})

    # 記事のタイトルとURLがある部分を抽出
    entries = today.find_all("li")
    # CSV出力用リスト
    today_list = []
    index = 1

    # あるだけ情報を取得する
    for entry in entries:
        # "li"の箇所のタイトルに該当するテキスト(ページ上の文章)を取得
        title = entry.get_text()
        # "li"の箇所のURLを取得
        entry_url = entry.find("a").get("href")
        # 出力用リストにタイトルとURLを格納  
        today_list.append([index, str(title) ,entry_url])
        # インデックスをインクリメント
        index += 1 

    #print(today_list)

    # 現在時刻を取得
    dt_now = datetime.datetime.now()

    #結果をCSVファイルに書き出し。ファイル名は現在時刻
    with open(str(dt_now.year)+'_'+str(dt_now.month)+'_'+str(dt_now.day)+'_'+str(dt_now.hour)+str(dt_now.minute)+'_NewsTopics.csv', 'w', encoding='utf-8')as file:
        writer=csv.writer(file,lineterminator='\n')
        writer.writerows(today_list)


#1分毎のjob実行を登録 今回は1分毎だけ有効にしました。
schedule.every(1).minutes.do(job)

#2時間毎のjob実行を登録
#schedule.every(2).hours.do(job)

#AM5:00のjob実行を登録
#schedule.every().day.at("5:00").do(job)

#水曜日のjob実行を登録
#schedule.every().wednesday.do(job)

#登録したjobを実行。今回は無限ループで実行
while True:
    schedule.run_pending()
    time.sleep(10)

実行結果

フォルダ内に1分ごとにCSVファイルが出来ましたので、成功です◎

ただ、無限ループなので、自分でプログラムを終了させないと永遠に動き続けます。ちょっと改善が必要かも知れません。定期実行だから、そんなもんなのか。。

 

今後

WebAPIとの連携に興味があります。

またスキマ時間で勉強して、次はLineなどのSNSと連携した処理ができるようになりたいと思います。今後もPythonの学習は継続していって、少しずつスキルアップする所存です。

タイトルとURLをコピーしました