python time小技巧:定时任务(一)

目录

目录

前言

一、time是什么?

二、使用步骤

1.引入库

2.获取当前时间字符串形式

3.获取目标时间字符串

4.获取目标时间戳

5.强制等待时间

三、实践

1.前言

 2.源代码

3.结果

4.详解

4.1 分析

4.2 要求1

4.3 要求2

总结


前言

大家在编写程序时,有时会希望程序可以指定时间运行。例如:

python time小技巧:定时任务(一)_第1张图片

先不考虑界面情况,只考虑后端数据。

我们可以通过python标准库函数time来实现定时任务效果


一、time是什么?

time 模块是 Python 标准库中的一个模块,提供了与时间相关的功能和操作。它允许你获取当前时间、进行时间的格式化和解析、进行时间的延时等操作。


二、使用步骤

1.引入库

由于它是标准库函数,不需要下载直接调用函数。代码如下:

import time

2.获取当前时间字符串形式

接下来我们需要获取当前时间,并且修改为我们想要的格式。

方便之后修改时间。代码如下:

# 获取当前时间字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")

3.获取目标时间字符串

根据用户设定的时间,修改之前获取的当前时间作为目标时间

因字符串格式无法直接修改,所以利用重组字符串的方式修改。代码如下:

#  用户设定的时间
target_time = input("请输入时间:")

# 重组时间字符串
part1 = formatted_time[:11]
part2 = formatted_time[11 + len(target_time):]
# 将新字符串插入到指定位置
new_string = part1 + target_time + part2

4.获取目标时间戳

接着将目标时间修改为时间戳格式,方便计算等待时间。代码如下:

# 将时间字符串解析为时间元组
time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
# 将时间元组转换为时间戳
timestamp = time.mktime(time_tuple)

5.强制等待时间

获取当前时间戳,再计算当前时间戳与目标时间戳的差值。

这个差值就是定时所需的等待时间。

最后根据time.sleep()强制程序中断指定时间方式实现定时!代码如下:

# 当前时间戳
current_time2 = time.time()
TIME = timestamp - current_time2
time.sleep(TIME)

三、实践

1.前言

以上就是定时任务的方式,接下来我们开始实操。

程序需求:今天的中午12点整开始爬取xxx内容

 2.源代码

根据需求封装为函数,代码如下:

import time
import requests
from lxml import etree


def time_sleep(target_time="09:00:00"):
    """
    指定时间

    target_time  用户设定的时间
    """
    # 获取当前时间元组
    current_time = time.localtime()
    # 时间元组转换为字符串
    formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)

    # 重组时间字符串
    part1 = formatted_time[:11]
    part2 = formatted_time[11 + len(target_time):]
    # 将新字符串插入到指定位置
    new_string = part1 + target_time + part2

    # 将时间字符串解析为时间元组
    time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
    # 将时间元组转换为时间戳
    timestamp = time.mktime(time_tuple)

    # 当前时间戳
    current_time2 = time.time()
    TIME = timestamp - current_time2
    print("等待时间:", TIME)
    if TIME > 0 :
        time.sleep(TIME)


def text():
    """
    爬取内容
    """
    url = 'https://www.douban.com/tag/小说/?focus=book'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    }

    res = requests.get(url, headers=headers)
    # 将响应对象中的文本内容传递给etree.HTML()方法,这通常是使用lxml库中的etree模块来构建一个XPath解析对象
    html = etree.HTML(res.text)
    title = html.xpath('//*[@id="book"]//*[@class="title"]//text()')
    desc = html.xpath('//*[@id="book"]//*[@class="desc"]//text()')
    for i in range(len(title)):
        # 输出内容,去除首尾空白字符串
        print(f"<<{title[i].strip()}>> {desc[i].strip()}")


if __name__ == "__main__":
    target_time = input("请输入时间:")
    time_sleep(target_time)
    text()

3.结果

运行之后,用户在终端输入时间,再按下回车键继续运行。结果如下:

python time小技巧:定时任务(一)_第2张图片

4.详解

4.1 分析

编写程序先看需求!

分解咱们的需求,可分为两个要求:

1.需要12点整运行

2.运用爬虫获取内容

4.2 要求1

第一个要求就是本文重点讲解的,若有疑惑请看目录中第二大点

实现方法:计算目标时间与当前时间的时间差,再使用time.sleep()中断程序指定时间

代码如下:

import time


def time_sleep(target_time="09:00:00"):
    """
    指定时间

    target_time  用户设定的时间
    """
    # 获取当前时间元组
    current_time = time.localtime()
    # 时间元组转换为字符串
    formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)

    # 重组时间字符串
    part1 = formatted_time[:11]
    part2 = formatted_time[11 + len(target_time):]
    # 将新字符串插入到指定位置
    new_string = part1 + target_time + part2

    # 将时间字符串解析为时间元组
    time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
    # 将时间元组转换为时间戳
    timestamp = time.mktime(time_tuple)

    # 当前时间戳
    current_time2 = time.time()
    TIME = timestamp - current_time2
    print("等待时间:", TIME)
    if TIME > 0 :
        time.sleep(TIME)


if __name__ == "__main__":
    target_time = input("请输入时间:")
    time_sleep(target_time)

4.3 要求2

这次爬取的是一个静态网页,所以我们只需要简单的获取网页内容就好了。

本文采用request库方法爬取——通过发送对网页请求,返回内容并解析,最后通过xpath方法定位获取指定内容。如果内容有多余的字符,另外去除字符串。


import requests
from lxml import etree


def text():
    """
    爬取内容
    """
    url = 'https://www.douban.com/tag/小说/?focus=book'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    }

    res = requests.get(url, headers=headers)
    # 将响应对象中的文本内容传递给etree.HTML()方法,这通常是使用lxml库中的etree模块来构建一个XPath解析对象
    html = etree.HTML(res.text)
    title = html.xpath('//*[@id="book"]//*[@class="title"]//text()')
    desc = html.xpath('//*[@id="book"]//*[@class="desc"]//text()')
    for i in range(len(title)):
        # 输出内容,去除首尾空白字符串
        print(f"<<{title[i].strip()}>> {desc[i].strip()}")


if __name__ == "__main__":
    text()


总结

本文讲述程序强制等待的方式,达到定时任务的效果。

如果你不希望程序中止,可以看我的下一篇文章。

下一篇:python time小技巧:定时任务(二)

                                如果有什么疑惑,可以评论区联系我。

你可能感兴趣的:(python,开发语言,爬虫,后端)