参考教材
chapter16 数据可视化
引言
在参考教材 《Python编程——从入门到实践》的* 第 16 章 —— 数据可视化 进行 Python3 的学习时, 我们发现了一道很值得关注的练习题:从网络上下载一个地方的天气数据,并分析之。 在实现这个功能的时候,我们用到了简单爬虫和数据可视化的方法......
原题
试从 https://www.wunderground.com/history 中下载一个地方的天气数据。为此,请输入相应的地方和日期范围,滚动到页面底部,找到名为 Comma-Delimited File 的链接, 再的那几该链接,将数据储存为CSV文件
开始
首先,我们打开这个链接
输入地址:北京
等待一下结果:
不错嘛!
我们找一找这个 Comma-Delimited File 链接
(ノ=Д=)ノ┻━┻ 未找到此词是什么鬼!
不要怕,必应一下
还真让我找到了相关的材料,,,,虽然是豆丁上的
虽然这里也提到了 Comma Delimited File 但是为抓取数据提供了新的思路
现在思路已经很明确了
用爬虫抓取数据 -> 处理成方便的 CSV文件 ->可视化处理
第一步:用爬虫抓取数据
我们在搜索框中输入 : 北京,选择 Monthly
留心一下网址
我们把网址根据上面的参考资料修改一下:
https://www.wunderground.com/history/airport/ZBAA/2017/5/1/MonthlyHistory.html?format=1
le voila !
CSV 表格出来了
接下就是用爬虫抓取这些数据
虽然我是个小白不怎么懂爬虫,但是网络大神多啊,在仔细拜读了大神 voidsky_很有趣儿所写的
【图文详解】python爬虫实战——5分钟做个图片自动下载器
http://www.jianshu.com/p/19c846daccb3
(若有侵权嫌疑请联系我删除)
之后,我也照猫画虎地写了一个小爬虫出来
#-*- 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库本身默认不支持中文显示,经过强大的互联网加持,我们最终还是从吴文敏大神的技术博客里找到了解决方法
https://my.oschina.net/u/1180306/blog/279818
避免侵权,就只给出链接好了,大家可以自行前往学习