爬取崇明岛2021年11月的天气数据
一、前言
随着我国经济质量的提升,人民生活水平的提高,人们更加懂得享受物质资料的消费。大众旅游时代也随之到来,旅游日益成为人类社会主要的生活方式和社会经济活动,但旅途顺利与否,当地的气温状况尤为重要,只有充分了解当地的天气状况以及气温状况才能够去制定良好的旅游路线,以便旅游的顺利进行。我们可以通过电子设备进行天气情况的查询,但过于片面,我们可以利用爬虫爬取对某个地区的气温状况和气温的数据,再将这些数据进行整理并进行分析,所以下面我以崇明岛十一月的天气状况为例进行数据的爬取和分析。
二、主题式网络爬虫设计
1.网络爬虫名称
爬取崇明岛2021年11月的天气数据
2.网络爬虫爬取的内容与数据特征分析
目标网站是崇明历史天气预报查询_2021年11月份崇明天气记录_崇明2021年11月份天气情况_天气后报 (tianqihoubao.com)),爬取崇明岛2021年11月的天气状况、气温
3.网络爬虫设计方案概述:
思路:找到所要爬取的网页(崇明历史天气预报查询_2021年11月份崇明天气记录_崇明2021年11月份天气情况_天气后报 (tianqihoubao.com)),按F12查看网页所有代码,找到所要爬取的数据及分析标签,导入相应库,开始对数据进行爬取
进一步对数据提取、处理、可视化、绘制图形、保存数据等
技术难点:对于有些数据,用各种标签无法实现爬取,以及爬取到的数据含有不需要的字符串,需要通过其他手段进行处理
三、主题页面的结构特征分析
1.主题页面的结构与特征分析:
需要爬取的内容如下:
2.网站Htmls页面结构解析:
观察到要爬取的数据都在 <table></table>标签下的<td></td>子标签下,又因为,所要提取数据均为正常数据,没有乱码现象,所以可以直接去提取数据,具体代码见第三部份爬虫设计;
3.节点(标签)查找方法与遍历方法:找到全是<tr>下的数据
三、网络爬虫程序设计
1.数据爬取与采集:
1 #导包 2 import requests 3 from bs4 import BeautifulSoup 4 #目标url 5 url = 'http://www.tianqihoubao.com/lishi/chongming/month/202111.html' 6 #获取网页源代码 7 resp = requests.get(url) 8 html = resp.content.decode('gbk') 9 #数据提取 10 soup = BeautifulSoup(html,'html.parser') 11 tr_list = soup.find_all('tr') 12 print(tr_list)
得到结果
2.将爬到的数据进行整理并保存为 .csv文件
1 dates,conditions,temp1,temp2 = [],[],[],[] 2 for data in tr_list[1:]: 3 sub_data = data.text.split() 4 dates.append(sub_data[0]) 5 conditions.append(''.join(sub_data[1:3])) 6 temp1.append(''.join(sub_data[3])) 7 temp2.append(''.join(sub_data[5])) 8 _data = pd.DataFrame() 9 _data['日期'] = dates 10 _data['天气情况'] = conditions 11 _data['最高气温'] = temp1 12 _data['最低气温'] = temp2 13 _data.to_csv('崇明岛2021年11月的天气数据.csv',index=False,encoding='utf-8')#去掉索引以及避免乱码
结果如下
3.数据检查
1 #读取数据 2 chongming=pd.read_csv('崇明岛2021年11月的天气数据.csv') 3 print('\n====各列的空值情况如下:====') 4 print(chongming.isnull()) #统计空值情况 5 print(chongming.duplicated()) #查找重复值 6 print(chongming.isna().head()) #统计缺失值 # 得出结果为False则不为空值 7 print(chongming.corr()) #两个变量的相关系数 8 print(chongming.describe()) #打印出数据
4.对收集到的数据进行可视化分析
1 #数据可视化 2 from matplotlib import pyplot as plt 3 #显示中文 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 #显示负号 6 plt.rcParams['axes.unicode_minus'] = False 7 data = pd.read_csv('崇明岛2021年11月的天气数据.csv') 8 #数据处理 9 data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('℃',''))) 10 data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('℃',''))) 11 12 dates = data['日期'] 13 highs = data['最高气温'] 14 lows = data['最低气温'] 15 16 #画图 17 fig = plt.figure(dpi=128,figsize=(10,6)) 18 19 plt.plot(dates,highs, c='green',alpha=0.5) 20 plt.plot(dates,lows, c='red',alpha=0.5) 21 22 #图表格式 23 #设置图形格式 24 plt.title('2021年崇明岛11月份天气',fontsize=24) 25 plt.xlabel('',fontsize=16) 26 fig.autofmt_xdate() #绘制斜的日期标签,避免重叠 27 plt.ylabel('气温',fontsize=12) 28 plt.tick_params(axis='both',which='major',labelsize=10) 29 30 #修改刻度 31 plt.xticks(dates[::1]) 32 #将图片保存 33 plt.savefig('2021年崇明岛11月份气温.png', dpi=100) 34 plt.show()
结果如下:
5.散点图
1 #散点图 2 fig = plt.figure(dpi=128,figsize=(20,8)) 3 plt.title('2021年崇明岛11月份最低温散点图',fontsize=20) 4 x = data['日期'].str.split('月',expand=True)[1] 5 y = lows 6 plt.xlabel('日期',fontsize=12) 7 plt.ylabel('最低温度',fontsize=12) 8 plt.scatter(x,y,color='purple',linewidth=1) 9 plt.show() 10 11 #散点图 12 fig = plt.figure(dpi=128,figsize=(20,8)) 13 plt.title('2021年崇明岛11月份最高温散点图',fontsize=20) 14 x = data['日期'].str.split('月',expand=True)[1] 15 y = highs 16 plt.xlabel('日期',fontsize=12) 17 plt.ylabel('最高温度',fontsize=12) 18 plt.scatter(x,y,color='purple',linewidth=1) 19 plt.show()
结果如下:
6.线性回归方程
1 #回归方程 2 import numpy as np 3 from scipy.optimize import leastsq 4 X = np.array(highs) 5 Y = np.array(lows) 6 def func(params, x): 7 k, b = params 8 return k*x+b 9 def error(params,x,y): 10 return func(params,x) - y 11 def main(): 12 plt.figure(figsize=(10,6)) 13 p0 = [0,0] 14 Para = leastsq(error, p0, args=(X,Y)) 15 k, b = Para[0] 16 print("k={:.2f},b={:.2f}".format(k,b)) 17 plt.scatter(X,Y,color='green',label='样本数据',linewidth=2) 18 #画拟合曲线 19 x = np.linspace(1,30,30) 20 y = k*x+b 21 plt.plot(x,y,color='red',label='拟合曲线',linewidth=2) 22 plt.title('2021年11月份崇明岛最低温与最高温光系图') 23 plt.grid() 24 plt.legend() 25 #将图片保存 26 plt.savefig('2021年11月份崇明岛最低温与最高温光系图.png', dpi=100) 27 plt.show() 28 29 main()
结果如下
7.直方图
1 plt.rcParams['font.sans-serif']=['SimHei'] #设置字体 2 filename = '崇明岛2021年11月的天气数据.csv' 3 colnames=['日期','天气情况','气温'] 4 df = pd.read_csv(filename) 5 6 X=df.loc[1:30,'日期'].str.split('月',expand=True)[1] 7 Y=df.loc[1:30,'天气情况'] 8 9 plt.bar(X,Y) 10 plt.title("崇明岛2021年11月天气数据") 11 plt.show
效果展示
8.数据持久化
1 #将图片保存 2 plt.savefig('2021年崇明岛11月份天气.png', dpi=100) 3 plt.show() 4 #将图片保存 5 plt.savefig('2021年崇明岛11月份最高温与最低温散点图.png', dpi=100) 6 plt.show() 7 #将图片保存 8 plt.savefig('2021年11月份崇明岛最低温与最高温光系图.png', dpi=100) 9 plt.show() 10 #....未全部贴出
图片均保存于电脑
9.完整代码展示
1 #导入包 2 import requests 3 from bs4 import BeautifulSoup 4 5 #目标url 6 url = 'http://www.tianqihoubao.com/lishi/chongming/month/202111.html' 7 8 #获取网页源代码 9 resp = requests.get(url) 10 html = resp.content.decode('gbk') 11 12 #数据提取 13 soup = BeautifulSoup(html,'html.parser') 14 tr_list = soup.find_all('tr') 15 print(tr_list) 16 17 #创建列 18 dates,conditions,temp1,temp2 = [],[],[],[] 19 20 #遍历数据 21 for data in tr_list[1:]: 22 sub_data = data.text.split() 23 dates.append(sub_data[0]) 24 conditions.append(''.join(sub_data[1:3])) 25 temp1.append(''.join(sub_data[3])) 26 temp2.append(''.join(sub_data[5])) 27 28 #将数据拼接 29 _data = pd.DataFrame() 30 _data['日期'] = dates 31 _data['天气情况'] = conditions 32 _data['最高气温'] = temp1 33 _data['最低气温'] = temp2 34 35 #保存为csv文件 36 _data.to_csv('崇明岛2021年11月的天气数据.csv',index=False,encoding='utf-8')#去掉索引以及避免乱码 37 38 #数据清洗检查 39 chongming =pd.read_csv('崇明岛2021年11月的天气数据.csv') 40 print('\n====各列的空值情况如下:====') 41 42 #统计空值情况 43 print(chongming.isnull()) 44 45 #查找重复值 46 print(chongming.duplicated()) 47 48 #统计缺失值 # 得出结果为False则不为空值 49 print(chongming.isna().head()) 50 51 #两个变量的相关系数 52 print(chongming.corr()) 53 54 #打印出数据 55 print(chongming.describe()) 56 57 #数据可视化 58 from matplotlib import pyplot as plt 59 60 #显示中文 61 plt.rcParams['font.sans-serif'] = ['SimHei'] 62 63 #显示负号 64 plt.rcParams['axes.unicode_minus'] = False 65 data = pd.read_csv('崇明岛2021年11月的天气数据.csv') 66 67 #数据处理 68 data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('℃',''))) 69 70 data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('℃',''))) 71 72 dates = data['日期'] 73 highs = data['最高气温'] 74 lows = data['最低气温'] 75 76 #画图 77 fig = plt.figure(dpi=128,figsize=(10,6)) 78 79 plt.plot(dates,highs, c='green',alpha=0.5) 80 plt.plot(dates,lows, c='red',alpha=0.5) 81 82 #图表格式 83 #设置图形格式 84 plt.title('2021年崇明岛11月份天气',fontsize=24) 85 plt.xlabel('',fontsize=16) 86 87 #绘制斜的日期标签,避免重叠 88 fig.autofmt_xdate() 89 plt.ylabel('气温',fontsize=12) 90 plt.tick_params(axis='both',which='major',labelsize=10) 91 92 #修改刻度 93 plt.xticks(dates[::1]) 94 95 #将图片保存 96 plt.savefig('2021年崇明岛11月份气温.png', dpi=100) 97 plt.show() 98 99 #散点图1 100 fig = plt.figure(dpi=128,figsize=(20,8)) 101 plt.title('2021年崇明岛11月份最低温散点图',fontsize=20) 102 x = data['日期'].str.split('月',expand=True)[1] 103 y = lows 104 plt.xlabel('日期',fontsize=12) 105 plt.ylabel('最低温度',fontsize=12) 106 plt.scatter(x,y,color='purple',linewidth=1) 107 plt.show() 108 109 #散点图2 110 fig = plt.figure(dpi=128,figsize=(20,8)) 111 plt.title('2021年崇明岛11月份最高温散点图',fontsize=20) 112 x = data['日期'].str.split('月',expand=True)[1] 113 y = highs 114 plt.xlabel('日期',fontsize=12) 115 plt.ylabel('最高温度',fontsize=12) 116 plt.scatter(x,y,color='purple',linewidth=1) 117 plt.show() 118 119 #绘制直方图 120 plt.rcParams['font.sans-serif']=['SimHei'] #设置字体 121 filename = '崇明岛2021年11月的天气数据.csv' 122 colnames=['日期','天气情况','气温'] 123 df = pd.read_csv(filename) 124 fig = plt.figure(dpi=128,figsize=(20,10)) 125 X=df.loc[1:30,'日期'].str.split('月',expand=True)[1] 126 Y=df.loc[1:30,'天气情况'] 127 128 plt.bar(X,Y) 129 plt.title("崇明岛2021年11月") 130 plt.show 131 132 #回归方程 133 import numpy as np 134 from scipy.optimize import leastsq 135 X = np.array(highs) 136 Y = np.array(lows) 137 138 def func(params, x): 139 k, b = params 140 return k*x+b 141 142 def error(params,x,y): 143 return func(params,x) - y 144 145 def main(): 146 plt.figure(figsize=(10,6)) 147 p0 = [0,0] 148 Para = leastsq(error, p0, args=(X,Y)) 149 k, b = Para[0] 150 print("k={:.2f},b={:.2f}".format(k,b)) 151 plt.scatter(X,Y,color='green',label='样本数据',linewidth=2) 152 153 #画拟合曲线 154 x = np.linspace(1,30,30) 155 y = k*x+b 156 plt.plot(x,y,color='red',label='拟合曲线',linewidth=2) 157 plt.title('2021年11月份崇明岛最低温与最高温光系图') 158 plt.grid() 159 plt.legend() 160 161 #将图片保存 162 plt.savefig('2021年11月份崇明岛最低温与最高温光系图.png', dpi=100) 163 plt.show() 164 165 main()
四、总结与心得体会
1.经过对主题数据的分析与可视化,可以得到哪些结论?
崇明岛11月的气温相对于南方来说,非常低,经常有零度以下的严寒气温出现;
如果要前往崇明岛,需要注意保暖御寒;
但是崇明岛的天气状况相对稳定,只有个别极端天气,大部分保持在晴天。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次的程序设计,我认为自己知识的掌握还是有待提高,这次的程序设计作业应用了爬虫,对数据进行了爬取,所给的任务尽力完成了。但仍然存在一些错误,找不出解决方法。在这过程中我也发现了一些错误,list[]重置了输入的数据导致写入excel中为空数据,学会对数据进行基础的检查与清洗,可能因为数据的原因,词云功能无法实现,接下来我会继续研究,试着把它破解出来,希望以后可以将这些知识应用到生活中去。