首页 / 科技 / Crossin的编程教室

北京全年天气状况分析

Crossin的编程教室 2019-04-03 13:43:57 阅 读 : 19655 点 赞 : 1451

本文来自 @范洺源 投稿,在其基础上做了点修改



最近在学爬虫和数据分析,看到天气网上有国内城市一年的天气历史数据,想以此为数据源练习一下,于是就有了这个项目。今天在此简单介绍一下实现思路和最终效果。


用到的相关库包括:

  • requests

  • bs4

  • pandas

  • matplotlib

  • seaborn

  • pyecharts


分析数据源


天气网的历史天气预报查询页面(http://lishi.tianqi.com/)上有各城市的数据。以北京为例,打开页面之后经过简单的尝试就可以发现,每个月的数据是以http://lishi.tianqi.com/{城市的拼音}/{年份+月份}.html这样的地址来展示的,于是可据此构建一个函数,函数的作用是默认返回北京市2018年1月到12月的 url:

def get_url(city='beijing'):
for time in range(201801,201813):
url = "http://lishi.tianqi.com/{}/{}.html".format(city,time)
yield url

爬取数据


有了 url 地址就可以用 requests 来抓取。这里要注意,得加上自己的 cookies,否则会返回 404 页面,应该是对方网站做了反爬。拿到返回值之后,我用 bs4 库的 select 函数提取数据。select 函数使用的是 css 选择器的语法。由于需要进行一定的数据分析,所以这里没有将数据保存到文件,而是直接使用 pandasdataframe 进行储存。

html = requests.get(url=url, headers=header, cookies=cookie)
soup = BeautifulSoup(html.content, 'html.parser')
date = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(1) > a")
max_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(2)")
min_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(3)")
weather = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(4)")
wind_direction = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(5)")
date = [x.text for x in date]
max_temp = [x.text for x in max_temp[1:]]
min_temp = [x.text for x in min_temp[1:]]
weather = [x.text for x in weather[1:]]
wind_direction = [x.text for x in wind_direction[1:]]
data = pd.DataFrame([date,max_temp,min_temp,weather,wind_direction]).T

对12个月份进行抓取后再汇总,就得到了北京2018年全年的天气数据,包括最高温度、最低温度、天气状况、风向等信息。适当加工下信息,我们用一些图表来进行可视化的展示:


平均温度的分布

seaborn.distplot(result['平均温度'])

平均温度是使用每日最高温度和最低温度取平均的值。北京平均温度在0度和20多度的日子是最多的。


按月查看温度走势

result.groupby(result['日期'].apply(lambda x:x.month)).mean().plot(kind='line')

天气状况分布

seaborn.countplot(result['天气状况'])

晴天和多云是北京一年中主要的天气。


各月降水天数统计

line = pyecharts.Line("各月降水天数统计")
line.add("降水天数", month, is_rain, is_fill=True, area_opacity=0.7, is_stack=True)
line.add("未降水天数", month, no_rain, is_fill=True, area_opacity=0.7, is_stack=True)

这里用 pyecharts 做了一个堆叠折线图。北京的降水天数不多,主要在7、8月份??梢远员认轮厍斓氖?,差别就很明显了:


风向统计

directions = ['北风', '西北风', '西风', '西南风', '南风', '东南风', '东风', '东北风']
schema = []
v = []
days = result['风向'].value_counts()
for d in directions:
schema.append((d,100))
v.append(days[d])
v = [v]
radar = pyecharts.Radar()
radar.config(schema)
radar.add("风向统计", v, is_axisline_show=True)

为了让结果更加直观,这里采用了 pyecharts 里的雷达图,并且将8个维度按真实方向的角度来排列。通常认为,北京冬季盛行西北风,夏季盛行东南风。不过从数据上来看,西南风才是北京2018年的最热门的风向。


以上就是我这个项目所做的工作,内容还是比较基础的。大家可以做进一步的扩展,比如爬取其他的城市,然后进行全国多城市的天气比较,或者结合地图进行可视化。


几个相关库的官网都很不错,供参考:

  1. requests http://cn.python-requests.org/zh_CN/latest/

  2. bs4 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

  3. pyecharts http://pyecharts.org/

  4. seaborn http://seaborn.pydata.org/

  5. pandas https://pandas.pydata.org/



文章源码及相关文件已上传,获取代码及可视化效果可在公众号(Crossin的编程教室回复关键字?天气




本文是我们编程教室新春征稿活动的一篇投稿,来自 @范洺源?同学。

我们编程教室会持续向所有人开放,如果有投稿或参与志愿者的意向,欢迎随时在公众号里给我们留言。





其他内容回复左侧关键词获?。?/span>

python?:零基础入门课程目录

新手?:初学者指南及常见问题

资源?:超过500M学习资料网盘地址

项目?:十多个进阶项目代码实例


如需了解视频课程及答疑群等更多服务,

请号内回复?码上行动

代码相关问题可以在论坛上发帖提问?

bbs.crossincode.com


推荐阅读

经验:Python转行?|?我用Python?|?如何提问?|?新手建议

干货:如何debug?|??一图学Python??|?知乎资源?|?单词表

案例:漫威API?|?流浪地球?|?爬抖音?|?查天气?|?智能防挡弹幕?|?红包提醒



欢迎加入

Crossin的编程教室

crossincode.com


请把我们分享给身边爱学习的小伙伴 :)??

?点击文末“阅读原文”,查看更多学习资源

幸运飞艇开奖官方

免责声明: 本站资料及图片来源互联网文章-|,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关-|,如用户分享不慎侵犯了您的权益,请联系我们告知,-|我们将做删除处理!