前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】Python爬虫爬取中国天气网(二)

【Python】Python爬虫爬取中国天气网(二)

作者头像
树枝990
发布2020-08-19 09:56:01
2.2K0
发布2020-08-19 09:56:01
举报
文章被收录于专栏:拇指笔记

本文内容

中国天气网上有非常多的天气信息,但是页面上的广告实在是有点多,所以我就简单写了个爬虫爬取中国天气网上的信息练手了。

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

效果一览

爬取信息

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

ul

然后继续查看

ul

下的内容,发现<li class>表示每一行排名,<li class>下的<span class = ...>代表不同内容。

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

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

代码语言:javascript
复制
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()方法获得其中的文本信息。

代码语言:javascript
复制
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()  #排名

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

代码语言:javascript
复制
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,这里不再赘述了。

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

代码语言:javascript
复制
tb = pt.PrettyTable()

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

代码语言:javascript
复制
tb.field_names = [ord_text[0], city_text[0], prov_text[0],wd_text[0]]

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

代码语言:javascript
复制
for i in range(1,11):
   tb.add_row([ord_text[i], city_text[i], prov_text[i],wd_text[i]])

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

代码语言:javascript
复制
print(tb)

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文内容
  • 效果一览
  • 爬取信息
  • 数据存储
  • 输出信息
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档