python爬取天气预报数据,并实现数据可视化

您所在的位置:网站首页 天气形势预报分析报告 python爬取天气预报数据,并实现数据可视化

python爬取天气预报数据,并实现数据可视化

2024-07-06 17:28:45| 来源: 网络整理| 查看: 265

文章目录 一、前言二、爬取目标及结果展示三、页面分析四、完整代码五、补充六、不足(经读者反馈)

一、前言

在爬取数据时,有些数据,如图片、视频等等,爬到就是赚到;而有时候,我们爬到的可能只是一些数字,表面上,看上去没什么意义,但当我们换一种角度来看待问题的话,可能又是一个崭新的世界。于是,我今天学习了一下数据的可视化。

二、爬取目标及结果展示

由于是我第一次尝试可视化,我选了一个简单的方向----爬取天气预报 然后我就在百度上,随便搜了一下,直接准备爬取第一个。 网址链接:北京的天气

结果如下: 在这里插入图片描述

三、页面分析

在这里插入图片描述 进入页面之后,我分别看了“7天”、“8-15天”、“40天”,发现,上方链接是一直变化的。但是当我去检测页面的时候,发现了了不得的东西。 在这里插入图片描述 哎哟,我去,这不就是上方的链接变化嘛。

于是我们就可以通过手段直接拿到“详情页的传送链接”了。 在这里插入图片描述 假设这时候,我们已经拿到了“7天”和“8-15天”的链接了。 对比一下,两个页面的内容。

7天: 在这里插入图片描述 8-15天: 在这里插入图片描述 哎哟,我去,两个页面的排版居然不一样,那网页源代码也肯定不一样咯。

在这里插入图片描述 仔细看之后,发现还好,只有两个地方,稍微需要处理一下。

①:“7天”里的风向

(你可以说东风转东南风,但你不能说是东南风转东南风吧)

②:“7天”和“8-15天”的气温 你会发现它是这个样子: 在这里插入图片描述 甚至这个样子: 在这里插入图片描述 但是不用害怕,我已经解决啦,哈哈哈哈哈。

详情见代码部分,基本上每行都有注释

四、完整代码

fake_useragent库的使用教程:Python爬虫有用的库:fake_useragent,自动生成请求头

# -*- coding: UTF-8 -*- """ @Author :远方的星 @Time : 2021/2/28 10:20 @CSDN :https://blog.csdn.net/qq_44921056 @腾讯云 : https://cloud.tencent.com/developer/column/91164 """ 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='fake_useragent.json') # 获取七天和八到十五天的页面链接 def get_url(url): response = requests.get(url=url).text html = etree.HTML(response) url_7 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[2]/a/@href')[0] url_8 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[3]/a/@href')[0] return url_7, url_8 # 获取未来七天天起预报数据 def get_data_1(url): response = requests.get(url=url) response.encoding = "utf-8" # 防止乱码,进行编码 response = response.text html = etree.HTML(response) list_s = html.xpath('//*[@id="7d"]/ul/li') # 提前定义五个空列表用于存放信息 data, weather, x, y, wind_scale = [], [], [], [], [] temperature = [] # 定义一个空列表,用于处理最低气温和最高气温的合并 wind = [] # 定义一个空列表,用于存放风向 high, low = [], [] # 定义两个空列表,用于存放未处理的最高、最低气温,为绘图做铺垫 for i in range(len(list_s)): a = list_s[i].xpath('./h1/text()') # 获取日期 b = list_s[i].xpath('./p[1]/text()') # 获取天气情况 c = list_s[i].xpath('./p[2]/span/text()') # 获取最高气温 d = list_s[i].xpath('./p[2]/i/text()') # 获取最低气温 g = list_s[i].xpath('./p[3]/i/text()') # 获取风级 data.append(''.join(a)) # 集中日期 weather.append(''.join(b)) # 集中天气情况 high.append(''.join(c)) # 集中最高气温 low.append(''.join(d)) # 集中最低气温 x.append(''.join(c)) # 集中最高气温 x.append('/') # 加入一个分隔符 x.append(''.join(d)) # 集中最低气温 temperature.append(''.join(x[0:3])) # 把最高气温和最低气温合并 wind_scale.append(''.join(g)) # 集中风级 f = list_s[i].xpath('./p[3]/em/span/@title') # 获取风向 if f[0] == f[1]: # 条件语句,用于判断两个风向是否一致,进而做出一定反应 wind.append(''.join(f[0])) else: y.append(''.join(f[0])) y.append('转') y.append(''.join(f[1])) wind.append(''.join(y[0:3])) excel = pd.DataFrame() # 定义一个二维表 excel['日期'] = data excel['天气'] = weather excel['气温'] = temperature excel['风向'] = wind excel['风级'] = wind_scale excel['最高气温'] = high excel['最低气温'] = low return excel # 获取8-15天天气预报数据 def get_data_2(url): response = requests.get(url=url) response.encoding = "utf-8" # 防止乱码,进行编码 response = response.text html = etree.HTML(response) list_s = html.xpath('//*[@id="15d"]/ul/li') # 提前定义五个空列表用于存放信息 data, weather, a, wind, wind_scale = [], [], [], [], [] temperature = [] # 定义一个空列表,用于处理最低气温和最高气温的合并 high, low = [], [] # 定义两个空列表,用于存放未处理的最高、最低气温,为绘图做铺垫 for i in range(len(list_s)): data_s = list_s[i].xpath('./span/text()') # data_s[0]是日期,data_s[1]是天气,data_s[2]是最低气温,data_s[3]是风向,data_s[4]是风级 b = list_s[i].xpath('./span/em/text()') # 获得最高气温 data.append(''.join(data_s[0])) # 集中日期 weather.append(''.join(data_s[1])) # 集中天气 wind.append(''.join(data_s[3])) # 集中风向 wind_scale.append(''.join(data_s[4])) # 集中风级 high.append(''.join(b)) # 集中最高气温 low.append(''.join(data_s[2])) # 集中最低气温 a.append(''.join(b)) # 集中最高气温 a.append(''.join(data_s[2])) # 集中最低气温(这时最高气温已经在a列表里了) temperature.append(''.join(a[0:2])) # 集中最低+最高气温 excel = pd.DataFrame() # 定义一个二维表 excel['日期'] = data excel['天气'] = weather excel['气温'] = temperature excel['风向'] = wind excel['风级'] = wind_scale excel['最高气温'] = high excel['最低气温'] = low return excel # 实现数据可视化 def get_image(data, high, low): # 用来正常显示中文标签 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示负号 plt.rcParams['axes.unicode_minus'] = False # 根据数据绘制图形 fig = plt.figure(dpi=128, figsize=(10, 6)) plt.plot(data, high, c='red', alpha=0.5) plt.plot(data, low, c='blue', alpha=0.5) # 给图表中两条折线中间的部分上色 plt.fill_between(data, 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(data[::1]) # 显示图片 plt.show() def main(): url = 'http://www.weather.com.cn/weather1d/101010100.shtml' url_7, url_8 = get_url(url) data_1 = get_data_1(url_7) data_2 = get_data_2(url_8) data_s = pd.concat([data_1, data_2], axis=0) data_s['最高气温'] = data_s['最高气温'].map(lambda z: int(z.replace('℃', ''))) data_s['最低气温'] = data_s['最低气温'].map(lambda z: int(z.replace('℃', '').replace('/', ''))) # print(type(data_s)) # print(type(data_s['最高气温'])) # 有兴趣的小伙伴,可以看一下这里的类型分析嗷,这两个数据是不一样哒 data = data_s['日期'] high = data_s['最高气温'] low = data_s['最低气温'] get_image(data, high, low) if __name__ == '__main__': main() 五、补充

第一次使用可视化,代码可能出现冗余的地方,希望大佬给些指点呀。

六、不足(经读者反馈)

有小伙伴在运行代码的情况时,出现了list index out of range的错误,一开始我以为是他的问题,后来我写另外一篇文章时,调试了三四天,发现,应该是我的问题。因为这个网站晚上时,会更改一点点结构,爬取的时候,会出现一个空列表。那怎么解决呢?在气温那里使用条件语句,把列表为空的情况排除掉即可。 我今天更新的一个文章,依然用的这个网页链接,已经使用if条件语句进行排除空列表。

文章传送门

作者:远方的星 CSDN:https://blog.csdn.net/qq_44921056 腾讯云:https://cloud.tencent.com/developer/column/91164 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭