摘要:对个月份进行抓取后再汇总,就得到了北京年全年的天气数据,包括最高温度最低温度天气状况风向等信息。按月查看温度走势日期天气状况分布天气状况晴天和多云是北京一年中主要的天气。北京的降水天数不多,主要在月份。
本文来自 @范洺源 投稿,在其基础上做了点修改
最近在学爬虫和数据分析,看到 天气网 上有国内城市一年的天气历史数据,想以此为数据源练习一下,于是就有了这个项目。今天在此简单介绍一下实现思路和最终效果。
用到的相关库包括:
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 选择器 的语法。由于需要进行一定的数据分析,所以这里没有将数据保存到文件,而是直接使用 pandas 的 dataframe 进行储存。
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年的最热门的风向。
以上就是我这个项目所做的工作,内容还是比较基础的。大家可以做进一步的扩展,比如爬取其他的城市,然后进行全国多城市的天气比较,或者结合地图进行可视化。
几个相关库的官网都很不错,供参考:
requests http://cn.python-requests.org/zh_CN/latest/
bs4 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
pyecharts http://pyecharts.org/
seaborn http://seaborn.pydata.org/
pandas https://pandas.pydata.org/
文章源码及相关文件已上传,获取代码及可视化效果可在公众号( Crossin的编程教室 )回复关键字 天气
本文是我们编程教室新春征稿活动的一篇投稿,来自 @ 范洺源 同学。
我们编程教室会持续向所有人开放,如果有投稿或参与志愿者的意向,欢迎随时在公众号里给我们留言。
Python | 新手引导 | 一图学Python
开发案例:智能防挡弹幕 | 红包提醒 | 流浪地球 | 漫威
欢迎搜索及关注: Crossin的编程教室
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43523.html
摘要:在本文中,我们将通过使用一类强大的机器学习算法隐马尔科夫模型来探索如何识别不同的股市状况。隐马尔科夫模型马尔科夫模型是一个概率过程,查看当前状态来预测下一个状态。通过隐马尔科夫模型,可以深入了解不断变化的股市状况。 showImg(https://segmentfault.com/img/bVUlGu?w=913&h=515); 了解不同的股市状况,改变交易策略,对股市收益有很大的影响...
摘要:全时关店潮氪获得的一份内部资料显示,自去年月以来,全时便利店在北京关店约家截至月日,全时在北京的店铺还有家左右。这意味着该轮关店比例超过。 本博客 猫叔的博客,转载请申明出处 前言 本系列为猫叔综合整理的Java面试题系列,如有雷同不胜荣幸。 前言 本系列主要是猫叔对互联网相关产品(兼任产品经理)路上的视野扩展与信息记录,每日三篇,记录分享。 全时关店潮 36氪获得的一份内部资料显示,...
摘要:上周,在旧金山召开的人工智能国际较高级会议上,来自微软亚洲研究院的郑宇博士及其团队的论文首创性的将时空数据与深度学习结合起来,利用时空深度残差网络用于预测城市人流问题。 上周,在旧金山召开的人工智能国际较高级会议AAAI 2017上,来自微软亚洲研究院的郑宇博士及其团队的论文Deep Spatio-Temporal Residual Networks for Citywide Crowd F...
摘要:日前,简历大数据公司巧达科技被警方一锅端,高管和员工全部被带走。买卖简历,直接违法。三人累计贩卖个人简历万余份,智联招聘由此蒙受损失近日前,简历大数据公司巧达科技被警方一锅端,高管和员工全部被带走。到底发生了什么? 一 、为什么公司全员被抓? 3月14日团队被警方带走,有HR等非核心成员回家,但核心高管依然失联中。3月25日,一位巧达科技前员工告诉燃财经。 在天眼查中北京...
阅读 3076·2023-04-26 00:53
阅读 3521·2021-11-19 09:58
阅读 1693·2021-09-29 09:35
阅读 3277·2021-09-28 09:46
阅读 3850·2021-09-22 15:38
阅读 2691·2019-08-30 15:55
阅读 3005·2019-08-23 14:10
阅读 3821·2019-08-22 18:17