基于Python爬取福建省莆田市天气预报数据获取与预处理的设计与实现

您所在的位置:网站首页 海洋市天气预 基于Python爬取福建省莆田市天气预报数据获取与预处理的设计与实现

基于Python爬取福建省莆田市天气预报数据获取与预处理的设计与实现

2023-09-15 09:17| 来源: 网络整理| 查看: 265

文章目录 1 绪论1.1 概述1.2 课题背景 2 采用技术与开发工具的简介2.1 Pthon语言的产生和发展历史2.2 Python语言的特色2.3 Python的缺点2.4 HTML定义2.5 URL的定义2.6 URL组成2.7 HTML原理2.8 Python3.8.32.9 PyCharm Community Edition 3 项目需求分析3.1 系统需求分析3.2技术可行性分析3.3经济可行性3.4法律可行性 4 程序设计4.1开发环境配置4.1程序所需类的设计4.2导入到EXCEL代码4.3数据可视化模块4.4SQL存储数据 5 程序测试5.1 测试方法5.2 功能测试5.3 测试总结 6 总结参考文献

1 绪论 1.1 概述

随着科技进步,经济快速发展。在人们日常生活中天气的好坏一直扮演着重要的角色,天气也能影响人们心情,好的天气时,大家的心情会随着太阳的出现而变的更加美好,而阴雨连绵的天气中,各种沉闷的气息扑面而来,天气预报的主要内容是一个地区或城市未来一段时期内的阴晴雨雪、最高最低气温、风向和风力及特殊的灾害性天气。就中国而言,气象台准确预报寒潮、台风、暴雨等自然灾害出现的位置和强度,就可以直接为工农业生产和群众生活服务。随着生产力的发展和科学技术的进步,人类活动范围空前扩大,对大自然的影响也越来越大,因而天气预报就成为现代社会不可缺少的重要信息。 天气预报是根据气象观测资料,应用天气学、动力气象学、统计学的原理和方法,对某区域或某地点未来一定时段的天气状况做出定性或定量的预测。它是大气科学研究的一个重要目标,对人们生活有重要意义

1.2 课题背景

社会需求永远是天气预报发展的动力。我国是一个多灾害的国家, 气象灾害是自然灾害中最为频繁而又严重的灾害。干旱、洪涝、台风、暴雨、冰雹等灾害性天气危害人民生命财产和国民经济建设 。随着现代经济的高速发展, 自然灾害造成的损失呈上升趋势, 直接影响着社会和国民经济的可持续发展。据不完全统计,每年气象灾害造成的损失占自然灾害造成的经济损失总数的 70 %以上,约占国民生产总值的3 %~5 %。最大限度地降低和减轻天气灾害对人民生命财产安全和国民经济的影响, 防灾、减灾、保障生产和社会需要是气象部门的重要任务, 及时准确的气象预警预报是防灾[1]。 面对天气的变化,古人总结很多对于天气的知识例如前650年左右巴比伦人使用云的样子来预测天气。前340年左右亚里士多德在他的《天象论》中描写了不同的天气状态。中国人至少在前300年左右有进行天气预报的纪录。古代天气预报主要是依靠一定的天气现象,比如人们观察到晚霞之后往往有好天气。这样的观察积累多了形成了天气谚语。不过也有许多谚语后来被证明是不正确的。 从17世纪开始科学家开始使用科学仪器(比如气压表)来测量天气状态,并使用这些数据来做天气预报。在很长时间里人们只能使用当地的气象数据来做天气预报,因为当时人们无法快速地将数据传递到远处。在1837年电报被发明后人们才能够使用大面积的气象数据来做天气预报。 20世纪的气象学发展迅速。人类对大气过程了解也越来越明确。1970年代数字天气预测随电脑硬件发展出现并且发展迅速,今天成为天气预报最主要的方式。在1853~1856年,为争夺巴尔干半岛,沙皇俄国同英法两国爆发了克里木战争,结果是沙俄战败,正是这次战争,导致了天气预报的出现。 这是一场规模巨大的海战,1854年11月14日,当双方在欧洲的黑海展开激战时,风暴突然降临,最大风速超过每秒30米,海上掀起了万丈狂澜,让英法舰队险些全军覆没。事后,英法联军仍然心有余悸,法军作战部要求法国巴黎天文台台长勒佛里埃仔细研究这次风暴的来龙去脉。那时还没有电话,勒佛里埃只有写信给各国的天文、气象工作者,向他们收集1854年11月12~16日5天内当地的天气情报。他一共收到250封回信。勒佛里埃根据这些资料,经过认真分析、推理和判断,查明黑海风暴来自茫茫的大西洋,自西向东横扫欧洲,在出事前两天, 1854年11月12日和1854年13日,欧洲西部的西班牙和法国已先后受到它的影响。勒佛里埃望着天空飘忽不定的云层,陷入了沉思:“这次风暴从表面上看来得突然,实际上它有一个发展移动的过程。电报已经发明了,如果当时欧洲大西洋沿岸一带设有一些气象站,及时把风暴的情况电告英法舰队,不就可避免惨重的损失吗?”于是,1855年3月16日,勒佛里埃在法国科学院作报告说,假如组织气象站网,用电报迅速把观测资料集中到一个地方,分析绘制成天气图,就有可能推断出未来风暴的运行路径。勒佛里埃的独特设想,在法国乃至世界各地引起了强烈反响。人们深刻认识到,准确预测天气,不仅有利于行军作战,而且对工农业生产和日常生活都有极大的好处。由于社会上各方面的需要,在勒佛里埃的积极推动下,1856年,法国成立了世界上第一个正规的天气预报服务系统。 天气预报的诞生历史说明,气象条件可以影响局部战争或战役的胜败,而由于战争的需要,又推动和发展了气象事业。气候变化会牵涉到整个大气、海洋、大陆、冰雪和生物圈在内的庞大气候系统,气候变化的预测特别是短期气候变化的预测越来越受到关注。短期气候变化是指时间尺度从2周以上到季度以及年际的大气环流的变化。一般而言, 大气运 动的时间尺度越长, 它的空间尺度也越大[2],气候的变化对于天气的影响也是非常大的。

2 采用技术与开发工具的简介 2.1 Pthon语言的产生和发展历史

Python是一种面向对象、直译式计算机程序设计语言。其语法简捷而清晰、可读性强、便于维护, 并且具有丰富和强大的类库[3-4]。 Python的作者,Guido von Rossum,荷兰人。1989年圣诞节期间,在阿萨姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承,选中Python(根据英国广播公司的节目“蟒蛇飞行马戏”)作为程序的名字[5]。 1991年,第一个Python编译器诞生。它是用C语言实现的,并能够调用C语言的库文件。从一出生,Python已经具有了类,函数,异常处理,包含表和词典在内的核心数据类型,以及模块为基础的拓展系统。 Python语法很多来自C,但又受到ABC语言的强烈影响。来自ABC语言的一些规定直到今天还富有争议,比如强制缩进。 但这些语法规定让Python容易读。另一方面,Python聪明的选择服从一些惯例,特别是C语言的惯例,比如回归等号赋值。Guido认为,如果“常识”上确立的东西,没有必要过度纠结。 Python从一开始就特别在意可拓展性。Python可以在多个层次上拓展。从高层上,你可以直接引入. py文件。在底层,你可以引用C语言的库。Python程序员可以快速的使用Python写. py文件作为拓展模块。但当性能是考虑的重要因素时,Python程序员可以深入底层,写C程序,编译为.so文件引入到Python中使用[5]。Python就好像是使用钢构建房一样,先规定好大的框架。而程序员可以在此框架下相当自由的拓展或更 改。 最初的Python完全由Guido本人开发。Python得到Guido同事的欢迎。他们迅速的反馈使用意见,并参与到Python的改进。Guido和一些同事构成Python的核心团队。他们将自己大部分的业余时间用于hack Python。随后,Python拓 展到研究所之外。Python将许多机器层面上的细节隐藏,交给编译器处理,并凸显出逻辑层面的编程思考。Python程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节。这一特征吸引了广大的程序员。Python开始流行。 Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。Python在TIOBE排行榜中排行第八,它是Google的第三大开发语言,Dropbox的基础语言,豆瓣的服务器语言。Python的发展史可以作为一个代表,带给我许多启示。 在Python的开发过程中,社区起到了重要的作用。Guido自认为自己不是全能型的程序员,所以他只负责制订框架。如果问题太复杂,他会选择绕过去,也就是cut the corner。这些问题最终由社区中的其他人解决。社区中的人才是异常丰富的,就连创建网站,筹集基金这样与开发稍远的事情,也有人乐意于处理。如今的项目开发越来越复杂,越来越庞大,合作以及开放的心态成为项目最终成功的关键。 Python从其他语言中学到了很多,无论是已经进入历史的ABC,还是依然在使用的C和Perl,以及许多有列出的其他语言。可以说,Python的成功代表了它所有借鉴的语言的成功[6]。

2.2 Python语言的特色

简单易学:Python语言相对于其他编程语言来说,属于比较容易学习的一门编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。正是因为Python语言简单易学,所以,已经有越来越多的初学者选择Python语言作为编程的入门语言。例如,在浙江省2017年高中信息技术改革中,《算法与程序设计》课程将使用Python语言替换原有的VB语言。 语法优美:Python语言力求代码简洁、优美。在Python语言中,采用缩进来标识代码块,通过减少无用的大括号,去除语句末尾的分号等视觉杂讯,使得代码的可读性显著提高。阅读一段良好的Python程序就感觉像是在读英语一样,它使你能够专注于解决问题,而不用太纠结编程语言本身的语法。 丰富强大的库:Python语言号称自带电池(BatteryIncluded),寓意是Python语言的类库非常的全面,包含了解决各种问题的类库。无论实现什么功能,都有现成的类库可以使用。如果一个功能比较特殊,标准库没有提供相应的支持,那么,很大概率也会有相应的开源项目提供了类似的功能。合理使用Python的类库和开源项目,能够快速的实现功能,满足业务需求。 开发效率高:Python的各个优点是相辅相成的。例如,Python语言因为有了丰富强大的类库,所以,Python的开发效率能够显著提高。相对于C、C++和Java等编译语言,Python开发者的效率提高了数倍。实现相同的功能,Python代码的文件往往只有C、C++和Java代码的1/5~1/3。虽然Python语言拥有很多吸引人的特性,但是,各大互联网公司广泛使用Python语言,很大程度上是因为Python语言开发效率高这个特点。开发效率高的语言,能够更好的满足互联网快速迭代的需求,因此,Python语言在互联网公司使用非常广泛。 应用领域广泛:Python语言的另一大优点就是应用领域广泛,工程师可以使用Python做很多的事情。例如,Web开发、网络编程、自动化运维、Linux系统管理、数据分析、科学计算、人工智能、机器学习等等。Python语言介于脚本语言和系统语言之间。有不错的学习视频教程、开发工具与电子书籍。Python企业当下人才需求及怎么从零基础学习好Python,和学习什么内容。

2.3 Python的缺点

毫无疑问,Python确实有用很多的优点,每一个优点看起来都非常吸引人。但是,Python并不是没有缺点的,最主要的缺点有以下几个: Python的执行速度不够快。当然,这也不是一个很严重的问题,一般情况下,我们不会拿Python语言与C/C++这样的语言进行直接比较。在Python语言的执行速度上,一方面,网络或磁盘的延迟,会抵消掉部分Python本身消耗的时间;另一方面,因为Python特别容易和C结合起来,因此,我们可以通过分离一部分需要优化速度的应用,将其转换为编译好的扩展,并在整个系统中使用Python脚本将这部分应用连接起来,以提高程序的整体效率。 Python的GIL锁限制并发:Python的另一个大问题是,对多处理器支持不好。如果读者接触Python时间比较长,那么,一定听说过GIL这个词。GIL是指Python全局解释器锁(GlobalInterpreterLock),当Python的默认解释器要执行字节码时,都需要先申请这个锁。这意味着,如果试图通过多线程扩展应用程序,将总是被这个全局解释器锁限制。当然,我们可以使用多进程的架构来提高程序的并发,也可以选择不同的Python实现来运行我们的程序。 Python2与Python3不兼容:如果一个普通的软件或者库,不能够做到后向兼容,那么,它会被用户无情的抛弃了。在Python中,一个槽点是Python2与Python3不兼容。因为Python没有向后兼容,给所有的Python工程师带来了无数的烦恼。

2.4 HTML定义

HTML(HyperText Mark-up Language)是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。 设计HTML语言的目的是为了能把存放在一台电脑中的文本或图形与另一台电脑中的文本或图形方便地联系在一起,形成有机的整体,人们不用考虑具体信息是在当前电脑上还是在网络的其它电脑上。 我们只需使用鼠标在某一文档中点取一个图标,Internet就会马上转到与此图标相关的内容上去,而这些信息可能存放在网络的另一台电脑中。 HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。

2.5 URL的定义

统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

2.6 URL组成

URL的格式由三部分组成: (1)第一部分是协议(或称为服务方式); (2)第二部分是存有该资源的主机IP地址(有时也包括端口号); (3)第三部分是主机资源的具体地址,如目录和文件名等。 第一部分和第二部分用“😕/”符号隔开, 第二部分和第三部分用“/”符号隔开。 第一部分和第二部分是不可缺少的,第三部分有时可以省略。

2.7 HTML原理

(1)用户输入一个网址(假设是个HTML页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回HTML文件; (2)浏览器开始载入HTML的代码,发现标签内有一个标签引用外部CSS文件; 浏览器又发出CSS文件的请求,服务器返回这个CSS文件; (3)浏览器继续载入HTML中部分的代码,并且CSS文件已经拿到手了,可以开始渲染所要的页面了; (4)浏览器在代码中发现一个标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码; (5)服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码; (6)浏览器发现了一个包含一行Javascript代码的

2.8 Python3.8.3

Python是Linux上最常用的软件之一,并且Python有Python2和Python3之分,最初在Linux中主要以使用Python2为主流的,然而自Python3出现后,社会中的企业公司已迅速以使用Python2转型为使用Python3,所以使用Python3开发更加符合当前的社会需求。

2.9 PyCharm Community Edition

PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。同时支持Google App Engine,更酷的是,PyCharm支持IronPython!这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。 PyCharm的主要功能是: (1)编码协助 其提供了一个带编码补全,代码片段,支持代码折叠和分割窗口的智能、可配置的编辑器,可帮助用户更快更轻松的完成编码工作。 (2)项目代码导航 该IDE可帮助用户即时从一个文件导航至另一个,从一个方法至其申明或者用法甚至可以穿过类的层次。若用户学会使用其提供的快捷键的话甚至能更快。 (3)代码分析 用户可使用其编码语法,错误高亮,智能检测以及一键式代码快速补全建议,使得编码更优化。 (4)Python重构 有了该功能,用户便能在项目范围内轻松进行重命名,提取方法/超类,导入域/变量/常量,移动和前推/后退重构。 (5)支持Django 有了它自带的HTML, CSS 和 JavaScript编辑器 ,用户可以更快速的通过Djang框架进行Web开发。此外,其还能支持CoffeeScript, Mako 和 Jinja2。 (6)支持Google App引擎 用户可选择使用Python 2.5或者2.7运行环境,为Google APp引擎进行应用程序的开发,并执行例行程序部署工作。 (7)集成版本控制 登入,录出,视图拆分与合并–所有这些功能都能在其统一的VCS用户界面(可用于Mercurial, Subversion, Git, Perforce 和其他的 SCM)中得到。 (8)图形页面调试器 用户可以用其自带的功能全面的调试器对Python或者Django应用程序以及测试单元进行调整,该调试器带断点,步进,多画面视图,窗口以及评估表达式。 (9)集成的单元测试 用户可以在一个文件夹运行一个测试文件,单个测试类,一个方法或者所有测试项目。 (10)可自定义&可扩展 可绑定了 Textmate, NetBeans, Eclipse & Emacs 键盘主盘,以及 Vi/Vim仿真插件。

3 项目需求分析 3.1 系统需求分析

产品的构思初期,我会罗列尽可能多需求,也会收集到很多需求。但有些需求是伪需求,有些需求也不具备实现价值,每天有无数产品诞生,也有无数产品陨落,很多时候会谈到一个原因,没有把握住用户需求,吸引不了用户。对于产品的某个功能有自己的期望,但对产品定位、设计的依据等情况不了解,他们的建议也许并不是该功能的最好实现方式,也就不足以直接作为产品规划的直接依据。对于天气预报的信息,我们是希望通过对信息的处理,能够对未来的天气有所把握,对于极端天气能够尽早减少对我们生活的影响。

3.2技术可行性分析

这一程序主要使用到的工具为PyCharm工具,还有使用到的Python标准库和第三方库,这些库都是免费提供给开发者的,属于人人皆可拥有的平民产品,而爬虫程序可以爬取指定的数据,这些数据和需要数据的人形成一种利益关系,从而我们能从其中得到收益。且Python爬虫程序的开发是不需要花费巨大资金的。所以从消耗的成本和得到的利益之间的比例来看因此具有经济可行性。

3.3经济可行性

这一程序主要使用到的工具为PyCharm工具,还有使用到的Python标准库和第三方库,这些库都是免费提供给开发者的,属于人人皆可拥有的平民产品,而爬虫程序可以爬取指定的数据,这些数据和需要数据的人形成一种利益关系,从而我们能从其中得到收益。且Python爬虫程序的开发是不需要花费巨大资金的。所以从消耗的成本和得到的利益之间的比例来看因此具有经济可行性。

3.4法律可行性

本系统开发不会侵犯他人、集体或国家利益,不存在侵权等问题,不违反国家法律,爬取天气网上信息不会有侵犯他人行为,而在2017年6月1日的《网络安全法》中,针对Python网络爬虫已经规定了网络爬虫的范围即仅为网页可视范围[9],所以这一程序具有法律可行性。

4 程序设计 4.1开发环境配置

根据所需模块,通过终端窗口pip命令下载: pip install 配置scrapy模块,在终端输入pip install scrapy; 导入csv,datetime,os,re,matplotlib,numpy,pymysql,logging等模块;

4.1程序所需类的设计 import scrapy import time import re class DemoSpider(scrapy.Spider): name = 'demo' allowed_domains = ['www.weather.com.cn/weather1d/101230401.shtml'] start_urls = ['http://www.weather.com.cn/weather/101230401.shtml'] def parse(self, response): for item in response.xpath('//div[@class="con today clearfix"]/div[@class="left fl"]/div[@class="left-div"]/div[@id="7d"]//ul[@class="t clearfix"]/li'): yield{ #利用时间函数在前面加上月份,再用正则表达式去除掉日期后面(今天)、(明天)等字样 'date':time.strftime("20%y年%m月",time.localtime()) + (re.match(r'^.{0,3}',item.xpath('./h1/text()').extract_first().strip())).group(0), 'weather':item.xpath('./p/@title').extract_first().strip(), 'low_tem':item.xpath('./p[@class="tem"]/i/text()').extract_first().strip(), 'high_tem':item.xpath('./p[@class="tem"]/span/text()').extract_first(), 'wind_direction':item.xpath('./p[@class="win"]/em/span/@title').extract_first().strip(), 'wind_scale':item.xpath('./p[@class="win"]/i/text()').extract_first().strip() } import csv import datetime import os import re import matplotlib.pyplot as plt import matplotlib.pyplot as plt2 import matplotlib.pyplot as plt3 import numpy as np # useful for handling different item types with a single interface import pymysql import logging logging.getLogger('matplotlib').setLevel(logging.ERROR) filename = r'D:\数据采集与预处理\数据存储\莆田市七天天气预报.csv' plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt2.rcParams['font.sans-serif'] = ['SimHei'] plt2.rcParams['axes.unicode_minus'] = False plt3.rcParams['font.sans-serif'] = ['SimHei'] plt3.rcParams['axes.unicode_minus'] = False weas_map = {'多云': '阴/多云', '晴转多云': '阴/多云', '晴': '晴', '小雨转雨': '雨', '阴转多云': '阴/多云', '阴': '阴/多云', '小雨转中雨': '雨', '多云转雨': '阴/多云', '阴转雨': '阴/多云', '小雨转大雨': '雨', '小雨转阴': '阴/多云', '小雨到暴雨': '雨', '小雨转多云': '阴/多云', '大雨转雨': '雨', '多云转阴': '阴/多云', '小雨': '雨', '中雨': '雨', '大雨': '雨', '暴雨转大雨': '雨', '阴转小雨': '雨', '大雨转小雨':'雨','大雨转中雨':'雨','多云转小雨':'雨','中雨转小雨':'雨' } class PtWeatherPipeline: firstTime = True lastChance = 7 def __init__(self): self.connect = pymysql.connect(host='localhost', user='root', password='root', port=3306, database='pt_weather') self.cursor = self.connect.cursor() print('连接数据库成功') def process_item(self, item, spider, weather_change=True): # 将爬取的数据存入MySQL数据库中 # self.cursor.execute("ALTER TABLE weather_ ADD UNIQUE(date)") if item['high_tem'] is None: item['high_tem'] = item["low_tem"] insert_sql = "replace into weather_(date,weather,low_tem,high_tem,wind_direction,wind_scale) VALUES(%s,%s,%s," \ "%s,%s,%s) " self.cursor.execute(insert_sql, ( item['date'], item['weather'], item['low_tem'], item['high_tem'], item['wind_direction'], item['wind_scale'])) self.connect.commit() # 将爬取的数据写入csv表格中 data = list() # 判断莆田市七天天气预报表格是否存在,若存在且为此次运行第一次打开则删除 if os.path.exists(filename): if self.firstTime: os.remove(filename) else: with open(filename, 'r', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: data.append(row) self.firstTime = False with open(filename, 'w', newline='') as csvfile: fieldnames = ['日期', '气象', '最低温度', '最高温度', '风向', "风级"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect='excel') writer.writeheader() data.append({'日期': item['date'], '气象': item['weather'], '最低温度': item['low_tem'], '最高温度': item['high_tem'], '风向': item['wind_direction'], "风级": item['wind_scale']}) for row in data: writer.writerow(row) self.lastChance -= 1 if self.lastChance == 0: with open(filename) as f: # 打开文件文件 reader = csv.reader(f) # 读取并将内容储存在列表reader中 header_row = next(reader) # next()函数获取第一行,即文件头 # 提取气温、日期数据存储在列表中 tem1 = [] tem2 = [] dates = [] yin = 0 qing = 0 yu = 0 wuchixu = 0 dong = 0 xi = 0 nan = 0 bei = 0 dongnan = 0 xinan =0 dongbei = 0 xibei = 0 for row in reader: # 遍历reader列表 row[1] = weas_map[row[1]] #统计气象频率 if row[1] == '阴/多云': yin += 1 elif row[1] == '晴': qing += 1 elif row[1] == '雨': yu += 1 #统计风向频率 if row[4] == '无持续风向': wuchixu +=1 elif row[4] == '东风': dong +=1 elif row[4] == '南风': nan +=1 elif row[4] == '西风': xi +=1 elif row[4] == '北风': bei +=1 elif row[4] == '东北风': dongbei +=1 elif row[4] == '西北风': xibei +=1 elif row[4] == '东南风': dongnan +=1 elif row[4] == '西南风': xinan +=1 low_tem = int((re.match(r'^.{0,2}', row[2])).group(0)) high_tem = int((re.match(r'^.{0,2}', row[3])).group(0)) tem1.append(low_tem) tem2.append(high_tem) y1 = np.array(tem1) y2 = np.array(tem2) current_date = datetime.datetime.strptime(row[0], '%Y年%m月%d日') dates.append(current_date) x = np.array(dates) # 将爬取的温度数据绘制成折现图 fig = plt.figure(figsize=(12, 6)) # 添加绘图窗口,可绘制多条曲线 for a, b in zip(x, y1): plt.text(a, b + 0.05, b, ha='center', va='bottom', fontsize=18, color='blue') for c, d in zip(x, y2): plt.text(c, d + 0.05, d, ha='center', va='bottom', fontsize=18, color='orange') plt.title('莆田市温度变化折线图') plt.xlabel('日期') fig.autofmt_xdate() # 调用fig.autofmt_xdate()绘制斜的日期标签,以防日期彼此重叠 plt.ylabel('温度 单位(°C)') # plt.legend(prop =my_font) plt.plot(x, y1, label='最低温') # 传入x和y,通过plot绘制出折线图 plt.plot(x, y2, label='最高温') plt.legend() plt.grid() # 保存图片到本地 plt.savefig(r'D:\数据采集与预处理\数据存储\莆田市温度变化折线图.png') plt.show() # 将爬取的气象数据绘制成饼图 plt2.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆 label = ['晴', '雨', '阴/多云'] # 定义饼图的标签,标签是列表 explode = [0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # plt2.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图 values = [yin, qing, yu] plt2.pie(values, explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图 plt2.title('莆田市七天气温占比') # 绘制标题 plt2.legend() #显示图例 plt2.savefig(r'D:\数据采集与预处理\数据存储\莆田市七天气温占比.png') # 保存图片 plt2.legend() plt2.show() # 将爬取的风向数据绘制成饼图 plt3.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆 label = ['东风', '西风', '南风','北风','无持续风向','东南风','西南风','东北风','西北风'] # 定义饼图的标签,标签是列表 explode = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # plt2.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图 values = [dong, xi, nan, bei, wuchixu, dongnan, xinan, dongbei, xibei] plt3.pie(values, explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图 plt3.title('莆田市七天风向占比') # 绘制标题 plt3.legend() # 显示图例 plt3.savefig(r'D:\数据采集与预处理\数据存储\莆田市七天风向占比.png') # 保存图片 plt3.show() def close_spider(self, spider): self.cursor.close() self.connect.close() 4.2导入到EXCEL代码

excel截图展示

data = list() # 判断莆田市七天天气预报表格是否存在,若存在且为此次运行第一次打开则删除 if os.path.exists(filename): if self.firstTime: os.remove(filename) else: with open(filename, 'r', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: data.append(row) self.firstTime = False with open(filename, 'w', newline='') as csvfile: fieldnames = ['日期', '气象', '最低温度', '最高温度', '风向', "风级"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect='excel') writer.writeheader() data.append({'日期': item['date'], '气象': item['weather'], '最低温度': item['low_tem'], '最高温度': item['high_tem'], '风向': item['wind_direction'], "风级": item['wind_scale']}) for row in data: writer.writerow(row) 4.3数据可视化模块 self.lastChance -= 1 if self.lastChance == 0: with open(filename) as f: # 打开文件文件 reader = csv.reader(f) # 读取并将内容储存在列表reader中 header_row = next(reader) # next()函数获取第一行,即文件头 # 提取气温、日期数据存储在列表中 tem1 = [] tem2 = [] dates = [] yin = 0 qing = 0 yu = 0 wuchixu = 0 dong = 0 xi = 0 nan = 0 bei = 0 dongnan = 0 xinan =0 dongbei = 0 xibei = 0 for row in reader: # 遍历reader列表 row[1] = weas_map[row[1]] #统计气象频率 if row[1] == '阴/多云': yin += 1 elif row[1] == '晴': qing += 1 elif row[1] == '雨': yu += 1 #统计风向频率 if row[4] == '无持续风向': wuchixu +=1 elif row[4] == '东风': dong +=1 elif row[4] == '南风': nan +=1 elif row[4] == '西风': xi +=1 elif row[4] == '北风': bei +=1 elif row[4] == '东北风': dongbei +=1 elif row[4] == '西北风': xibei +=1 elif row[4] == '东南风': dongnan +=1 elif row[4] == '西南风': xinan +=1 low_tem = int((re.match(r'^.{0,2}', row[2])).group(0)) high_tem = int((re.match(r'^.{0,2}', row[3])).group(0)) tem1.append(low_tem) tem2.append(high_tem) y1 = np.array(tem1) y2 = np.array(tem2) current_date = datetime.datetime.strptime(row[0], '%Y年%m月%d日') dates.append(current_date) x = np.array(dates) ![使用matplotlib显示折线图](https://img-blog.csdnimg.cn/20210626153827220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdHRsZWZsb3dlcjk=,size_16,color_FFFFFF,t_70) # 将爬取的温度数据绘制成折线图 fig = plt.figure(figsize=(12, 6)) # 添加绘图窗口,可绘制多条曲线 for a, b in zip(x, y1): plt.text(a, b + 0.05, b, ha='center', va='bottom', fontsize=18, color='blue') for c, d in zip(x, y2): plt.text(c, d + 0.05, d, ha='center', va='bottom', fontsize=18, color='orange') plt.title('莆田市温度变化折线图') plt.xlabel('日期') fig.autofmt_xdate() # 调用fig.autofmt_xdate()绘制斜的日期标签,以防日期彼此重叠 plt.ylabel('温度 单位(°C)') # plt.legend(prop =my_font) plt.plot(x, y1, label='最低温') # 传入x和y,通过plot绘制出折线图 plt.plot(x, y2, label='最高温') plt.legend() plt.grid() # 保存图片到本地 plt.savefig(r'D:\数据采集与预处理\数据存储\莆田市温度变化折线图.png') plt.show() 输出莆田市未来7天气温占比图:

使用matplotlib显示圆饼图

# 将爬取的气象数据绘制成饼图 plt2.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆 label = ['晴', '雨', '阴/多云'] # 定义饼图的标签,标签是列表 explode = [0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # plt2.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图 values = [yin, qing, yu] plt2.pie(values, explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图 plt2.title('莆田市七天气温占比') # 绘制标题 plt2.legend() #显示图例 plt2.savefig(r'D:\数据采集与预处理\数据存储\莆田市七天气温占比.png') # 保存图片 plt2.legend() plt2.show()

使用matplotlib显示圆饼图

# 将爬取的风向数据绘制成饼图 plt3.figure(figsize=(6, 6)) # 将画布设定为正方形,则绘制的饼图是正圆 label = ['东风', '西风', '南风','北风','无持续风向','东南风','西南风','东北风','西北风'] # 定义饼图的标签,标签是列表 explode = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # plt2.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图 values = [dong, xi, nan, bei, wuchixu, dongnan, xinan, dongbei, xibei] plt3.pie(values, explode=explode, labels=label, autopct='%1.1f%%') # 绘制饼图 plt3.title('莆田市七天风向占比') # 绘制标题 plt3.legend() # 显示图例 plt3.savefig(r'D:\数据采集与预处理\数据存储\莆田市七天风向占比.png') # 保存图片 plt3.show() 4.4SQL存储数据

 SQL内容显示图

# 将爬取的数据存入MySQL数据库中 def __init__(self): self.connect = pymysql.connect(host='localhost', user='root', password='root', port=3306, database='pt_weather') self.cursor = self.connect.cursor() print('连接数据库成功') def process_item(self, item, spider, weather_change=True): # self.cursor.execute("ALTER TABLE weather_ ADD UNIQUE(date)") if item['high_tem'] is None: item['high_tem'] = item["low_tem"] insert_sql = "replace into weather_(date,weather,low_tem,high_tem,wind_direction,wind_scale) VALUES(%s,%s,%s," \ "%s,%s,%s) " self.cursor.execute(insert_sql, ( item['date'], item['weather'], item['low_tem'], item['high_tem'], item['wind_direction'], item['wind_scale'])) self.connect.commit() 5 程序测试 5.1 测试方法

程序测试是非常重要。测试策略之所以重要,就在于它是一个非常宏观的,对后面测试执行具有明确指导作用的方法论。,在对需求理解的基础上,要能够想到测试的重点在哪里,难点在哪里,测试要具体执行到什么程度,测试需要借助于什么工具或者说否需要自研工具,测试对外部环境的依赖有哪些,如何解决这些依赖,测试中有哪些风险需要提前识别以及如何去应对这些风险。在测试完成后,如何对缺陷进行分析,如何对该产品做产品质量评估。在测试人员资源分配上如何更合理,测试进度如何控制等,所有这些高层和宏观的方方面面都想清楚了,你会发现,测试不仅仅是说深钻代码,或者机械地去使用人肉方法去寻找Bug。 在信息化时代,计算机或则说电脑被广泛应用于人们的生活和工作中,给人们生活和社会生产带来了极大便利。软件是计算机的重要组成部分,软件的质量高低将直接影响人们的生活效率和工作效率。计算机软件测试技术是一种具有前瞻性的计算机使用方法,能够从根本上降低计算机软件的故障频率。因此必须重视计算机软件测试工作,科学应用测试方法加强对计算机软件的测试,保证测试的可行性和可执行性,进而避免软件在运行过程中出现各种故障问题。

5.2 功能测试

主要是测试各个功能是否能够正确的实现,包括各种功能模块是否能够正确初始化,是否能够正确使用,各种信息能否正确输出,程序是否还存在Bug。在完成编码的工作以后,根据以上的方法和步骤进行如下的测试: 界面测试:测试APP中链接的连接情况,判断其是否能够正确连接。 功能测试:对系统的功能模块逐一进行测试,进行各种数据的输入输出,记录错误情况并进行分析。 需求测试:根据需求分析的内容,相应的进行各模块的测试,观察结果是否符合当初的设计要求。 通过对软件各个模块系统和充分的测试,系统中存在的问题和不足都一一的显示了出来。根据测试的情况和错误的信息,及时的对程序进行了相应的修改和优化,能够改正许多Bug,提高系统的性能。

5.3 测试总结

经过测试,各个功能的操作都比较方便,能够进行正常的数据读取操作。但是,在操作指令比较多的情况下需要耗费较多的时间并且可能会出现程序崩溃,经过合理测试后进行了代码优化。在这个方面还可以做一些提升。该系统的优点是,结构较清晰,层次分明,效率较高,能够满足对天气的基本需求。各个模块中的功能都能够正确的运行。不足的方面是某些功能还不够完善,有待提升。

6 总结

在开发对天气爬取及实现可视化的过程中我们学到了很多经验,基于之前的技术实际充分地利用了所学的理论知识,在实践和理论学习两方面增长了见识和知识。由于我们对PYTHNON相关的知识还不够多,因此我们在做项目的过程中,我们时常一边做一边在网上查阅资料,一个看似很简单的模块,需要很多知识来补充,经过这次实验学习,总之我们学到了很多,知道了很多课程以内没有学到的知识和巩固已经学习到的知识。 在一个小组内每个成员在这次的实验中都能各尽其能,充分发挥每个组员的优势来完成这次实验报告。而且我们能得到充分的锻炼,来训练我们动手能力和协调能力。总而言之我们小组的能力得到了提升,尤其是对很多功能的实现、很多操作的逻辑上,我们觉得自己取得了很大进步。

参考文献

[1]毕宝贵,朱彤,王友恒,牛若芸.近30年中国天气预报业务进展[J].国家气象中心,2004,30(12):4-5. [2] 陶诗言,赵思雄,周晓平.天气学和天气预报的研究进展[J].应用气象报,2003,27(4):459-460 [3] 齐鹏,李隐峰,宋玉伟. 基于Python的Web数据采集技术[J].《电子科技》,2012年,25(11):118-119. [4] 董付国. Python程序设计基础(第2版)[M].北京:清华大学出版社,2018. [5] 董付国. Python数据分析、挖掘与可视化[M].北京:人民邮电出版社,2020. [6] 安俊秀,唐聃,靳宇倡等. Python大数据处理与分析 [M].北京:人民邮电出版社,2021. [7] 梁勇.Python语言程序设计[M].北京:机械工业出版社,2015. [8] 赵俊杰,李思霖,孙博瑞,李梦浩. 浅谈大数据环境下基于Python的网络爬虫技术[J].中国新通信,2020,22(04):1-5. [9] 黄赫,孙静,张思源. 基于Python语言编程的计算机教学探讨[J].数字通信世界,2019,7:1-10. [10] Wes McKinney. 利用Python进行数据分析[M].北京:机械工业出版社,2018.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3