Pythonクローラーのスケジュールされたタスクのいくつかの一般的な方法

序文

この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。これらは商用目的ではありません。ご不明な点がございましたら、処理についてお問い合わせください。

PS:Pythonの学習教材が必要な場合は、以下のリンクをクリックして自分で入手できます

Pythonの無料学習資料とグループコミュニケーションの回答クリックして参加


以前のWindowsタスクのタイミングは正常に使用できることを忘れないでください。今日試してみたところ、正常に使用できず、タスクスケジュールが常にハングしていることがわかりました。次に、Pythonクローラーのタイミングタスクのいくつかのソリューションを記録します。

方法1、True

最初に最も簡単なのは、while trueループがハングし、意味のない話をせずに、コードに移動することです。

import os
import time
import sys 
from datetime import datetime, timedelta
def One_Plan():
     # 设置启动周期
     Second_update_time = 24 * 60 * 60

    # 当前时间
    now_Time = datetime.now()
    # 设置 任务启动时间
    plan_Time = now_Time.replace(hour=9, minute=0, second=0, microsecond=0)  
    # 设置差值,-1 day, 21:48:53.246576,类似于这样
    # time.sleep()需要传入int,所以下面使用.total_seconds() 
    # 主要用来计算差值,返回int,具体功能可以自行查阅相关资料
    delta = plan_Time - now_Time
    first_plan_Time = delta.total_seconds() % Second_update_time
    print("距离第一次执行需要睡眠%d秒" % first_plan_Time)
    return first_plan_Time

# while Ture代码块,挂起程序,睡眠时间结束后调用函数名进行执行
while True:

    s1 = One_Plan()
    time.sleep(s1)
    # 下面这里是自己定义的函数,想跑代码的可以换成hellow world函数或者注释掉这行测试下
    exe_file(D_list)
    print("正在执行首次更新程序")

個人的には、この方法で時限計画を開始するのは、単一のプログラムで1日1回実行する場合は問題ないと思います。1日に複数のタスクの実行を考慮し、複数回実行する必要がある場合は、日、欠点が強調表示されます。

作業状況では考慮しなければならない要素がたくさんあります。たとえば、クローラープログラムは、夕方の12時、朝の6時、朝の9時に4回実行する必要があります。 、午後3時、4つのクローラーを同時に実行する必要があります。また、ネットワークが安定しているかどうかも考慮する必要があります。、プログラムがハングした場合の対処方法など。

方法2、タイマーモジュール

前に最も単純なタイミング開始について話しましたが、それは最も単純で失礼であると言えます、寿命は短く、Pythonはエレガントです、非常に単純で単純で、数行のコードで実行できる種類はありますか?持つ必要があります!簡単な例を挙げると、前の方法の最後に、他の要因を考慮する必要があると述べました。

次に、Firefoxドライバー+マルチスレッドを使用してSeleniumクローラーを起動する必要があります。コンピューターマネージャーのCPU使用率が20%になったことは誰もが理解しています。seleniumを起動した後も、ブラウザー+マルチスレッドを開き続けます。 5分、CPU占有率が直接90%以上に引き上げられ、タイミングプログラムはまだ実行されていますが、コンピューターはその場でスタックしていますが、すでにスタンバイ状態に似ていますが、突然コンピューターがスタックしていると感じますか? 、最初の反応:クソ、このljコンピューター、プログラムがどのように実行できなくても、私はまだたくさんのコードを書いています、*****!

はい、コードと特定の機能の詳細については、関連情報を自分で読んでください。

from datetime import datetime
from threading import Timer
import time

# 定时任务
def task():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

def timedTask():
    '''
    第一个参数: 延迟多长时间执行任务(秒)
    第二个参数: 要执行的函数
    第三个参数: 调用函数的参数(tuple)
    '''
    Timer(5, task, ()).start()

while True:
    timedTask()
    time.sleep(5)

7行のコードですが、とてもエレガントですか?優れていてエレガントでない主な点は、コードが少なく、労力がかからないということですよね?

2020-06-05 14:06:39
2020-06-05 14:06:44
2020-06-05 14:06:49
2020-06-05 14:06:54
2020-06-05 14:06:59
2020-06-05 14:07:04
2020-06-05 14:07:09
2020-06-05 14:07:14
2020-06-05 14:07:19
2020-06-05 14:07:24

方法3、スケジュールされたモジュール

今回はモジュールで直接-スケジュールされたモジュール

コードは次のように表示されます。

from datetime import datetime
import sched
import time


def timedTask():
    # 初始化 sched 模块的 scheduler 类,传入(time.time, time.sleep)这两个参数
    scheduler = sched.scheduler(time.time, time.sleep)
    # 增加调度任务,enter(睡眠时间,执行级别,执行函数)
    scheduler.enter(5, 1, task)
    # 运行任务
    scheduler.run()

# 定时任务
def task():
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

if __name__ == '__main__':
    timedTask()

このモジュールも非常に使いやすいです。scheduler()はプログラムを終了するために1回だけ実行されることに注意してください。mianの下でTure中に追加するか、timeTaskでスケジューリングタスクを直接追加できます。この記述方法に加えて、別の種類の記述、コードがあります:

import schedule
import time

def hellow():
    print('hellow')

def Timer():
    schedule.every().day.at("09:00").do(hellow)
    schedule.every().day.at("18:00").do(hellow)

    while True:
        schedule.run_pending()

        time.sleep('需要睡眠的周期')


Timer()

ここでは、日時分があり、タイミングタスクが非常に便利であることがわかります。Trueの間にスリープする時間を追加し、汎用モジュールで実行される回数を追加します。

おすすめ

転載: blog.csdn.net/pythonxuexi123/article/details/112838112