【Python】Python爬虫爬取中国天气网(二)
本文内容
中国天气网上有非常多的天气信息,但是页面上的广告实在是有点多,所以我就简单写了个爬虫爬取中国天气网上的信息练手了。
本文介绍了爬取中国天气网中的每日最高气温排名、昼夜温差排名和降水量排名的方法,并且在最后使用prettytable库将他们以表格的形式输出。
效果一览
爬取信息
首先F12进入浏览器的开发者模式,找到被爬取部分在HTML文件中对应的位置。由图不难看出,被框部分对应着排行榜,其中class = on代表被打开的排行榜。因此可以确定,需要被爬取的部分的第一个节点为
。
然后继续查看
下的内容,发现<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)
将三个排行按上面的方法添加到列表并输出表格得到的效果如下
- CaseStudy(showcase)类库篇-用agTweener来实现动画效果
- CaseStudy(showcase)数据篇-Loading的制作
- CaseStudy(showcase)数据篇-加载图片
- CaseStudy(showcase)数据篇-从XML中获取数据
- CaseStudy(showcase)布局篇-全屏效果
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-EasyUI缺陷修复与扩展
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(5)-EF增删改查
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(15)-权限管理系统准备
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
- No.3 啥是数据运营(三):思维方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- flink实战-模拟简易双11实时统计大屏
- Android Studio首次运行指南
- PAT (Basic Level) Practice (中文)1047 编程团体赛
- 聊聊AWK命令的那些事
- Flink实战-定时器实现已完成订单自动五星好评
- 树状数组-HDU3015 Disharmony Trees
- 放弃fastjson,拥抱Jackson
- Spring入门
- 贪心-HDU1789 Doing Homework again(活动安排问题)
- flink实战-实时计算平台通过api停止流任务
- JAVA初级岗面试知识点——基础篇
- flink实战-flink streaming sql 初体验
- flink实战教程-使用set实时计算当天网站uv
- 贪心-HDU3348 coins(钱币问题)
- 归并排序详解 -HDU4911 Inversion(逆序对)