admin 管理员组文章数量: 1184232
使用Schedule定时采集知乎热榜数据
在日常编程和系统管理中,经常会遇到需要定期执行某些任务的情况。Python 中的 Schedule 库为我们提供了一个强大的工具,可以轻松地实现任务调度和自动化。本文通过定时采集知乎热搜数据的实例,简单介绍下Schedule库的使用方法。
相关库简介
Schedule 是一款轻量级定时任务库,易用无配置。
相较于其他定时库的优缺点,可以参考 Python定时任务库对比 ——schedule vs. Celery vs. APScheduler。
简单总结
| 库 | 大小 | 优点 | 使用场景 |
|---|---|---|---|
| Schedule | 轻量级 | 易用无配置 | 简单任务 |
| Celery | 重量级 | ①任务队列 ②分布式 | 任务队列 |
| APScheduler | 相对重量级 | ①动态增删定时任务并持久化 ②支持多种存储后端 ③集成框架多,用户广 | 通用 |
安装Schedule库
pip install Schedule
简单示例
演示时设置运行3次退出,每次间隔1分钟。使用过程中,大家根据需要设置即可,一般作服务端时不设置。
count = 0
def work():
global count
count += 1
author = 'AI拾贝'
time_mow = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f'{time_mow} -- {author}')
schedule.every(1).minutes.do(work) # 每一分钟执行一次
while True:
if count > 2:
schedule.clear()
break
schedule.run_pending()
time.sleep(1)
结果输出:
2024-07-22 22:23:00 – AI拾贝
2024-07-22 22:24:00 – AI拾贝
2024-07-22 22:25:01 – AI拾贝
其他定时周期:
每1分钟执行一次:
schedule.every(1).minutes.do(work)
每小时执行一次任务:
schedule.every().hour.do(work)
每天在什么时间点执行一次任务:
schedule.every().day.at(‘10:30’).do(work)
每10-20分钟(随机)执行一次任务:
schedule.every(10).to(20).minutes.do(work)
每周一执行一次任务:
schedule.every().monday.do(work)
每周一什么时间点执行一次任务:
schedule.every().monday.at(‘09:30’).do(work)
代码实现
导入相关库
# 导入相关库
import time
import schedule
import json
import requests
import pandas as pd
数据请求
# 知乎热榜url
zhihu_url = 'https://api.zhihu/topstory/hot-list?limit=10&reverse_order=0'
# 伪装请求头
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360SE'}
解析数据并保存为csv文件
# 是否加表头
zhihu_csv_header = True
# 计次
zhihu_count = 0
def getzhihudata(url, headers):
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = 'utf-8-sig' # 确保使用UTF-8编码
datas = json.loads(r.text)['data']
allinfo = []
time_mow = time.strftime("%Y-%m-%d %H:%M", time.localtime())
print(time_mow)
for indx,item in enumerate(datas):
title = item['target']['title']
heat = item['detail_text'].split(' ')[0]
answer_count = item['target']['answer_count']
follower_count = item['target']['follower_count']
href = item['target']['url']
info = [time_mow, indx+1, title, heat, answer_count, follower_count, href]
allinfo.append(info)
# 仅首次加表头
global zhihu_csv_header
df = pd.DataFrame(allinfo,columns=['时间','排名','标题','热度(万)','回答数','关注数','链接'])
print(df.head())
df.to_csv('zhihu_hot_datas.csv', mode='a+', index=False, header=zhihu_csv_header, encoding='utf-8-sig')
zhihu_csv_header = False
global zhihu_count
zhihu_count += 1
getzhihudata(zhihu_url, headers)
设置定时任务
作为演示这里设置每5分钟执行一次爬取任务,爬取3次,大家在本地运行时可以设置10分钟或更长时间采集一次,循环次数设置30次左右,这样数据量不至于过多或过少。
# 每5分钟执行一次爬取任务:
schedule.every(5).minutes.do(getzhihudata,zhihu_url,headers)
while True:
if zhihu_count > 2:
schedule.clear()
break
schedule.run_pending()
time.sleep(1)
结果展示
循环爬取结果示例
保存文件示例
获取到这些实时数据,可以通过时间序列图——动态轮播图来展示下实时热榜。下期文章会进行简单介绍。
推荐阅读
- 【可视化】用pyecharts绘制我国人口分布
- 【可视化】软科2024中国大学可视化分析
- 【爬虫】2024中国大学排行榜爬取
欢迎关注我的公众号“AI拾贝”,原创技术文章第一时间推送。后台发送zhihu,自动回复源码和数据。
版权声明:本文标题:使用Schedule定时采集知乎热榜数据 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1754999896a3059467.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论