Python学习第八课(欲穷千里目,更上一层楼。)
已有的成果,是进步的基础。
上一节中,我们已经学会了:
- 如何使用简单的语句爬取网站的信息
- 如何根据网站的特性制作一个自动化脚本
- 结合脚本和爬取语句形成完整的程序
- 为完整的程序制作界面
这一节中,我们尝试实现更加复杂的功能。
这次的案例,我们把目光指向中国气象局的天气预报网:https://weather.cma.cn/
使用我们上一节中学习到的知识点,来制作一个可实现自动化查询指定城市天气的爬虫。
这一回,网站分析是第一步
首先,我们打开网站
可以看到,首页有天气的展示,点击一下天气,发现跳转到下面这个页面。
在这个页面里,我们发现可以选择国内外、城市等信息。
开启审查模式,选择网络,我们找一下数在哪里传递。
我们来以此点击国内,选择省,会发现右侧窗口里调用了两个页面。
第一个是:https://weather.cma.cn/api/dict/province
由于我们选择的是内蒙古,所以第二个是:https://weather.cma.cn/api/dict/province/ANM
仔细看下:
在返回的数据包中,每个数据用逗号**“,”或者竖杠“|”**隔开。
内蒙古正好与ANM对应。
我们可以由此分析,返回的数据中:
用逗号隔开的两个数据是一组,格式是:地区编号,地区名称
每一组数据,用竖杠隔开,格式是:地区编号1,地区名称1|地区编号2,地区名称2
在另外个数据接口返回的数据中,我们可以看到:
可以看到,是与上一段数据相同格式的数据,只是编号变成了数字格式。
记住现在的成果,接下来我们随便选择一个城市,尝试一下网站是如何定位天气数据的。
我们选择呼和浩特后,在众多返回的内容中,可以一一查看,可以定位到这个接口
通过复制,可以看到这个地址是:https://weather.cma.cn/api/now/53463
结合刚才的信息,我们可以确认,这个地址是https://weather.cma.cn/api/now/+城市编码
好了,总结一下现在的信息:
- 获取国内直辖市、省、自治区列表的接口是:https://weather.cma.cn/api/dict/province
- 获取某省辖下的城市列表的接口是:https://weather.cma.cn/api/dict/province + 省市编码
- 获取某城市天气信息的接口是:https://weather.cma.cn/api/now/+城市编码
综合信息,这一次的自动化脚本不简单
根据现有的情况,我们的程序想实现抓取某个城市天气的步骤也就呈现出来了:
首先,要获取省市列表和编号
然后,要根据选择的省市,获取城市列表和编号
最后,根据编号,获取天气信息
理论成立,但是真的可以这么简单吗?
因为根据上图的数据块来看,返回的城市列表和编号应该是一整段,那我们根据上一节中学到的内容,尝试验证一下返回的数据是什么格式:
#encoding: utf-8
from urllib import request
from urllib import parse
import json
def getdata(Request_URL):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
}
req = request.Request(url = Request_URL, headers = header)
res = request.urlopen(req)
str_json = res.read().decode('utf-8')
myjson = json.loads(str_json)
return(myjson['data'])
if __name__ == "__main__":
Request_URL_China = 'https://weather.cma.cn/api/dict/province'
answer = getdata(Request_URL_China)
print(type(answer))
根据刚才收集到的信息,我们不难编写这样一个初始的爬虫,让爬虫模块将读取到的信息返回给主程序,然后把读出来的信息使用**type()**函数,查看一下显示数据的类型。
果然,是一整段的字符串。
找到自动化脚本的基础,开始实现自动化脚本
由于返回的天气信息我们能够看出是一个可分段读取的数据包,所以基于现在的信息,我们可以梳理要实现的功能:
- 第一,需要一个爬虫来获得城市列表和编号,刚才我们已经实现了,这个模块要实现复用,因为在获取省市列表和城市列表的时候要使用两次。
- 第二,需要一个模块将字符串分隔成城市与编号一一对应,这个模块要在两次读取列表后将字符串分解并存储。
- 第三,需要根据最终选择的城市,抓取天气信息
可以确定,第一步和第二步,是自动化脚本的基础。
选用正确的数据结构,为后期打开便捷之路
因为已经实现了爬取列表和编号的爬虫,所以第一步已经实现,既然确定了整个流程,我们开始第二步。
分析一下读取回来的结果