14.5 项目:取得当前的天气数据

检查天气似乎相当简单:打开 Web 浏览器,点击地址栏,输入天气网站的 URL
(或搜索一个,然后点击链接),等待页面加载,跳过所有的广告等。
其实,如果有一个程序,下载今后几天的天气预报,并以纯文本打印出来,就可以跳过很多无聊的步骤。该程序利用第 11 章介绍的 requests 模块,从网站下载数据。
总的来说,该程序将执行以下操作:
•    从命令行读取请求的位置。
•    从OpenWeatherMap.org 下载JSON 天气数据。
•    将JSON 数据字符串转换成 Python 的数据结构。
•    打印今天和未来两天的天气。因此,代码需要完成以下任务:
•    连接 sys.argv 中的字符串,得到位置。
•    调用 requests.get(),下载天气数据。
•    调用 json.loads(),将 JSON 数据转换为 Python 数据结构。
•    打印天气预报。
针对这个项目,打开一个新的文件编辑器窗口,并保存为quickWeather.py。

第 1 步:从命令行参数获取位置
该程序的输入来自命令行。让quickWeather.py 看起来像这样:
#!  python3
#  quickWeather.py  -  Prints  the  weather  for  a  location  from  the  command  line. import  
json,  requests,  sys
#  Compute  location  from  command  line  arguments. if  len(sys.argv)  <  2:
print('Usage:  quickWeather.py  location') sys.exit()
location  =  '  '.join(sys.argv[1:])

#  TODO:  Download  the  JSON  data  from  OpenWeatherMap.org's  API. #  TODO:  Load  JSON  data  
into  a  Python  variable.


在Python 中,命令行参数存储在 sys.argv 列表里。#!行和 import 语句之后,程序会检查是否有多个命令行参数(回想一下,sys.argv 中至少有一个元素 
sys.argv[0],它包含了 Python 脚本的文件名)。如果该列表中只有一个元素,那么用户没有在命令行中提供位置,程序向用户提供“Usage(用法)”信息,然后结束。
命令行参数以空格分隔。命令行参数 San  Francisco,  CA  将使 sys.argv  中保存 ['quickWeather.py', 'San', 'Francisco,', 
'CA']。因此,调用 join()方法,将 sys.argv 中除第一个字符串以外的字符串连接起来。将连接的字符串存储在变量 location 中。

第 2 步:下载 JSON 数据
OpenWeatherMap.org 提供了 JSON 格式的实时天气信息。你的程序只需要下载页面 
http://api.openweathermap.org/data/2.5/forecast/daily?q=<Location>&cnt=3,其中
<Location>是想知道天气的城市。将以下代码添加到 quickWeather.py 中。
#!  python3
#  quickWeather.py  -  Prints  the  weather  for  a  location  from  the  command  line.

--snip--

#  Download  the  JSON  data  from  OpenWeatherMap.org's  API.
url  ='http://api.openweathermap.org/data/2.5/forecast/daily?q=%s&cnt=3'  %  (location) response  = 
 requests.get(url)
response.raise_for_status()

#  TODO:  Load  JSON  data  into  a  Python  variable.
我们从命令行参数中得到了 location。为了生成要访问的网址,我们利用%s 占位符,将 location 中保存的字符串插入 URL 字符串的那个位置。结果保存在 url 中,并将 url  
传入 requests.get()。requests.get()调用返回一个 Response  对象,它可以通过调用 
raise_for_status()来检查错误。如果不发生异常,下载的文本将保存在response.text 中。

第 3 步:加载 JSON 数据并打印天气
response.text  成员变量保存了一个 JSON  格式数据的大字符串。要将它转换为
Python 值,就调用 json.loads()函数。JSON 数据会像这样:
{'city':  {'coord':  {'lat':  37.7771,  'lon':  -122.42}, 'country':  'United  States  of  
America', 'id':  '5391959',
'name':  'San  Francisco', 'population':  0},


'cnt':  3,
'cod':  '200',
'list':  [{'clouds':  0,
'deg':  233,
'dt':  1402344000,
'humidity':  58,
'pressure':  1012.23,
'speed':  1.96,
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值