写一个爬取每日温度排行榜的爬虫

完整程序可以在公众号:拇指笔记后台回复“爬虫02”获得。

本文内容

中国天气网上有非常多的天气信息,但是页面上的广告实在是有点多,所以我就将爬取中国天气网上的信息作为练手项目了。

本文介绍了爬取中国天气网中的每日最高气温排名、昼夜温差排名和降水量排名的方法,并且在最后使用prettytable库将他们以表格的形式输出。

效果一览

爬取信息

首先F12进入浏览器的开发者模式,找到被爬取部分在HTML文件中对应的位置。由图不难看出,被框部分对应着排行榜,其中class = on代表被打开的排行榜。因此可以确定,需要被爬取的部分的第一个节点为 u l ul ul

然后继续查看 u l ul ul下的内容,发现<li class>表示每一行排名,<li class>下的<span class = ...>代表不同内容。

掌握了以上规律后,就可以着手编写程序了。由于使用节点信息就可以找到我们需要的信息,所以我用了bs4库中的select方法。select的选取规则依赖于css,所以也叫做css过滤器。在写select方法的过滤条件时,标签名不加修饰,类名前加点,id名前加#。

现在根据上面的信息查找我们需要的内容。

obj = bf(html.read(),'html.parser')

obj.select('ul li .city')	#城市信息
obj.select('ul li .prov')	#城市所属省份
obj.select('ul li .wd')		#温度
obj.select('ul li .ord')	#排名

数据存储

上面的程序可以成功爬取到有关信息,但我们只需要其中的文本信息,通过使用.get_text()方法获得其中的文本信息。

obj = bf(html.read(),'html.parser')

obj.select('ul li .city').get_text()	#城市信息
obj.select('ul li .prov').get_text()	#城市所属省份
obj.select('ul li .wd').get_text()		#温度
obj.select('ul li .ord').get_text()		#排名

获取得到文本信息后,需要将他存储到列表中,一遍后续输出处理。这里出现了个小插曲,这个网站的排名、温度表头标签与表格内容标签不一样,但城市、省份表头与内容标签一样,就导致了四个爬取信息的数量不同。

for i in range(33):
    city_text.append(obj.select('ul li .city')[i].get_text())
    prov_text.append(obj.select('ul li .prov')[i].get_text())
    
#排名与温度表头标签为sort和lastTemp
ord_text.append(obj.select('ul li .sort')[0].get_text())
wd_text.append(obj.select('ul li .lastTemp')[0].get_text())

for i in range(30):
    wd_text.append(obj.select('ul li .wd')[i].get_text())
    ord_text.append(obj.select('ul li .ord')[i].get_text())

输出信息

由于城市名称的字数不一定相同,也就导致了直接print会对不齐。所以我找到了一个第三方库prettytable。 PrettyTable可用来生成美观的ASCII格式的表格,十分实用。 安装就是简单的pip,这里不再赘述了。

这个库使用也十分简单。首先需要实例化一个表格对象。

tb = pt.PrettyTable()

其次添加表头(如果不添加的话,会自动生成Field1,Field2…)。

tb.field_names = [ord_text[0], city_text[0], prov_text[0],wd_text[0]]

然后按行添加每一行的表格内容。

for i in range(1,11):
   tb.add_row([ord_text[i], city_text[i], prov_text[i],wd_text[i]])

最后输出,一个ASCII风格的表格就成型了。

print(tb)

将三个排行按上面的方法添加到列表并输出表格得到的效果如下

最后

如果觉得本文还可以,还请各位点个赞。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值