Python学习,第八课(对网站的深入分析,制作灵活的爬虫)

已有的成果,是进步的基础。

上一节中,我们已经学会了:

  1. 如何使用简单的语句爬取网站的信息
  2. 如何根据网站的特性制作一个自动化脚本
  3. 结合脚本和爬取语句形成完整的程序
  4. 为完整的程序制作界面

这一节中,我们尝试实现更加复杂的功能。
这次的案例,我们把目光指向中国气象局的天气预报网: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/+城市编码

好了,总结一下现在的信息:

  1. 获取国内直辖市、省、自治区列表的接口是:https://weather.cma.cn/api/dict/province
  2. 获取某省辖下的城市列表的接口是:https://weather.cma.cn/api/dict/province + 省市编码
  3. 获取某城市天气信息的接口是: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()**函数,查看一下显示数据的类型。

在这里插入图片描述

果然,是一整段的字符串。

找到自动化脚本的基础,开始实现自动化脚本

由于返回的天气信息我们能够看出是一个可分段读取的数据包,所以基于现在的信息,我们可以梳理要实现的功能:

  1. 第一,需要一个爬虫来获得城市列表和编号,刚才我们已经实现了,这个模块要实现复用,因为在获取省市列表和城市列表的时候要使用两次。
  2. 第二,需要一个模块将字符串分隔成城市与编号一一对应,这个模块要在两次读取列表后将字符串分解并存储。
  3. 第三,需要根据最终选择的城市,抓取天气信息

可以确定,第一步和第二步,是自动化脚本的基础。

选用正确的数据结构,为后期打开便捷之路

因为已经实现了爬取列表和编号的爬虫,所以第一步已经实现,既然确定了整个流程,我们开始第二步。
分析一下读取回来的结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

红辣椒炒绿辣椒

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值