天气预报信息获取程序--可以使用

news2024/11/16 23:19:58

 

 

 

一、优化了,输入城市代码,获取城市信息

# coding=utf-8
import requests
import re
import csv
import datetime

class WeatherForecast(object):
    def __init__(self,city_code,start_year,end_year,end_month):
        self.city_code=city_code
        self.start_year=start_year
        self.end_year=end_year
        self.end_month=end_month

        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=59493&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'
        # #西安地址链接  57036--->BareaId%5D=59493
        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=57036&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'

        # 咸阳地址链接57048--->%5BareaId%5D=59493
        # self.url = 'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=57048&areaInfo%5BareaType%5D=2&date%5Byear%5D={0}&date%5Bmonth%5D={1}'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.24',
            'accept-encoding': 'gzip, deflate, br'
        }
        self.data_list = []

    def get_content(self, url):
        res = requests.get(url=url, headers=self.headers)
        content = res.json()
        # print(content['data'])
        return content['data']

    def parse_data(self, content):
        result = re.compile(r'<td>(?P<date>.*?)</td>.*?<td style="color:#ff5040;">(?P<max>.*?)</td>'
                            r'.*?<td style="color:#3097fd;" >(?P<min>.*?)</td>.*?<td>(?P<weather>.*?)</td>'
                            r'.*?<td>(?P<cloud>.*?)</td>.*?<td><span class="history-aqi wea-aqi.*?>(?P<sky>.*?)</span></td>',
                            re.S)
        find_result = result.finditer(content)
        for it in find_result:
            data_dict = it.groupdict()
            # print(data_dict)
            self.data_list.append(data_dict)
        return self.data_list

    def write_csv(self, data_list):
        curent_date=datetime.datetime.now().strftime("%Y%m%d")
        save_name=str(self.city_code)+curent_date+'.csv'
        with open(save_name, 'w',newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['日期', '最高温度', '最低温度', '天气', '风力风向', '空气质量'])
            for i in data_list:
                writer.writerow(i.values())
                print(i.values())

    #     爬取数据的事项,只能获取整年,如果到月份的话                if year==2024 & month>6:
    #                     continue  通过他跳过指定的月份,获取数据
    def run(self):
        for year in range(self.start_year, self.end_year+1, 1):
            for month in range(1, 13, 1):
                if year>self.end_year:
                    continue
                elif  year==self.end_year:
                    if month>self.end_month:
                        continue


                url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={self.city_code}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'

                print('正在获取第{0}年{1}月的天气!'.format(year, month))
                content = self.get_content(url)
                data = self.parse_data(content)
                self.write_csv(data)
            print('全部获取完毕,请在程序目录获取下载xxxx.csv!')


# 使用办法  就是换里面的url地址,以及修改下面的年月
# 具体内容查看 “数据分析.txt”里面的信息
# 天气预报查询接口
# https://tianqi.2345.com/wea_history/57036.htm
if __name__ == '__main__':
    print("输入起始年,结束年,结束月")

    city_code = int(input("起始城市代码:"))

    start_year=int(input("起始年:"))
    end_year=int(input("结束年:"))
    end_month=int(input("结束年月:"))



    weather = WeatherForecast(city_code,start_year,end_year,end_month)
    weather.run()


    # 调整获取指定年份的指定月份之前的数据

二、代码分析

本次对数据提取进行分析:---》数据解析的分析

    def parse_data(self, content):
        result = re.compile(r'<td>(?P<date>.*?)</td>.*?<td style="color:#ff5040;">(?P<max>.*?)</td>'
                            r'.*?<td style="color:#3097fd;" >(?P<min>.*?)</td>.*?<td>(?P<weather>.*?)</td>'
                            r'.*?<td>(?P<cloud>.*?)</td>.*?<td><span class="history-aqi wea-aqi.*?>(?P<sky>.*?)</span></td>',
                            re.S)
        find_result = result.finditer(content)
        for it in find_result:
            data_dict = it.groupdict()
            # print(data_dict)
            self.data_list.append(data_dict)
        return self.data_list

 

上面返回的内容是个json文件,json中data就是需要的数据

 那么这个数据内容是什么呢?我们打印出来看下

 

 

  result = re.compile(r'<td>(?P<date>.*?)</td>.*?<td style="color:#ff5040;">(?P<max>.*?)</td>'
                            r'.*?<td style="color:#3097fd;" >(?P<min>.*?)</td>.*?<td>(?P<weather>.*?)</td>'
                            r'.*?<td>(?P<cloud>.*?)</td>.*?<td><span class="history-aqi wea-aqi.*?>(?P<sky>.*?)</span></td>',
                            re.S)

通过上面的正则就是可以提取出来其中的内容了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux安装rinetd实现端口转发

在Linux系统中大多数情况选择用iptables来实现端口转发&#xff0c;iptables虽然强大&#xff0c;但配置不便&#xff0c;而且新手容易出错。在此分享另一个TCP/UDP端口转发工具rinetd&#xff0c;rinetd体积小巧&#xff0c;配置也很简单。 这篇文章以CentOS 7为例&#xff0…

职场的尽头,是编制?

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 本来以为“上岸”是年轻人的专利&#xff0c;没想到这两天却从一位42岁的朋友那里&#xff0c;听到了他老人家上岸的消息。这位朋友曾在阿里任职多年&#xff0c;从去年下半年就开始和一所大学接洽&am…

Visual C++ 6.0环境开发PACS影像系统的技术指标和精准算法

一、技术指标 •图像文件格式&#xff1a;DCM、JPG、BMP、TIF等 •可支持显示属性设置&#xff1a;24/32位真彩&#xff1b;256位色&#xff08;黑白&#xff09; •可支持监视器分辨率&#xff1a;1024&#xfe61;768&#xff1b;1280&#xfe61;1024&#xff1b;1600&…

chatgpt赋能python:Python删除非数字字符

Python删除非数字字符 Python是一种流行的编程语言&#xff0c;主要用于数据科学、人工智能、Web开发和自动化等领域。在数据处理和清洗中&#xff0c;Python非常强大且易于使用&#xff0c;而Python删除非数字字符是一个非常常见的操作。在本文中&#xff0c;我们将介绍如何用…

parser.add_argument详解

接上一篇&#xff1a;写一个python文件&#xff0c;在shell脚本中运行 1.来了解下 parser.add_argument函数的参数 可以看下下面的一个参数例子 def get_args():parser argparse.ArgumentParser()parser.add_argument(-b, --batch_size, typeint, default64)parser.add_argu…

java-函数式接口和Stream流

java-函数式接口和Stream流 一、函数式接口 1.1函数式接口概述 概念 有且仅有一个抽象方法的接口 如何检测一个接口是不是函数式接口 FunctionalInterface 放在接口定义的上方&#xff1a;如果接口是函数式接口&#xff0c;编译通过&#xff1b;如果不是&#xff0c;编译失败…

K8S系列文章之基础理论篇

第一部分&#xff1a;理解控制器 简介&#xff1a;当我们尝试去理解 Kubernetes 集群工作原理的时候&#xff0c;控制器肯定是一个难点。这是因为 控制器有很多&#xff0c;具体实现大相径庭&#xff1b;且控制器的实现用到了一些较为晦涩的机制&#xff0c;不易理解。但 是&a…

2023轻松斩获5家大厂offer后的面试总结!

2023年能这么轻松地斩获5家大厂offer&#xff0c;其实这些功劳都要归功于阿里团队的这份软件测试核心知识文档&#xff0c;小编今天在此分享出来&#xff0c;也希望能帮助更多的小伙伴拿到更多高薪的offer&#xff1b; 内容涉及&#xff1a;测试理论、Linux基础、MySQL基础、W…

【小张和Oracle数据库】Java两年半练习生裁员后竟然找到了一份DBA的工作?

一、引言 大家好&#xff0c;我叫张小念&#xff08;小名念念&#xff09;&#xff0c;家里人都叫宝儿。 一个java两年半的练习生&#xff0c;经历了起起伏伏的疫情时代&#xff0c;终于在java一行也算是入了门。 但是&#xff0c;计划永远赶不上变化&#xff0c; 有一天经…

Makerbase SimpleFOC ESP32 例程3 I²C双编码器测试(AS5600)

Makerbase SimpleFOC ESP32 例程3 IC双编码器测试(AS5600) 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线156pin杜邦线2 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运…

Makerbase SimpleFOC ESP32 例程2 双电机开环位置测试

Makerbase SimpleFOC ESP32 例程2 双电机开环位置测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线1 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。 主要参数如…

区间预测 | MATLAB实现基于QRCNN-GRU-Multihead-Attention多头注意力卷积门控循环单元多变量时间序列区间预测

区间预测 | MATLAB实现基于QRCNN-GRU-Multihead-Attention多头注意力卷积门控循环单元多变量时间序列区间预测 目录 区间预测 | MATLAB实现基于QRCNN-GRU-Multihead-Attention多头注意力卷积门控循环单元多变量时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一…

菱形图案打印、水仙花数、买汽水

目录 菱形图案打印 上三角 下三角 拓展&#xff1a;带空格直角三角形图案 代码一 代码二 水仙花数 拓展&#xff1a;变种水仙花数 买汽水 代码一 代码二 妙用汽水瓶 菱形图案打印 题目要求 其实呢这道题很多人想到直接用printf()进行输出&#xff0c;我想说的是&#…

开源:小狐狸GPT付费AI-v2.0.0 H5和小程序端增加使用手册

小狐狸GPT付费AI体验系统、系统版本更新至1.2.0&#xff0c;源码为小程序、H5、WEB版本&#xff0c;购买含更新&#xff0c;独立版&#xff1b;开源、开源、开源、可二开&#xff01;&#xff01;200包含H5、web的vue全开源&#xff0c;最新版更新了&#xff1a;H5和小程序端增…

打造一个你自己图标exe的Python脚本启动器

目录 1. 背景需求2. 需求软件3. 准备图标4. 编译命令4.1 使用Windows API4.2 使用-mwindows参数编译4.3 使用pythonw.exe解释器 5. 测试运行5.1 参考代码5.2 使用效果 1. 背景需求 有时候为了确保多平台的兼容性&#xff0c;需要开发绿色版的应用程序&#xff0c;也就是在嵌入…

windows server 查看登录日志

windows server 查看登录日志 1、 先要开启登录审核&#xff0c;在查看登录日志 点击 “服务器管理器” – > “工具” – > “本地安全策略” 点击 “本地策略” – > “点击审核策略” 审核 成功 和 失败的记录&#xff08;可以全选也可以选择需要审计的操作&am…

Linux pthread_create源码分析

前言 本文介绍pthread_create函数的使用和源码分析。 /include/pthread.h bionic/libc/bionic/pthread_create.cpp bionic/libc/bionic/pthread_attr.cpp pthread_create使用 Android中的绝大部分线程&#xff0c;最后都是通过pthread_create创建的。 int pthread_create(p…

【LeetCode热题100】打卡第11天:有效括号合并两个有序链表

文章目录 【LeetCode热题100】打开第11天⛅前言&#x1f512;有效括号&#x1f511;题解&#x1f512;合并两个有序链表&#x1f511;题解&#x1f4a1;思路一&#xff1a;合并到第三方链表上&#x1f510;【非递归实现】&#x1f510;【递归实现】 &#x1f4a1;思路二 &#…

2023年上半年数据库系统工程师下午真题及答案解析

试题一(15分) 某新能源汽车公司为了提升效率&#xff0c;需开发一个汽车零件采购系统。请完成系统的数据库设计。 概念结构设计 需求描述 (1)记录供应商信息&#xff0c;包括供应商的名称、地址和一个电话。 (2)记录零件信息&#xff0c;包括零件的编码、名称和价格。 (3)…

线程的四个属性

如上图所示&#xff0c;线程有四个属性&#xff1a; 线程ID线程名称守护线程线程优先级 1. 线程ID 每个线程都有id&#xff0c;这个id不能修改 线程id会不停的自增&#xff0c;从1开始 main函数就是第一个线程&#xff0c;id1 id 是操作系统用来识别各个线程的编号&#…