Github项目完整源码地址:https://github.com/xylon666/Visualization
结果展示:
环境配置
IDE:Pycharm
第三方库:requests,pandas,matplotlib,BeautifulSoup4
浏览器:Chrome
爬取页面:天气预报网郑州2020.4月份天气情况 http://www.tianqihoubao.com/lishi/zhengzhou/month/202004.html
一、爬取信息
头文件准备
import requests
from bs4 import BeautifulSoup
import pandas as pd
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
}
url = "http://www.tianqihoubao.com/lishi/zhengzhou/month/202004.html"
右键审查元素,找到主要天气信息所在的浏览器标签是在<tr>标签里
那么先把这个标签里的内容爬下来
res = requests.get(url,headers=headers)
html = res.content.decode('gbk') #根据网页情况选择解码方式
#print(html.text)
soup = BeautifulSoup(html,'lxml')
list = soup.find_all('tr')
#print(list)
然后格式化处理并保存起来
dates,conditions,temp = [],[],[]
for i in list[1:]: #从第二列开始是天气数据
data = i.text.split() #对文字内容进行分段
#print(data)
#data[0] = ['2020年04月01日', '阴', '/阴', '13℃', '/', '7℃', '东北风', '3-4级', '/东北风', '3-4级']
dates.append(data[0])
conditions.append(data[1:3])
temp.append(data[3:6])
#print(dates,conditions,temp)
data_mouth = pd.DataFrame() #通过pandas创建一个数据集,存放天气信息
data_mouth['日期'] = dates
data_mouth['天气情况'] = conditions
data_mouth['气温'] = temp
#print(data_mouth)
看一下此时data_mouth存储的信息:
成功获得了我们需要的内容,然后导入csv文件进行下一步操作
data_mouth.to_csv("郑州天气.csv",index=False,encoding='utf-8') #导入到csv文件,不保留行索引
二、数据可视化
数据可视化需要用到的模块matplotlib,以及常用配置
import pandas as pd
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
导入csv文件,然后获得具体的最高温度和最低温度
data = pd.read_csv("郑州天气.csv")
data['最高气温'] = data['气温'].str.split("'",expand=True)[1] #extend=True 以'号为分隔符,将数据分为n个纵列,并标记id
data['最低气温'] = data['气温'].str.split("'",expand=True)[5]
# print(data['气温'])
# print(data['最高气温'])
# print(data['最低气温'])
绘图需要用温度做Y轴,因此将气温转化为int类型
data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('℃','')))
data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('℃','')))
#将气温“x℃”转换为数字类型,然后使用pandas里的map函数替换原来的值,方便做Y轴参数
#replace函数,replace(to_replace, value),将前面的值转化为后面的值
开始绘图,具体参数和用法都写有备注
dates = data['日期']
highs = data['最高气温']
lows = data['最低气温']
#画图 配置参数
fig = plt.figure(dpi=128,figsize=(10,6)) #设定画布分辨率,宽和高
plt.plot(dates,highs,c='red',alpha=0.5) #alpha 透明度,越接近1越不透明
plt.plot(dates,lows,c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)
#填充highs和lows之间的空隙
#外围标签
plt.title('2020年4月郑州天气情况',fontsize=24) #标题
plt.xlabel("",fontsize=6) #绘制X轴
fig.autofmt_xdate() #绘制斜的目标标签,避免重叠
plt.ylabel("气温",fontsize=12)
plt.tick_params(axis='both',which='major',labelsize=10) #设置坐标轴属性
plt.show()
运行搞定~