目录
前言
一、time是什么?
二、使用步骤
1.引入库
2.获取当前时间字符串形式
3.获取目标时间字符串
4.获取目标时间戳
5.强制等待时间
三、实践
1.前言
2.源代码
3.结果
4.详解
4.1 分析
4.2 要求1
4.3 要求2
总结
大家在编写程序时,有时会希望程序可以指定时间运行。例如:
先不考虑界面情况,只考虑后端数据。
我们可以通过python标准库函数time来实现定时任务效果
time
模块是 Python 标准库中的一个模块,提供了与时间相关的功能和操作。它允许你获取当前时间、进行时间的格式化和解析、进行时间的延时等操作。
由于它是标准库函数,不需要下载直接调用函数。代码如下:
import time
接下来我们需要获取当前时间,并且修改为我们想要的格式。
方便之后修改时间。代码如下:
# 获取当前时间字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
根据用户设定的时间,修改之前获取的当前时间作为目标时间
因字符串格式无法直接修改,所以利用重组字符串的方式修改。代码如下:
# 用户设定的时间
target_time = input("请输入时间:")
# 重组时间字符串
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)
获取当前时间戳,再计算当前时间戳与目标时间戳的差值。
这个差值就是定时所需的等待时间。
最后根据time.sleep()强制程序中断指定时间方式实现定时!代码如下:
# 当前时间戳
current_time2 = time.time()
TIME = timestamp - current_time2
time.sleep(TIME)
以上就是定时任务的方式,接下来我们开始实操。
程序需求:今天的中午12点整开始爬取xxx内容
根据需求封装为函数,代码如下:
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()
运行之后,用户在终端输入时间,再按下回车键继续运行。结果如下:
编写程序先看需求!
分解咱们的需求,可分为两个要求:
1.需要12点整运行
2.运用爬虫获取内容
第一个要求就是本文重点讲解的,若有疑惑请看目录中第二大点
实现方法:计算目标时间与当前时间的时间差,再使用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)
这次爬取的是一个静态网页,所以我们只需要简单的获取网页内容就好了。
本文采用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小技巧:定时任务(二)
如果有什么疑惑,可以评论区联系我。