更多课程 选择中心

Python培训
美国上市教育机构

400-111-8989

Python培训

4行Python代码获取所在城市天气预报

  • 发布:Python培训
  • 来源:练习题库
  • 时间:2017-08-17 14:56

使用Python获取天气预报,想想是件很简单的事情。无非是发送一个HTTP请求,再解析请求返回的结果。当你真的使用Python程序去获取天气预报以后,会发现,有不少坑在等着你。这里简单记录一下我遇到的坑,供大家参考。

如何获取

使用Python获取天气有两种不同的方法,一种是像平时爬虫一样,获取天气预报网站的HTML页面,再使用XPath或BeautifulSoup解析HTML页面的内容。这是比较传统的爬虫方式。此外,还有另外一种比较合适的方法——通过天气预报网站提供的API。通过API,直接获取结构化的数据,省去了解析HTML的烦恼。

使用API

搜索"天气预报 API"这两个关键字,会有很多相关的内容,例如,这个

https://wwwzhihu.com/question/20575288

答案下就列出了不少提供API访问天气预报的网站。

然而,大部分都已经不可用了。部分可用的需要收费或者需要注册,都比较麻烦。有没有比较省事的方案呢?找来找去,我找到了中国天气网的API。无需注册直接可用,返回json格式的数据,无需使用BeautifulSoup或XPath解析,非常的方便。赞!

例如,可以直接访问下面的地址,在浏览器中查看中国天气网返回的json数据:

http://www.weather.com.cn/data/sk/101020100.html

有了API处理起来就很简单了,直接使用Python世界最知名的requests访问API即可。

安装requests:

pip install requests

检查安装是否成功:

python -c "import requests"

使用ipython测试:

In [1]: import requestsIn [2]: r = requests.get('http://www.weather.com.cn/data/sk/101020100.html')In [3]: r.status_codeOut[3]: 200In [4]: r.contentOut[4]: '{"weatherinfo":{"city":"\xe4\xb8\x8a\xe6\xb5\xb7","cityid":"101020100","temp":"15","WD":"\xe4\xb8\x9c\xe9\xa3\x8e","WS":"1\xe7\xba\xa7","SD":"50%","WSE":"1","time":"17:08","isRadar":"1","Radar":"JC_RADAR_AZ9210_JB","njd":"\xe6\x9a\x82\xe6\x97\xa0\xe5\xae\x9e\xe5\x86\xb5","qy":"1020","rain":"0"}}'In [5]: r.json()Out[5]: {u'weatherinfo': {u'Radar': u'JC_RADAR_AZ9210_JB', u'SD': u'50%', u'WD': u'\xe4\xb8\x9c\xe9\xa3\x8e', u'WS': u'1\xe7\xba\xa7', u'WSE': u'1', u'city': u'\xe4\xb8\x8a\xe6\xb5\xb7', u'cityid': u'101020100', u'isRadar': u'1', u'njd': u'\xe6\x9a\x82\xe6\x97\xa0\xe5\xae\x9e\xe5\x86\xb5', u'qy': u'1020', u'rain': u'0', u'temp': u'15', u'time': u'17:08'}}

requests库包含一个名为json的方法,当请求的地址返回的是json格式的数据时,直接使用该方法访问即可,无需使用标准库的json库。

解决乱码

如果大家刚才在浏览器中打开了我给的地址,会发现,输出结果是乱码的。如下所示:


我们可以在ipython中,查看数据编码:

In [6]: r.encodingOut[6]: 'ISO-8859-1'

我们知道,乱码是因为解码的字符集与编码的字符集不一样,所以才会有乱码。那么,我们怎么知道数据的编码字符集呢?这个时候就靠猜了。众所周知,utf-8因为各种优点(如果大家感兴趣,我可以写一篇字符集编码的文章),是使用最广泛的字符集编码,因此,我们可以尝试使用utf-8进行解码。如下所示:

In [7]: r.json()['weatherinfo']['city']Out[7]: u'\xe4\xb8\x8a\xe6\xb5\xb7'In [8]: '\xe4\xb8\x8a\xe6\xb5\xb7'.decode('utf-8')Out[8]: u'\u4e0a\u6d77'In [9]: print '\xe4\xb8\x8a\xe6\xb5\xb7'.decode('utf-8')上海

可以看到,使用utf-8解码以后,可以正确的显示数据。也就是说,中国天气网返回给我们的数据,应该是utf-8格式的。那么,为什么会乱码呢?这可能是中国天气网的工程师水平不行,也可能是故意不想让我们使用,谁知道呢。

我们已经知道了正确的编码,接下来,只要将相应的数据,使用utf-8格式解码即可。requests库本身提供了这样的功能,如下所示:

In [10]: r.encoding = 'utf-8'In [11]: print r.json()['weatherinfo']['city']上海

获取不同城市的天气预报

前面的例子,获取的是上海的天气预报。如果想要使用中国天气网的API,获取其他城市的天气预报呢?中国天气网并没有提供相应的接口,我们只能自己想办法。

在我们测试的URL中,101020100是城市的代码,我们只需要找到其他城市的代码,将101020100替换成相应的代码即可。查找方法是,在中国天气网的首页,搜索城市的名称,地址栏中会显示相应城市的代码。如下所示:


4行Python代码获取天气预报

使用Python获取天气预报的例子中,我们的主要任务在于找到相应的API,解决字符集编码问题。当这些问题解决以后,直接使用requests库获取天气预报即可。下面是获取所在城市天气预报的4行Python代码:

In [1]: import requestsIn [2]: r = requests.get('http://www.weather.com.cn/data/sk/101020100.html')In [3]: r.encoding = 'utf-8'In [4]: print r.json()['weatherinfo']['city'], r.json()['weatherinfo']['WD'], r.json()['weatherinfo']['temp']上海 东风 15

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:写Python程序前Python的安装、配置教程
下一篇:Python如何搭建HTTP服务,Python搭建HTTP服务教程

Python编程练习三

Python正则表达式练习

Python 2的结束意味着什么

用python做一个划词翻译软件

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省