| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- from datetime import datetime
- import requests
- import sqlite3
- import json
- import os
- import sys
- from weather import all_city
- import logging
- import django
- import time
- import random
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.append(BASE_DIR)
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bigdataAPI.settings')
- django.setup()
- from apps.Weather.models import District, DayData, HistoryDayData
- # # 配置日志级别和格式
- # logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
- # # 创建一个文件处理器,指定日志文件名和写入模式
- # os.mkdir("/data/weather/") if not os.path.exists("/data/weather/") else None
- # file_handler = logging.FileHandler('/data/weather/app.log')
- # file_handler.setLevel(logging.INFO)
- # # 创建一个格式化程序,用于定义日志消息的显示方式
- # formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
- # file_handler.setFormatter(formatter)
- # # 将文件处理器添加到根日志记录器中
- # logging.getLogger('').addHandler(file_handler)
- app_id = "69334222"
- app_secret = "2u4bHXHD"
- province_dict = {
- "11": '北京市',
- "12": '天津市',
- "13": '河北省',
- "14": '山西省',
- "15": '内蒙古自治区',
- "21": '辽宁省',
- "22": '吉林省',
- "23": '黑龙江省',
- "31": '上海市',
- "32": '江苏省',
- "33": '浙江省',
- "34": '安徽省',
- "35": '福建省',
- "36": '江西省',
- "37": '山东省',
- "41": '河南省',
- "42": '湖北省',
- "43": '湖南省',
- "44": '广东省',
- "45": '广西壮族自治区',
- "46": '海南省',
- "50": '重庆市',
- "51": '四川省',
- "52": '贵州省',
- "53": '云南省',
- "54": '西藏自治区',
- "61": '陕西省',
- "62": '甘肃省',
- "63": '青海省',
- "64": '宁夏回族自治区',
- "65": '新疆维吾尔自治区'
- }
- def init_data():
- # 导入全部的城市
- for k in all_city:
- print(k, "-------------")
- district = District()
- district.city_id = str(k[0])
- district.city = k[1]
- district.pid = str(k[2])
- district.save()
-
- def main():
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
- 'Accept-Language': 'en-US,en;q=0.8',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Connection': 'keep-alive',
- }
- print("up today ....")
- day_data = DayData.objects.all()
- today_error = 0
- # 调用次数统计
- day_ct = 0
- now = datetime.now()
- start_ct_time = now.strftime('%Y-%m-%d %H:%M:%S')
- now_hour = now.hour
- today_str = datetime.strptime(f'{now.year}-{now.month}-{now.day} 19:00:00', "%Y-%m-%d %H:%M:%S")
- for day_obj in day_data:
- try:
- time_out = False
- print(day_obj.cityid)
- today_url = f"http://v1.yiketianqi.com/api?unescape=1&version=v62&appid=69334222&appsecret=2ME6U58N&cityid={day_obj.cityid}"
- today_response = requests.get(today_url, headers=headers, timeout=10)
- if today_response.status_code == 200:
- today_data = json.loads(today_response.text)
- if "errcode" not in today_data.keys():
- day_obj.content = str(today_data)
- day_obj.save()
- try:
- if now_hour == 19:
- HistoryDayData.objects.create(
- cityid = day_obj.cityid,
- content = today_data,
- addtime = int(today_str.timestamp())
- )
- except Exception as e:
- print(e, "历史数据入库失败")
- else:
- print(f"cityid {day_obj.cityid} error_code {today_response.status_code}")
- print(f"request fail again : {day_obj.cityid}")
- time.sleep(2)
- today_response = requests.get(today_url, headers=headers, timeout=5)
- day_ct += 1
- if today_response.status_code == 200:
- today_data = json.loads(today_response.text)
- if "errcode" not in today_data.keys():
- day_obj.content = str(today_data)
- day_obj.save()
- print(f"request again success: {day_obj.cityid}")
- try:
- if now_hour == 19:
- HistoryDayData.objects.create(
- cityid = day_obj.cityid,
- content = today_data,
- addtime = int(today_str.timestamp())
- )
- except Exception as e:
- print(e, "历史数据入库失败")
- else:
- print(f"cityid {day_obj.cityid} error_code {today_response.status_code} again request fail")
- print(f"error {today_error}")
- today_error += 1
- time_out = True
- except Exception as e:
- print(f"request fail again : {day_obj.cityid} {e.args}")
- finally:
- day_ct += 1
- if time_out:
- time.sleep(1)
- else:
- time.sleep(0.5)
- with open("/data/weather/weather_count.txt", 'a+', encoding='utf-8') as f:
- f.write(f"当日天气接口: 开始时间:{start_ct_time} 结束时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 调用次数:{day_ct} \n")
- # 把19点的数据写入历史天气数据中
-
- if __name__ == "__main__":
- main()
|