- 使用logging,记录程序执行过程,打印出对应的日志信息。
- 使用schedule,将程序实现定时执行的效果
控制台打印的信息:
# -*- coding:UTF-8 -*-
"""
@ProjectName :PvgameT
@FileName :fund_data.py
@Description:
@Time :2021/2/26
@Author :Qredsun
@Author_email :1410672725@qq.com
"""
import logging
import requests
import schedule
import pandas as pd
from datetime import datetime
from dataclasses import make_dataclass
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
def apiData(fundcode = 320007):
logging.info(f'请求最新基金估值数据, 基金代码{fundcode}')
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" }
url = f'http://fundgz.1234567.com.cn/js/{fundcode}.js'
res = requests.get(url, headers = headers)
logging.debug(f'get fund data from api {url}')
if res.status_code == 200 :
data = res.json()['gszzl']
else:
data = res.text
logging.debug(f'fund data {data}')
return data
def saveCsv(fundcodes = ['160629'],count = 1):
logging.info('保存数据到csv文件')
time_ = datetime.now().strftime("%Y/%m/%d")
FundData = make_dataclass('FundData', [('datetime', str),('fundcode', int), ('name', str), ('gszzl', float)])
FundDataList = []
for fundcode in fundcodes :
s = apiData(fundcode)
FundDataList.append(FundData(time_, fundcode, s['name'], s['gszzl']))
data_DataFrame = pd.DataFrame(FundDataList)
if count == 0:
logging.debug('第一次写文件,保存列名')
data_DataFrame.to_csv(f'funddatas{datetime.now().strftime("%Y%m%d")}.csv', mode='a+', index=False)
else:
logging.debug('不是第一次写文件,不保存列表')
data_DataFrame.to_csv(f'funddatas{datetime.now().strftime("%Y%m%d")}.csv', mode='a+', index=False, header=False)
# print(data_DataFrame)
return f'funddatas{datetime.now().strftime("%Y%m%d")}.csv'
def fundTask():
logging.info('每日定时任务')
fundcodes = ['320007','005063','161122']
file_name = saveCsv(fundcodes = fundcodes,count = 0)
if __name__ == '__main__':
# 每天14:45,调用fundTask()方法
schedule.every().day.at("14:45").do(fundTask)
while True:
schedule.run_pending()