这段代码实例,见证了数万人入门编程

我的微信 Python 教程里有两个比较重要的代码实例,一个是前期的“猜数字”,这个例子演示了基本的输入输出、运算、类型、逻辑,之后的扩展又涉及到函数、数据结构、文件读写等。

另一个是“查天气”。这个例子算得上一个简单的“网络爬虫”,是你的代码从单机向网络进化的第一步,并且涉及到文件读写、类型转换、多层循环、模块等功能的综合应用。因此,当你能独立完成这样一个案例时(包括城市代码的抓取),可以说是完成了 Python 编程的“入门”。

很多同学学到这里都会遇到一些阻碍,加上接口的变动和版本的更新,我经常会收到各种提问。今天在这儿,我做一个相对完整的解说,并且附上包含不同版本、不同方式、不同接口的更新版示例代码。

回复 查天气 查看对应教程及代码

1. 请求地址

教程原版接口,获取某一城市的天气:

http://www.weather.com.cn/data/cityinfo/101010100.html

此接口需要城市代码。地址目前依然有效,但结果并不更新,只可用作代码练习,无实用价值。

浏览器中可能会是乱码,但代码中可以正常处理。

更好的替换接口

http://wthrcdn.etouch.cn/weather_mini?citykey=101010100

此接口需要城市代码,返回 JSON 格式的昨日天气及5天内的天气预报,包括气温、指数、空气质量、风力等。信息丰富且准确,推荐使用。

此接口还可以通过直接提供城市名称来查询

http://wthrcdn.etouch.cn/weather_mini?city=北京

需要注意的是,对方服务器会按照 UTF-8 编码来处理 city 参数,所以在 windows 下直接这样请求可能会失败。

2. 城市列表

上述接口中提及的城市列表,有几种获取方式:

直接下载文件

回复 查天气 可见地址

查询城市代码

https://blog.csdn.net/hello_haozi/article/details/7564223

此页面上有给出城市代码,你可以复制下来通过程序整理。

通过接口抓取

http://m.weather.com.cn/data3/city.xml

具体方法见【课程 查天气-4

抓取城市代码的难度要比查询天气本身难度更高。

3. 网络模块

urllib2

教程最初给的方法是基于 Python2 内置的 urllib2 模块,无需安装其他库。

urllib

在 Python3,urllib2 模块被替代,需使用 urllib.request 模块。

requests

这是一个外部的网络模块,需安装。之前文章有介绍过:这个男人让你的爬虫开发效率提升8倍。使用它,会让开发简便许多,少踩很多坑。即使你用原生网络模块完成了代码,也强烈建议体验下 requests

4. 中文编码

编码一向是 Python 的大坑,这个例子里也不例外。可能出问题的主要有3个地方:

city.py

由于代码中有中文,所以必须在文件第一行声明编码。又因为我们需要从控制台获取输入,所以这两者的编码必须一致,否则就查不到城市编码。

windows 上如果出现查不到编码的情况,尝试都设置成 gbk,而且建议在 IDE 里新建文件,把内容复制进去,而不是直接使用下载的 city.py。或者使用 PyCharm,按 PyCharm 快速上手指南 这里介绍的方法,全部设成 UTF-8 编码。

拿到的返回结果

返回值里的中文是 UTF-8 编码,requests 需要手动设定。另外,Python2 直接输出 dict 是不会解码的,需要对每个值单独输出。

发送的url

前面提到,有个接口可以直接将城市名作为参数。如果你是 windows,需要使用 quote 方法将字符转成 UTF-8 的 URL 编码后再发送请求。

5. 其他问题

gzip

有些接口的结果进行了 gzip 压缩,导致拿到的返回值是一段完全看不懂的乱码,需通过 gzip 解压缩。requests 不存在这个问题,urllib 的处理参见代码。

调试

开发中总会遇到各种问题,遇到问题不要抓瞎,要去调试:

1. 多加 print 输出。了解程序的运行状态和变量的值,看看和预期是否一致。

2. 注意看报错信息,出在哪一行,是什么错。

3. 一行代码做一件事。如果报错的代码行连续调用了几个函数,把它分成几行代码再运行。

4. 在出错行之前输出信息,查看此行代码使用到的变量都是什么值什么类型。

5. 开发时先不要加异常处理,否则你无法看到报错信息

以上就是“查天气”实例中需要注意的常见问题。如有其它疑问,可在文后留言,或点击“阅读原文”,进入论坛专题进行讨论。

具体的实现细节参见代码。

获取代码地址,公众号(Crossin的编程教室)回复 查天气

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2018-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老付的网络博客

AMD的规范演化

对于web项目来说,打交道的不仅仅有后台,前台页面也是少不了的,而前台的页面js也常常是我们后台程序员必须要使用的语言, 今天说下项目中的js的组织方式。

1625
来自专栏微信小程序开发

python抓取头条文章

最近做了个项目,希望把运营同学在今日头条上发的文章自动发布到公司的官方博客中去,然后可以人工筛选需要发布的文章~ 很明显,要实现这功能,就需要程序自动抓取头条号...

6757
来自专栏腾讯数据库技术

一个编译参数引发的血案

提示:公众号展示代码会自动折行,建议横屏阅读 问题描述 前几天进行测试,发现一个神奇的现象:不加任何优化的版本与加了-O2参数的版本测试结果不一致! 主要代...

1281
来自专栏码神联盟

碎片化 | 第四阶段-31-Struts2参数传出传入值-视频

如清晰度低,可转PC网页观看高清版本: http://v.qq.com/x/page/g0566v55efc.html Hello Struts2 1:St...

3596
来自专栏黑白安全

黑客怎样用谷歌查找信息?

黑客去入侵一个网站的时候往往需要搜集它的很多信息,这其中包括利用网站漏洞,社工,还有就是用搜索引擎进行搜索,而常被我们利用的搜索网站——谷歌就是一个非常好的信息...

2194

使用Apache Flink进行流处理

如果在你的脑海里,“Apache Flink”和“流处理”没有很强的联系,那么你可能最近没有看新闻。Apache Flink已经席卷全球大数据领域。现在正是这样...

4692
来自专栏有趣的django

python面试

1. 先做自我介绍 2. 做Python几年了?为什么选择Python? 3. 学历?大学什么专业? 4. 除了Python以外对其他语言有没有了解? 5. 你...

3834
来自专栏Golang语言社区

nodejs php go语言了解

1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript...

54811
来自专栏PPV课数据科学社区

如何使用Python对Instagram进行数据分析?

我写此文的目的在于展示以编程的方式使用Instagram的基本方法。我的方法可用于数据分析、计算机视觉以及任何你所能想到的酷炫项目中。 Instagram是最大...

2887
来自专栏哲学驱动设计

《OEA - 实体扩展属性系统 - 设计方案说明书》

    这篇设计文档是 12 月份写来参加公司的研发峰会的,自己倒是信心满满,不过最后还是没有入围。现在想想也没啥大用,所以贴出来,期待与园友交流。     文...

3557

扫码关注云+社区

领取腾讯云代金券