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 知乎热榜