Python实战!四行Python代码就能知道你那的天气,你敢信吗?
今天给大家带来的Python实战项目是四行Python代码获取所在城市的天气预报,我们隐隐听到唏嘘声,不信四行Python代码可以获取是吗?那我们一起来看看:
使用Python获取天气预报,想想是件很简单的事情。无非是发送一个HTTP请求,再解析请求返回的结果。当你真的使用Python程序去获取天气预报以后,会发现,有不少坑在等着你。这里简单记录一下我遇到的坑,供大家参考。
如何获取
使用Python获取天气有两种不同的方法,一种是像平时爬虫一样,获取天气预报网站的HTML页面,再使用XPath或BeautifulSoup解析HTML页面的内容。这是比较传统的爬虫方式。此外,还有另外一种比较合适的方法——通过天气预报网站提供的API。通过API,直接获取结构化的数据,省去了解析HTML的烦恼。
使用API
搜索”天气预报 API”这两个关键字,会有很多相关的内容,例如,这个
https:/
python -c "import requests"
/wwwzhihu.com/question/20575288
答案下就列出了不少提供API访问天气预报的网站。
然而,大部分都已经不可用了。部分可用的需要收费或者需要注册,都比较麻烦。有没有比较省事的方案呢?找来找去,我找到了中国天气网的API。无需注册直接可用,返回json格式的数据,无需使用BeautifulSoup或XPath解析,非常的方便。赞!
例如,可以直接访问下面的地址,在浏览器中查看中国天气网返回的json数据:
有了API处理起来就很简单了,直接使用Python世界最知名的requests访问API即可。
安装requests:
pip install requests
检查安装是否成功:
python -c “import requests”
使用ipython测试:
In [1]: import requests In [2]: r = requests.get('http://www.weather.com.cn/data/sk/101020100.html') In [3]: r.status_code Out[3]: 200 In [4]: r.content Out[4]: '{"weatherinfo":{"city":"ä¸æµ·","cityid":"101020100","temp":"15","WD":"ä¸é£","WS":"1级","SD":"50%","WSE":"1","time":"17:08","isRadar":"1","Radar":"JC_RADAR_AZ9210_JB","njd":"ææ å®åµ","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'ä¸é£', u'WS': u'1级', u'WSE': u'1', u'city': u'ä¸æµ·', u'cityid': u'101020100', u'isRadar': u'1', u'njd': u'ææ å®åµ', 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.encoding Out[6]: 'ISO-8859-1'
我们知道,乱码是因为解码的字符集与编码的字符集不一样,所以才会有乱码。那么,我们怎么知道数据的编码字符集呢?这个时候就靠猜了。众所周知,utf-8因为各种优点(如果大家感兴趣,我可以写一篇字符集编码的文章),是使用最广泛的字符集编码,因此,我们可以尝试使用utf-8进行解码。如下所示:
In [7]: r.json()['weatherinfo']['city'] Out[7]: u'ä¸æµ·' In [8]: 'ä¸æµ·'.decode('utf-8') Out[8]: u'上海' In [9]: print 'ä¸æµ·'.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 requests In [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
感谢您的阅读,以上就是我们用四行代码获取的上海的天气预报,你现在相信了吗?还不赶紧套用一下,看看你那的天气怎么样!
原文地址:https://www.cnblogs.com/woshijiuke/p/12171887.html
- 数据库中间件 MyCAT源码分析:【单库单表】插入
- 数据库中间件 MyCAT 源码分析 —— 调试环境搭建
- 分布式事务 TCC-Transaction 源码解析 —— 事务存储器
- 注册中心 Eureka 源码解析 —— 调试环境搭建
- 一样的代码、不一样的写法,JavaScript必知的简写技巧|附源代码
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- 数据库中间件 MyCAT源码分析——跨库两表Join
- iOS一种动态栅格布局方案
- 消息队列中间件 RocketMQ 源码分析 —— Message 存储
- 数据库中间件 MyCAT 源码解析 —— 分片结果合并(一)
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(一)之分库分表配置
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析
- ExtJs+WCF+LINQ实现分页Grid
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【LeetCode每日一题】25. Reverse Nodes in k-Group
- upload-labs第一关
- upload-labs第2~8关
- dotnet OpenXML 文本 ParagraphProperties 的属性作用
- 相信坚持的力量!Elastic 日报 1000期+ 了......
- dotnet OpenXML 文本 EndParagraphRunProperties 的作用
- dotnet OpenXML 文本字体的选择规则
- 获取手机nfc的MW version 和 FW version 记录
- Sublime编辑器配置Python环境
- dotnet OpenXML 从文档生成创建文档的代码的库
- 【LeetCode每日一题】24. Swap Nodes in Pairs
- 【LeetCode每日一题】26. Remove Duplicates from Sorted Array
- K8S 生态周报| NGINX Ingress Controller又添新特性
- 网络安全实验室平台(脚本关)
- shell 多线程及线程数控制实现