python将天气预报可视化

目录
  • 前言
  • 结果展示
  • 程序代码
  • 期望

前言

在想题材之际,打开私信,有许多萌新&小伙伴询问我之前写的一篇《python爬取天气预报数据,并实现数据可视化》中的bug怎么解决,虽然我在之前,就在评论区提供了自己的解决思路,但可能不够清楚,于是写这篇文章,来解决bug,并对程序进行优化。

结果展示

其中:

红线代表当天最高气温,蓝线代表最低气温,最高气温点上的标注为当天的天气情况。

如果使夜晚运行程序,则最高气温和最低气温的点会重合,使由爬取数据产生误差导致的。

程序代码

详细请看注释

# -*- coding: UTF-8 -*-
"""
# @Time: 2022/1/4 11:02
# @Author: 远方的星
# @CSDN: https://blog.csdn.net/qq_44921056
"""
import chardet
import requests
from lxml import etree
from fake_useragent import UserAgent
import pandas as pd
from matplotlib import pyplot as plt

# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='D:/Pycharm/fake_useragent.json')

# 随机切换请求头
def random_ua():
    headers = {
        "user-agent": ua.random
    }
    return headers

# 解析页面
def res_text(url):
    res = requests.get(url=url, headers=random_ua())
    res.encoding = chardet.detect(res.content)['encoding']
    response = res.text
    html = etree.HTML(response)
    return html

# 获得未来七天及八到十五天的页面链接
def get_url(url):
    html = res_text(url)
    url_7 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[2]/a/@href')[0]
    url_8_15 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[3]/a/@href')[0]
    # print(url_7)
    # print(url_8_15)
    return url_7, url_8_15

# 获取未来七天的天气情况
def get_data_7(url):
    html = res_text(url)
    list_s = html.xpath('//*[@id="7d"]/ul/li')  # 获取天气数据列表
    Date, Weather, Low, High = [], [], [], []
    for i in range(len(list_s)):
        list_date = list_s[i].xpath('./h1/text()')[0]  # 获取日期,如:4日(明天)
        # print(list_data)
        list_weather = list_s[i].xpath('./p[1]/@title')[0]  # 获取天气情况,如:小雨转雨夹雪
        # print(list_weather)
        tem_low = list_s[i].xpath('./p[2]/i/text()')  # 获取最低气温
        tem_high = list_s[i].xpath('./p[2]/span/text()')  # 获取最高气温
        if tem_high == []:  # 遇到夜晚情况,筛掉当天的最高气温
            tem_high = tem_low  # 无最高气温时,使最高气温等于最低气温
        tem_low = int(tem_low[0].replace('℃', '')) # 将气温数据处理
        tem_high = int(tem_high[0].replace('℃', ''))
        # print(type(tem_high))
        Date.append(list_date), Weather.append(list_weather), Low.append(tem_low), High.append(tem_high)
    excel = pd.DataFrame()  # 定义一个二维列表
    excel['日期'] = Date
    excel['天气'] = Weather
    excel['最低气温'] = Low
    excel['最高气温'] = High
    # print(excel)
    return excel

def get_data_8_15(url):
    html = res_text(url)
    list_s = html.xpath('//*[@id="15d"]/ul/li')
    Date, Weather, Low, High = [], [], [], []
    for i in range(len(list_s)):
        # data_s[0]是日期,如:周二(11日),data_s[1]是天气情况,如:阴转晴,data_s[2]是最低温度,如:/-3℃
        data_s = list_s[i].xpath('./span/text()')
        # print(data_s)
        date = modify_str(data_s[0])  # 获取日期情况
        weather = data_s[1]
        low = int(data_s[2].replace('/', '').replace('℃', ''))
        high = int(list_s[i].xpath('./span/em/text()')[0].replace('℃', ''))
        # print(date, weather, low, high)
        Date.append(date), Weather.append(weather), Low.append(low), High.append(high)
    # print(Date, Weather, Low, High)
    excel = pd.DataFrame()  # 定义一个二维列表
    excel['日期'] = Date
    excel['天气'] = Weather
    excel['最低气温'] = Low
    excel['最高气温'] = High
    # print(excel)
    return excel

# 将8-15天日期格式改成与未来7天一致
def modify_str(date):
    date_1 = date.split('(')
    date_2 = date_1[1].replace(')', '')
    date_result = date_2 + '(' + date_1[0] + ')'
    return date_result

# 实现数据可视化
def get_image(date, weather, high, low):
    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    # 根据数据绘制图形
    fig = plt.figure(dpi=128, figsize=(10, 6))
    ax = fig.add_subplot(111)
    plt.plot(date, high, c='red', alpha=0.5, marker='*')
    plt.plot(date, low, c='blue', alpha=0.5, marker='o')
    # 给图表中两条折线中间的部分上色
    plt.fill_between(date, high, low, facecolor='blue', alpha=0.2)
    # 设置图表格式
    plt.title('邳州近15天天气预报', fontsize=24)
    plt.xlabel('日期', fontsize=12)
    # 绘制斜的标签,以免重叠
    fig.autofmt_xdate()
    plt.ylabel('气温', fontsize=12)
    # 参数刻度线设置
    plt.tick_params(axis='both', which='major', labelsize=10)
    # 修改刻度
    plt.xticks(date[::1])
    # 对点进行标注,在最高气温点处标注当天的天气情况
    for i in range(15):
        ax.annotate(weather[i], xy=(date[i], high[i]))
    # 显示图片
    plt.show()

def main():
    base_url = 'http://www.weather.com.cn/weather1d/101190805.shtml'
    url_7, url_8_15 = get_url(base_url)
    data_1 = get_data_7(url_7)
    data_2 = get_data_8_15(url_8_15)
    data = pd.concat([data_1, data_2], axis=0, ignore_index=True)  # ignore_index=True实现两张表拼接,不保留原索引
    get_image(data['日期'], data['天气'], data['最高气温'], data['最低气温'])

if __name__ == '__main__':
    main()

期望

这是以一个城市为例的可视化,下次争取做到根据输入的城市进行天气预报可视化

到此这篇关于python将天气预报可视化的文章就介绍到这了,更多相关python天气预报内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现智能语音天气预报

    python编写的语音天气预报 本系统主要包括四个函数: 1.获取天气数据 1.输入要查询天气的城市 2.利用urllib模块向中华万年历天气api接口请求天气数据 3.利用gzip解压获取到的数据,并编码utf-8 4.利用json转化成python识别的数据,返回为天气预报数据复杂形式的字典(字典中的字典) 2.输出当天天气数据 1.格式化输出当天天气,包括:天气状况,此时温度,最高温度.最低温度,风级,风向等. 3,语音播报当天天气 1.创建要输出的语音文本(weather_forecas

  • python显示天气预报

    复制代码 代码如下: import urllib2import jsonimport stringurl ='http://m.weather.com.cn/data/101090502.html're = urllib2.urlopen(url).read()we = json.loads(re)['weatherinfo']print we['city'] , we['date_y'].center(30) ,   we['week']print we['temp1'], we['weath

  • 40行Python代码实现天气预报和每日鸡汤推送功能

    情人节刚过去几天,但是这和我们程序员有什么关系呢,对我们来说,万物皆对象.但是啊,小编为了讨得仰慕已久的女神的欢心(真香),便用python爬取了爱词霸网站的每日一句和天气预报网站的天气预报,并且每天定时将内容推送到女神的手机短信中(代码实现,不需要短信费哦). 好东西要学会分享,因此小编打算分三个步骤来教大家实现,最后会给出源代码. 第一步,实现爬取爱词霸网站的每日一句: 爱词霸的每日一句包括了英文版和中文版.爬取下来实际上4行有效代码就能搞定,不过为了提高代码的重用性,就将这个功能封装成了一

  • python制作的天气预报小工具(gui界面)

    一.准备工作 不需要准备. 二.预览 1.启动 启动以后自动定位所在城市,展示定位城市的天气. 2.添加城市 3.展示多个城市天气 添加天气之后能够显示多个城市天气信息. 三.设计流程 1.获取城市天气信息过程 用此流程图展示定位城市信息到获取城市天气信息过程. 四.源代码 1.Weather_Tool-v1.0.py from tkinter import * from tkinter import ttk from PIL import Image,ImageTk from tkinter

  • python获取天气接口给指定微信好友发天气预报

    先看下效果图: 用到的模块: PyMySQL requests threading wxpy 要实现上面的示例,首先是有两大块地方 获取天气信息 通过微信将天气信息发送出去 而获取天气信息又包括几个小的需要注意的地方 获取天气信息 获取天气信息的接口 获取天气信息的城市 获取所在城市的城市码 假如我们给多个人发送天气情况,这几个人来自不同的城市,那么我们不可能每次都要输入城市名,然后查找城市码,然后再访问接口,获取天气情况,这样会非常的麻烦,所以我们需要考虑将城市名跟城市码一一对应起来,说到一一

  • 基于Python获取城市近7天天气预报

    这篇文章主要介绍了基于Python获取城市近7天天气预报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先,我们打开中国天气网,找到黄石市近7天天气的网页. http://www.weather.com.cn/weather/101200601.shtml 然后按F12开始分析网页结构,找到各个标签,并分析它们的作用.h1:日期:p:天气:tem-span:最高温:tem-i:最低温:win:风:em:风向:win-i:风力. 接下来,我们需

  • python将天气预报可视化

    目录 前言 结果展示 程序代码 期望 前言 在想题材之际,打开私信,有许多萌新&小伙伴询问我之前写的一篇<python爬取天气预报数据,并实现数据可视化>中的bug怎么解决,虽然我在之前,就在评论区提供了自己的解决思路,但可能不够清楚,于是写这篇文章,来解决bug,并对程序进行优化. 结果展示 其中: 红线代表当天最高气温,蓝线代表最低气温,最高气温点上的标注为当天的天气情况. 如果使夜晚运行程序,则最高气温和最低气温的点会重合,使由爬取数据产生误差导致的. 程序代码 详细请看注释 #

  • Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 这次要爬的站点是这个:http://www.weather.com.cn/forecast/ 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 首先来到目标数据的网页 http://www.weather.com.cn/weather40d/101280701.shtml 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化. 这是因为网页前端使用

  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化的方法. 关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据. 1.成品图 这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M.爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图. 可以

  • python地震数据可视化详解

    本文实例为大家分享了python地震数据可视化的具体代码,供大家参考,具体内容如下 参考源码:seisplot 准备工作: 在windows10下安装python3.7,下载参考源码到本地. 1. demo绘图测试 demo绘图指令 cmd> python seisplot.py --demo 问题1)缺少依赖包 File "D:/Desktop/python可视化/seisplot/seisplot.py", line 16, in <module> import

  • Python实现时间序列可视化的方法

    时间序列数据在数据科学领域无处不在,在量化金融领域也十分常见,可以用于分析价格趋势,预测价格,探索价格行为等. 学会对时间序列数据进行可视化,能够帮助我们更加直观地探索时间序列数据,寻找其潜在的规律. 本文会利用Python中的matplotlib[1]库,并配合实例进行讲解.matplotlib库是一个用于创建出版质量图表的桌面绘图包(2D绘图库),是Python中最基本的可视化工具. [工具]Python 3 [数据]Tushare [注]示例注重的是方法的讲解,请大家灵活掌握. 1.单个时

  • Python干货:分享Python绘制六种可视化图表

    可视化图表,有相当多种,但常见的也就下面几种,其他比较复杂一点,大都也是基于如下几种进行组合,变换出来的.对于初学者来说,很容易被这官网上众多的图表类型给吓着了,由于种类太多,几种图表的绘制方法很有可能会混淆起来. 因此,在这里,我特地总结了六种常见的基本图表类型,你可以通过对比学习,打下坚实的基础. 01. 折线图 绘制折线图,如果你数据不是很多的话,画出来的图将是曲折状态,但一旦你的数据集大起来,比如下面我们的示例,有100个点,所以我们用肉眼看到的将是一条平滑的曲线. 这里我绘制三条线,只

  • 使用Python快速制作可视化报表的方法

    我们可以试用可视化包--Pyechart. Echarts是百度开源的一个数据可视化JS库,主要用于数据可视化. pyecharts是一个用于生成Echarts图标的类库.实际就是Echarts与Python的对接. 安装 pyecharts兼容Python2和Python3.执行代码: pip install pyecharts(快捷键Windows+R--输入cmd) 初级图表 1.柱状图/条形图 from pyecharts import Bar attr=["衬衫","

  • linux操作系统利用python实现任务管理器可视化功能

    1.python安装 1.创建一个文件夹, mkdir python 进入文件夹下,进行解压: tar zxvf Python-3.6.5.tar 进入Python-3.6.5这个文件夹下面输入: ./configure 接下来出现一大堆过程,最后提示你 run 一个命令 按照提示的命令输入就行. 输入make命令(如果提示不存在,就使用 apt install make安装即可),等待就行. make && make install #编译并安装 继续等待安装完成即可. 这时我们cd到根

  • Python手绘可视化工具cutecharts使用实例

    这篇文章主要介绍了Python手绘可视化工具cutecharts使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,给大家介绍一个很酷的 Python 手绘风格可视化神包:cutecharts. 和 Matplotlib .pyecharts 等常见的图表不同,使用这个包可以生成下面这种看起来像手绘的各种图表,在一些场景下使用效果可能会更好. GitHub 地址:https://github.com/chenjiandongx/cut

  • python seaborn heatmap可视化相关性矩阵实例

    方法 import pandas as pd import numpy as np import seaborn as sns df = pd.DataFrame(np.random.randn(50).reshape(10,5)) corr = df.corr() sns.heatmap(corr, cmap='Blues', annot=True) 将矩阵型简化为对角矩阵型: mask = np.zeros_like(corr) mask[np.tril_indices_from(mask)

随机推荐