我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python怎么实现爬取天气数据并可视化分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python怎么实现爬取天气数据并可视化分析

本篇内容主要讲解“Python怎么实现爬取天气数据并可视化分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现爬取天气数据并可视化分析”吧!

核心功能设计

总体来说,我们需要先对中国天气网中的天气数据进行爬取,保存为csv文件,并将这些数据进行可视化分析展示。

拆解需求,大致可以整理出我们需要分为以下几步完成:

通过爬虫获取中国天气网7.20-7.21的降雨数据,包括城市,风力方向,风级,降水量,相对湿度,空气质量。

对获取的天气数据进行预处理,分析河南的风力等级和风向,绘制风向风级雷达图。

根据获取的温度和湿度绘制温湿度相关性分析图,进行温度、湿度对比分析。

根据获取的各城市的降雨量,可视化近24小时的每小时时段降水情况。

绘制各城市24小时的累计降雨量。

实现步骤

爬取数据

首先我们需要获取各个城市的降雨数据,通过对中国天气网网址分析发现,城市的天气网址为:http://www.weather.com.cn/weather/101180101.shtml。

Python怎么实现爬取天气数据并可视化分析

根据对数据分析,返回的json格式数据,不难发现:

101180101就是代表城市编号- 7天的天气预报数据信息在div标签中并且id=“7d”- 日期、天气、温度、风级等信息都在ul和li标签 网页结构我们上面已经分析好了,那么我们就可以来动手爬取所需要的数据了。获取到所有的数据资源之后,可以把这些数据保存下来。

请求网站

天气网的网址:http://www.weather.com.cn/weather/101180101.shtml。如果想爬取不同的地区只需修改最后的101180101地区编号,前面的weather代表是7天的网页。

def getHTMLtext(url): """请求获得网页内容""" try:  r = requests.get(url, timeout = 30)  r.raise_for_status()  r.encoding = r.apparent_encoding  print("Success")  return r.text except:  print("Fail")  return" "

Python怎么实现爬取天气数据并可视化分析

处理数据

采用BeautifulSoup库对刚刚获取的字符串进行数据提取。获取我们需要的风力方向,风级,降水量,相对湿度,空气质量等。

def get_content(html,cityname): """处理得到有用信息保存数据文件""" final = []          # 初始化一个列表保存数据 bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象 body = bs.body data = body.find('div', {<!-- -->'id': '7d'})    # 找到div标签且id = 7d # 下面爬取当天的数据 data2 = body.find_all('div',{<!-- -->'class':'left-div'}) text = data2[2].find('script').string text = text[text.index('=')+1 :-2]   # 移除改var data=将其变为json数据 jd = json.loads(text) dayone = jd['od']['od2']     # 找到当天的数据 final_day = []           # 存放当天的数据 count = 0 for i in dayone:  temp = []  if count &lt;=23:   temp.append(i['od21'])     # 添加时间   temp.append(cityname+'市')   # 添加城市   temp.append(i['od22'])     # 添加当前时刻温度   temp.append(i['od24'])     # 添加当前时刻风力方向   temp.append(i['od25'])     # 添加当前时刻风级   temp.append(i['od26'])     # 添加当前时刻降水量   temp.append(i['od27'])     # 添加当前时刻相对湿度   temp.append(i['od28'])     # 添加当前时刻控制质量#    print(temp)   final_day.append(temp)   data_all.append(temp)  count = count +1 # 下面爬取24h的数据 ul = data.find('ul')                     # 找到所有的ul标签 li = ul.find_all('li')                   # 找到左右的li标签 i = 0                                    # 控制爬取的天数 for day in li:                          # 遍历找到的每一个li     if i &lt; 7 and i &gt; 0:         temp = []                        # 临时存放每天的数据         date = day.find('h2').string     # 得到日期         date = date[0:date.index('日')]  # 取出日期号         temp.append(date)         inf = day.find_all('p')          # 找出li下面的p标签,提取第一个p标签的值,即天气         temp.append(inf[0].string)         tem_low = inf[1].find('i').string   # 找到最低气温         if inf[1].find('span') is None:   # 天气预报可能没有最高气温             tem_high = None         else:             tem_high = inf[1].find('span').string  # 找到最高气温         temp.append(tem_low[:-1])         if tem_high[-1] == '℃':          temp.append(tem_high[:-1])         else:          temp.append(tem_high)         wind = inf[2].find_all('span')  # 找到风向         for j in wind:          temp.append(j['title'])         wind_scale = inf[2].find('i').string # 找到风级         index1 = wind_scale.index('级')         temp.append(int(wind_scale[index1-1:index1]))         final.append(temp)     i = i + 1 return final_day,final

城市的天气数据拿到了,同理我们可以根据不同的地区编号获取河南省各个地级市的天气数据。

Citycode = {<!-- --> "郑州": "101180101",             "新乡": "101180301",             "许昌": "101180401",             "平顶山": "101180501",             "信阳": "101180601",             "南阳": "101180701",             "开封": "101180801",             "洛阳": "101180901",             "商丘": "101181001",             "焦作": "101181101",             "鹤壁": "101181201",             "濮阳": "101181301",             "周口": "101181401",             "漯河": "101181501",             "驻马店": "101181601",             "三门峡": "101181701",             "济源": "101181801",             "安阳": "101180201"}citycode_lists = list(Citycode.items())for city_code in citycode_lists:    city_code = list(city_code)    print(city_code)    citycode = city_code[1]    cityname = city_code[0]    url1 = 'http://www.weather.com.cn/weather/'+citycode+ '.shtml'    # 24h天气中国天气网 html1 = getHTMLtext(url1) data1, data1_7 = get_content(html1,cityname)  # 获得1-7天和当天的数据

存储数据

def write_to_csv(file_name, data, day=14): """保存为csv文件""" with open(file_name, 'a', errors='ignore', newline='') as f:  if day == 14:   header = ['日期','城市','天气','最低气温','最高气温','风向1','风向2','风级']  else:   header = ['小时','城市','温度','风力方向','风级','降水量','相对湿度','空气质量']  f_csv = csv.writer(f)  f_csv.writerow(header)  f_csv.writerows(data)write_to_csv('河南天气.csv',data_all,1)

这样我们就可以把全省的各个地级市天气数据保存下来了。

Python怎么实现爬取天气数据并可视化分析

风向风级雷达图

统计全省的风力和风向,因为风力风向使用极坐标的方式展现比较清晰,所以我们采用极坐标的方式展现一天的风力风向图,将圆分为8份,每一份代表一个风向,半径代表平均风力,并且随着风级增高,蓝色加深。

def wind_radar(data): """风向雷达图""" wind = list(data['风力方向']) wind_speed = list(data['风级']) for i in range(0,24):  if wind[i] == "北风":   wind[i] = 90  elif wind[i] == "南风":   wind[i] = 270  elif wind[i] == "西风":   wind[i] = 180  elif wind[i] == "东风":   wind[i] = 360  elif wind[i] == "东北风":   wind[i] = 45  elif wind[i] == "西北风":   wind[i] = 135  elif wind[i] == "西南风":   wind[i] = 225  elif wind[i] == "东南风":   wind[i] = 315 degs = np.arange(45,361,45) temp = [] for deg in degs:  speed = []  # 获取 wind_deg 在指定范围的风速平均值数据  for i in range(0,24):   if wind[i] == deg:    speed.append(wind_speed[i])  if len(speed) == 0:   temp.append(0)  else:   temp.append(sum(speed)/len(speed)) print(temp) N = 8 theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8) # 数据极径 radii = np.array(temp) # 绘制极区图坐标系 plt.axes(polar=True) # 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色 colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii] plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors) plt.title('河南风级图--Dragon少年',x=0.2,fontsize=16) plt.show()

结果如下:

Python怎么实现爬取天气数据并可视化分析

观察可以发现,当天的东北风最多,平均风级达到了1.75级。

温湿度相关性分析

我们可以分析温度和湿度之间是否存在关系,为了更加清楚直观地验证,可以使用离散点plt.scatter()方法将温度为横坐标、湿度为纵坐标,每个时刻的点在图中点出来,并且计算相关系数。

def calc_corr(a, b): """计算相关系数""" a_avg = sum(a)/len(a) b_avg = sum(b)/len(b) cov_ab = sum([(x - a_avg)*(y - b_avg) for x,y in zip(a, b)]) sq = math.sqrt(sum([(x - a_avg)**2 for x in a])*sum([(x - b_avg)**2 for x in b])) corr_factor = cov_ab/sq return corr_factordef corr_tem_hum(data): """温湿度相关性分析""" tem = data['温度'] hum = data['相对湿度'] plt.scatter(tem,hum,color='blue') plt.title("温湿度相关性分析图--Dragon少年") plt.xlabel("温度/℃") plt.ylabel("相对湿度/%") # plt.text(20,40,"相关系数为:"+str(calc_corr(tem,hum)),fontdict={'size':'10','color':'red'}) plt.show() print("相关系数为:"+str(calc_corr(tem,hum)))

结果如下:

Python怎么实现爬取天气数据并可视化分析

观察可以发现,一天的温度和湿度具有强烈的相关性,呈负相关。当温度较低时,空气中水分含量较多,湿度自然较高,而温度高时空气中可容纳的水汽增大,相对湿度随之降低,但其实空气中的水汽往往是增加的。

24小时内每小时时段降水

from pyecharts import options as optsfrom pyecharts.charts import Map,Timeline#定义一个timeline和map的组合图def timeline_map(data):    tl = Timeline().add_schema(play_interval =300,height=40,is_rewind_play=False,orient = "horizontal",is_loop_play = True,is_auto_play=False)#设置播放速度、是否循环播放等参数    for h in time_line_final:        x =data[data["小时"]==h]['城市'].values.tolist() #选取指定城市        y=data[data["小时"]==h]['降水量'].values.tolist() #选取时间的降水量        map_shape = (            Map()            .add("{}h时降水量(mm)".format(h),[list(z) for z in zip(x, y)],"河南") #打包输入地区及对应降水量数据            .set_series_opts(label_opts=opts.LabelOpts("{b}")) #配置系列参数,{b}为显示地区数据            .set_global_opts(                title_opts=opts.TitleOpts(title="河南省降雨分布--Dragon少年"), #全局参数中设置标题                visualmap_opts=opts.VisualMapOpts(max_=300,  #设置映射配置项的最大值                                                  is_piecewise=True, #设置是否为分段显示                                                  pos_top = "60%", #映射配置项距图片上部的距离                                                  pieces=[                                                        {"min": 101, "label": '>100ml', "color": "#FF0000"},  # 分段指定颜色及名称                                                        {"min": 11, "max": 50, "label": '11-50ml', "color": "#FF3333"},                                                        {"min": 6, "max": 10, "label": '6-10ml', "color": "#FF9999"},                                                        {"min": 0.1, "max": 5, "label": '0.1-5ml', "color": "#FFCCCC"}])        ))        tl.add(map_shape, "{}h".format(h)) #将不同日期的数据加入到timeline中    return tltimeline_map(data).render("rainfall.html")

24小时累计降雨量

from pyecharts import options as optsfrom pyecharts.charts import Map,Timeline#定义一个timeline和map的组合图time_line_final = list(data1['小时'].iloc[0:24])def timeline_map(data1):    tl = Timeline().add_schema(play_interval =200,height=40,is_rewind_play=False,orient = "horizontal",is_loop_play = True,is_auto_play=True)#设置播放速度、是否循环播放等参数    for h in time_line_final:        x =data1[data1["小时"]==h]['城市'].values.tolist() #选取指定城市        y=data1[data1["小时"]==h]['降水量'].values.tolist() #选取时间的降水量        map_shape1 = (            Map()            .add("{}h时累计降水量(mm)".format(h),[list(z) for z in zip(x, y)],"河南") #打包输入地区及对应降水量数据            .set_series_opts(label_opts=opts.LabelOpts("{b}")) #配置系列参数,{b}为显示地区数据            .set_global_opts(                title_opts=opts.TitleOpts(title="河南省累计降雨分布--Dragon少年"), #全局参数中设置标题                visualmap_opts=opts.VisualMapOpts(max_=300,  #设置映射配置项的最大值                                                  is_piecewise=True, #设置是否为分段显示                                                  pos_top = "60%", #映射配置项距图片上部的距离                                                  pieces=[                                                        {"min": 251, "label": '特大暴雨', "color": "#800000"},  # 分段指定颜色及名称                                                        {"min": 101, "max": 250, "label": '暴雨', "color": "#FF4500"},                                                        {"min": 51, "max": 100, "label": '暴雨', "color": "#FF7F50"},                                                        {"min": 25, "max": 50, "label": '大雨', "color": "#FFFF00"},                                                        {"min": 10, "max": 25, "label": '中雨', "color": "#1E90FF"},                                                        {"min": 0.1, "max": 9.9, "label": '小雨', "color": "#87CEFA"}])        ))        tl.add(map_shape1, "{}h".format(h)) #将不同日期的数据加入到timeline中    return tltimeline_map(data1).render("rainfalltoall_1.html")

到此,相信大家对“Python怎么实现爬取天气数据并可视化分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python怎么实现爬取天气数据并可视化分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么实现爬取天气数据并可视化分析

本篇内容主要讲解“Python怎么实现爬取天气数据并可视化分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现爬取天气数据并可视化分析”吧!核心功能设计总体来说,我们需要先对中
2023-06-29

Python爬取天气数据及可视化分析的方法是什么

这篇文章主要讲解了“Python爬取天气数据及可视化分析的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python爬取天气数据及可视化分析的方法是什么”吧!1、数据获取请求网站链
2023-07-06

python天气数据爬取与分析的方法是什么

Python天气数据爬取与分析的方法主要包括以下几个步骤:1. 确定数据来源:选择一个合适的天气数据源,可以通过网站API获取天气数据,如中国气象数据网、气象数据云等。2. 爬取天气数据:使用Python的网络爬虫库,如BeautifulS
2023-10-12

Python中如何爬取京东商品数据并实现数据可视化

这篇文章将为大家详细讲解有关Python中如何爬取京东商品数据并实现数据可视化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、开发工具Python版本:3.6.4相关模块:DecryptLogin模块;
2023-06-15

Python疫情数据可视化分析怎么实现

这篇文章主要讲解了“Python疫情数据可视化分析怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python疫情数据可视化分析怎么实现”吧!前言本项目主要通过python的matpl
2023-07-02

Python怎么爬取当网书籍数据并数据可视化展示

Python怎么爬取当网书籍数据并数据可视化展示,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、开发环境Python 3.8Pycharm 2021.2 专业
2023-06-22

Python怎么爬取股票交易数据并可视化展示

本篇内容介绍了“Python怎么爬取股票交易数据并可视化展示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发环境解释器版本: python
2023-06-21

Python中怎么实现数据可视化

这期内容当中小编将会给大家带来有关Python中怎么实现数据可视化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.成品图这个是监控服务器网速的***成果,显示的是下载与上传的网速,单位为M。爬虫的原理都
2023-06-17

Python怎么实现交通数据可视化

这篇文章主要讲解了“Python怎么实现交通数据可视化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现交通数据可视化”吧!1、TransBigData简介TransBigD
2023-07-06

怎么用Python echarts实现数据可视化

本篇内容主要讲解“怎么用Python echarts实现数据可视化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python echarts实现数据可视化”吧!1.概述pyecharts
2023-06-29

python实现股票历史数据可视化分析案例

目录1 数据预处理1.1 股票历史数据csv文件读取1.2 关键数据——在csv文件中选择性提取“列”1.3 数据类型转换1.4 数据按列提取并累加性存入列表2 pyecharts实现数据可视化2.1 导入库2.2 初始化画布2.3 根据需
2022-06-03

如何使用Python实现股票数据分析的可视化

这篇文章主要为大家展示了“如何使用Python实现股票数据分析的可视化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Python实现股票数据分析的可视化”这篇文章吧。一、简介我们知道在购
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录