参考教材

chapter16 数据可视化

引言

在参考教材 《Python编程——从入门到实践》的* 第 16 章 —— 数据可视化 进行 Python3 的学习时, 我们发现了一道很值得关注的练习题:从网络上下载一个地方的天气数据,并分析之。 在实现这个功能的时候,我们用到了简单爬虫和数据可视化的方法......

原题

试从

开始

首先,我们打开这个链接

输入地址:北京

等待一下结果:

不错嘛!

我们找一找这个 Comma-Delimited File 链接

(ノ=Д=)ノ┻━┻ 未找到此词是什么鬼!

不要怕,必应一下

还真让我找到了相关的材料,,,,虽然是豆丁上的

虽然这里也提到了 Comma Delimited File 但是为抓取数据提供了新的思路

现在思路已经很明确了

用爬虫抓取数据 -> 处理成方便的 CSV文件 ->可视化处理

第一步:用爬虫抓取数据

我们在搜索框中输入 : 北京,选择 Monthly

留心一下网址

我们把网址根据上面的参考资料修改一下:


le voila !

CSV 表格出来了

接下就是用爬虫抓取这些数据

虽然我是个小白不怎么懂爬虫,但是网络大神多啊,在仔细拜读了大神 voidsky_很有趣儿所写的

【图文详解】python爬虫实战——5分钟做个图片自动下载器


之后,我也照猫画虎地写了一个小爬虫出来

#-*- coding:utf8 -*-
import re
import os
import requests
months = range(1,13)
dir_name = 'weather' #建一个文件夹存放文件
if not os.path.exists(dir_name): #检查这个文家尖存不存在,不存在则创建
os.mkdir(dir_name)
string = ""+dir_name+"\Beijing_2015.csv" #抓取北京2015年的天气数据
for month in months:
url = 'https://www.wunderground.com/history/airport/ZBAA/2015/'+str(month)+'/1/MonthlyHistory.html?format=1'
result = requests.get(url)
html = requests.get(url).text
try:
info = requests.get(url)
except requests.exceptions.ConnectionError:
print('【错误】当前数据无法下载')
continue
else:
fp = open(string,'ab') #每次循环都追加写入数据
fp.write(info.content)
print('month = ',month)
fp.close()
print('Done')

打开当前目录下的weather文件夹,文件 Beijing_2015.cvs 已经写好啦

第二步:预处理CVS文件

通过之前的代码生成的 Beijing_2015.cvs 文件中,每个月的数据开头都有一行空行和题头

这个可以用python代码处理,也可以用excel处理,都很简单,故不再多说

第三步:可视化数据

这里的操作跟教材几乎一模一样,只有一个地方需要改动 那就是在处理日期的时候

原来的代码需要变成这个样子,因为日期是 2016/x/x 的格式,没错我抓取了2016年跟2015年的数据,但是只处理了2016年的数据。。。。。

current_date = datetime.strptime(row[0],'%Y/%m/%d')

直接贴代码好了

__author__ = 'Administrator'
#! /usr/bin/python 
# -*- coding: utf-8 -*-import csv
from matplotlib import pyplot as plt
from datetime import datetime
import ch
ch.set_ch()
filename = 'Beijing_2016.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
highs, lows, dates = [], [], []
#逐行统计数据
for row in reader:
try:
current_date = datetime.strptime(row[0],'%Y/%m/%d')#这里与示范代码不同
high = int(row[1])
low = int(row[3])
except ValueError:
print(current_date,'missing data')
continue
else:
dates.append(current_date)
highs.append(high)
lows.append(low)
#根据数据绘制图形
fig = plt.figure(dpi = 64, figsize=(10,6) )
plt.plot(dates, highs, c='red',alpha=0.8)
plt.plot(dates, lows, c='blue',alpha=0.8)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.3)
plt.title(u'北京市日最高最低气温统计图 - 2016',fontsize=24)
plt.xlabel('', fontsize=16)
plt.xlim([dates[0], dates[-1]])
fig.autofmt_xdate()
plt.ylabel(u'温度(摄氏度)',fontsize=16)
plt.tick_params(axis='both',which='major',labelsize=16)
plt.legend([u'最高气温', u'最低气温'], loc='upper right',fontsize=24)
plt.savefig('北京日最高最低气温统计图 - 2016.png',bbox_inches='tight')
plt.show()

最后的结果

备注

值得注意的是,除了网页数据抓取之外,我们还发现,matplotlib库本身默认不支持中文显示,经过强大的互联网加持,我们最终还是从吴文敏大神的技术博客里找到了解决方法

Ps: 其实我最后还是把两年的数据都处理了,对比一下,大家看看有什么差别吧