爬取崇明岛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中为空数据,学会对数据进行基础的检查与清洗,可能因为数据的原因,词云功能无法实现,接下来我会继续研究,试着把它破解出来,希望以后可以将这些知识应用到生活中去。

posted @ 2021-12-28 15:37  叁叁cute  阅读(87)  评论(0编辑  收藏  举报