一、使用的工具单独使用完成 pycharms 完成实验,在分析的时候使用 Jupyter Notebook
在爬虫所需要lxml和bs4这两个库已经确认安装后,确保自己的已经安装了pandas和matplotlib这两个库
1.安装方式:# 推荐使用清华镜像下载速度较快pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simplepip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
2.简介Pandas可以对数据进行导入、清洗、处理、统计和输出Matplotlib能够生成各种格式的图形(诸如折线图,散点图,直方图等等),界面可交互
二、基本思路1.目的爬取中国天气网的温度数据画出温度最高前10名的数据展示图画出温度最低前10名的数据展示图
2.步骤2.1 爬取数据分析网址满足http://www.weather.com.cn/textFC/{}.shtml的格式
定位于东北的网址:http://www.weather.com.cn/textFC/db.shtml定位于华北的网址:http://www.weather.com.cn/textFC/hb.shtml定位于华中的网址:http://www.weather.com.cn/textFC/hz.shtml
zone = ['db', 'hb', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat'] for z in zone: url = "http://www.weather.com.cn/textFC/{}.shtml".format(z)
爬取数据使用bs4库来爬取中国天气网的最高气温,存储到一个列表HIGH_DATA中
具体分析可以看小编之前的数据分析的三种方法,在文章后面附加链接
【Python爬虫+数据分析实战–爬取并分析中国天气网的温度信息】HIGH_DATA = https://www.isolves.com/it/cxkf/yy/Python/2020-08-05/[]response = requests.get(url, headers=headers)text = response.content.decode("utf-8")soup = BeautifulSoup(text,'html5lib')conMidtab = soup.find('div',class_='conMidtab')tables = conMidtab.find_all('table')for table in tables:trs = table.find_all('tr')[2:]for index,tr in enumerate(trs):# ebumerate能够取出对应的下标和值tds = tr.find_all('td')if index == 0:city_td = tds[1]else:city_td = tds[0]city = list(city_td.stripped_strings)[0]temp_td = tds[-5]max_temp = list(temp_td.stripped_strings)[0]HIGH_DATA.Append({"city": city, 'high_temp': int(max_temp)})
使用lxml库来爬取中国天气网的最低气温数据,存储到一个列表LOW_DATA中
response = requests.get(url, headers=headers)text = response.text.encode('ISO-8859-1')trees = etree.HTML(text)citys = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="83"][@height="23"]/a/text()')lows = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="86"]/text()')while True: if '最低气温' not in lows:break else:lows.remove('最低气温')for i in zip(citys, lows): city, low = i LOW_DATA.append({"city": city, "low_temp": int(low)})
2.2 数据清洗使用pandas的DataFrame对象来获取前十名的数据
# 将取出的数据转为DataFrame对象,相当于一个表格i = pd.DataFrame(LOW_DATA)j = pd.DataFrame(HIGH_DATA)# 经过排序来取出前十名的数据,分别放在ten_low和ten_high中ten_low = i.sort_values(by="low_temp", ascending=True)[0:10]ten_high = j.sort_values(by="high_temp", ascending=True)[-10:]
2.3 绘制图形使用Matplotlib来绘制图案,需要解决的问题为文本显示问题还有符号显示问题
具体的方法在代码都已经说明
# 分区域绘图subplot(行,列,第()个)plt.subplot(2, 1, 1)# 逆序排序取前面十个然后放在ten_low中ten_low = i.sort_values(by="low_temp", ascending=True)[0:10]# 设置x和y轴的字体为黑体(SimHei)/解决轴不能显示字体的问题plt.rcParams['font.sans-serif'] = ['SimHei']# 解决不能显示负号的问题plt.rcParams['axes.unicode_minus'] = False# 取出ten_low中的城市和气温x1 = list(ten_low['city'])y1 = list(ten_low['low_temp'])# 画出bar图plt.bar(x1, y1)# 定义x和y轴的名称plt.xlabel('城市', fontproperties='SimHei')plt.ylabel("温度", fontproperties='SimHei')# 定义图表的名称plt.title("中国各个城市的今日温度最低前十名", fontproperties='SimHei')# 显示bar图上的数值for x, y in zip(x1, y1): plt.text(x, y, '%s' % y, ha='center', va='bottom')# 画出第二个子图plt.subplot(2, 1, 2)# 取出最低气温的后面十个数值ten_high = j.sort_values(by="high_temp", ascending=True)[-10:]x2 = list(ten_high['city'])y2 = list(ten_high['high_temp'])# plt.rcParams['font.sans-serif'] = ['SimHei']# plt.rcParams['axes.unicode_minus'] = Falseplt.bar(x2, y2)plt.xlabel('城市', fontproperties='SimHei')plt.ylabel("温度", fontproperties='SimHei')plt.title("中国各个城市的今日温度最高前十名", fontproperties='SimHei')for x, y in zip(x2, y2): plt.text(x, y, '%s' % y, ha='center', va='bottom')# 调整每隔子图之间的距离(默认)plt.tight_layout()plt.show()
推荐阅读
- Python小程序网络耗时监控
- 你知道Python有内置数据库吗?Python内置库SQlite3使用指南
- Python基础算法之快速求解
- 数据科学家必须知道的前十大PYTHON库
- Python编程语言的核心是什么?
- Python安装库太慢?配置好这个速度飞起
- 不可不知的Python数据结构
- 5分钟内搭建你的第一个Python聊天机器人
- 深度详解Python中Unicode编码
- 通过 VSCode RTOS 插件使用 Python 为物联网系统编写程序