Python语言程序设计课程论文项目名称:天气查询姓名:黄利钦 学号:173110009班级:1708班成绩:博客链接:
摘要
此论文主要介绍了,使用相应的框架和模块,用Python来制作一个简单的天气查询应用,通过此应用,用户可以通过输入所要查询城市名来查询该城市当天或者未来五天的天气情况。同时对此应用所涉及到的一些基础知识和方法技术进行相应的扩展介绍,让初学者对Python有基础的认识。
1.引言
1.1背景
Python是一种解释性、交互式、面向对象的跨平台的语言。并且Python简单易学,是一种支持面向过程编程也支持面向对象编程的高级语言。它是开源的,且具有可扩展性、可移植性和解释性。它还具有丰富的库,能够满足我们日常工作所需,它规范的代码也增强可读性。总体而言,对于初学者来说,Python比较简便,上手也比较容易。
1.2意义
天气的变化对我们日常生活的影响非常大,如果我们能够提前了解当天或后几天的天气情况,做到心里有数,我们可以及时改变我们的计划,以减轻天气对我们的影响。而Python比较简便,制作一个天气查询也比较简单,对技术人员来说,不是一件困难的事,有了天气查询这个软件,我们就可以随时随地的查询某地某天具体的天气情况,从而方便我们的日常生活。
1.3实现的功能
此软件的功能是根据用户的需求,输入某地(只能是某市不能具体到区或镇),即刻弹出当天某地的具体天气情况(如:日期、天气、温度、风向、风级以及穿衣饮食的建议等);也可用户需求查询未来五天的天气情况,并罗列出未来五天的天气变化。
2. 系统结构。
2.1使用相关技术
2.1.1开发环境
Python3:Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Pyqt5:PyQt5 是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x。Qt库由Riverbank Computing开发,是最强大的GUI库之一。
PyQt5是由一系列Python模块组成。主要模块有:
QtCore 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用。
QtGui 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类。
QtWidgets类包含了一系列创建桌面应用的UI元素。
Request:
Request是用Python语言编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库。
Request库有七个主要的方法:requests. Request():构造一个请求,支撑一些各方法的基础方法;requests. get():获取HTML网页的主要方法,对应于HTML的get;requests. head():获取HTML网页头信息的方法,对应于HTML的head;requests. post():向HTML网页提交post请求的方法,对应于HTML的post;
requests. put():向HTML网页提交put请求的方法,对应于HTML的put;requests. patch():向HTML网页提交局部修改的请求,对应于HTML的patch;
requests. delete():向HTML网页提交删除请求,对应于HTML的delete;request库中的get()方法也是比较常用的,通常通过r=request.get(url)来构造一个向服务器请求资源的URL(URL是http协议存取资源的一个路径)对象。这个对象是request库内部生成的。此时r返回的是一个包含服务器资源的response对象。包含从服务器返回的所有的相关资源。
2.1.2 ui设计
界面采用Qt Designer来进行设计:Qt Designer是交互式可视化GUI设计工具,能够快速开发pyqt程序,它生成的UI界面是一个后缀为.ui的文件,我们可以通过pyiuc转换为.py文件,后期,如果我们还想做类似界面的软件,我们可以直接使用这个已转换的.py文件,并在此基础上进行更改,从而减轻开发人员的工作量并提高效率。图1 天气查询界面
2.1.3网络爬虫网络爬虫是一种按照一定的规则,自动地爬抓万维网信息的程序或脚本,可以自动采集所需要访问页面的内容,及时更新内容。例如,我们查询的天气具体情况,就是通过爬虫的方式来获取天气预报网站的HTML的内容,然后解析HTML界面的内容,以此获取我们需要的信息并及时更新呈现给用户。爬虫的基本流程:1.发起请求:通过HTTP库向目标站点发起请求,即发送一个Request,然后等待服务器响应。2.获取响应内容:如果服务器能正常响应,我们会得到一个Response,Response的内容便是所要获取的内容(可能是HTML、Json、二进制数据等类型)。3.解析内容:如果得到的内容可能是HTML,那么就可以使用正则表达式,网页解析库进行解析。如果得到的内容是Json,可以直接转为Json对象解析。如果得到的内容是二进制数据,就可以做保存或者进一步处理。4.保存数据:我们可以把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg,mp4 等格式的文件。拓展:使用Python来获得天气数据,方式有两种:一种是通过爬虫的方式获取天气网站的HTML页面,然后使用xpath或者bs4解析HTML页面的内容;另一种是根据天气预报网站提供的API(全称application programing interface ,即应用程序编程接口),直接获取结构化数据,省去了解析HTML页面的这一步骤。2.2相关模块介绍此应用主要有三部分组成:输入城市名称部分:用户根据自身需求,输入要查询城市的名称;查看今天部分:用户输入城市名称后,该部分只显示所要查询城市当天的天气情况;查看未来五天部分:用户输入城市名称后,该部分将会显示,所要查询城市未来五天的天气情况;2.3实现功能的原理2.3.1功能实现过程图2 功能间的关系2.3.2原理根据输入城市名从城市代码文件中提取相对于的城市代码,向目的网站发送请求并得到相应网站页面信息,根据所求对网页返回信息进行筛选。3. 实现代码3.1导入的模块:from PyQt5 import QtCore, QtGui, QtWidgets //导入PyQt5模块的QtCore, QtGui, QtWidgets成员import requests3.2查看今天:def get_data_2(self, Dialog): // 输入城市,点击查询当天的天气,就调用get_data_2的方法 citycode = city.get(self.lineEdit_2.text())//根据输入的城市查询city表,找到对应城市的代码,用这个代码加入到第三行的路径中 url = ('http://wthrcdn.etouch.cn/weather_mini?citykey=%s'% citycode) //第三行 self.textEdit.setText('\n'+str(url)) response = requests.request("GET", url) //根据路径查询城市天气数据 a = eval(response.content) //获得整个返回数据 forecast = a.get('data').get('forecast') //从返回数据中筛选出未来五天的数据 self.textEdit.setText( ' '+a.get('data').get('city')+'\n' '日期:'+forecast[0].get('date')+'\n' '天气:'+forecast[0].get('type')+'\n' '温度:'+forecast[0].get('low')+'~'+forecast[0].get('high')+'℃\n' '风向:'+forecast[0].get('fengxiang')+'\n' '风级:'+forecast[0].get('fengli')+'\n' '感冒:'+a.get('data').get('ganmao')+'\n\n') //显示未来五天天气数据3.3查看未来5天:def get_data_3(self, Dialog): // 输入城市,点击查询未来五天的天气,就调用get_data_3的方法 citycode = city.get(self.lineEdit_2.text()) //根据输入的城市查询city表,找到对应城市的代码,用这个代码加入到第三行的路径中 url = ('http://wthrcdn.etouch.cn/weather_mini?citykey=%s'% citycode)//第三行 self.textEdit.setText('\n'+str(url)) response = requests.request("GET", url) //根据路径查询城市天气数据 a = eval(response.content) //获得整个返回数据 forecast = a.get('data').get('forecast') //从返回数据中筛选出未来五天的数据 self.textEdit.setText( ' '+a.get('data').get('city')+'未来五天天气\n' +forecast[0].get('date')+'\n' ' 天气:'+forecast[0].get('type')+'\n' ' 温度:'+forecast[0].get('low')+'~'+forecast[0].get('high')+'℃\n' ' 风向:'+forecast[0].get('fengxiang')+'\n' ' 风级:'+forecast[0].get('fengli')+'\n\n' +forecast[1].get('date')+'\n' ' 天气:'+forecast[1].get('type')+'\n' ' 温度:'+forecast[1].get('low')+'~'+forecast[0].get('high')+'℃\n' ' 风向:'+forecast[1].get('fengxiang')+'\n' ' 风级:'+forecast[1].get('fengli')+'\n\n' +forecast[2].get('date')+'\n' ' 天气:'+forecast[2].get('type')+'\n' ' 温度:'+forecast[2].get('low')+'~'+forecast[0].get('high')+'℃\n' ' 风向:'+forecast[2].get('fengxiang')+'\n' ' 风级:'+forecast[2].get('fengli')+'\n\n' +forecast[3].get('d