Python爬取莆田三月份天气情况

一、主题式网络爬虫设计方案

1.主题式网络爬虫名称:爬取天气

2.主题式网络爬虫爬取的内容与数据特征分析:1)莆田三月份的所有天气情况;

                                          2)数据有日期天气情况和气温情况

3.主题式网络爬虫设计方案概述:1)HTML页面分析得到HTML代码结构;

                              2)程序实现:a.定义代码字典;b.用requests抓取网页信息;

                                           c.用BeautifulSoup库解析网页;d.定义主函数main()

 

 

二、主题页面的结构特征分析

1.主题页面的结构与特征分析(网页地址:http://www.tianqihoubao.com/lishi/putian/month/202003.html):源文件为html结构

2.Htmls页面解析

 3.节点(标签)查找方法与遍历方法:使用find_all()方法遍历文档树

 

 三、网络爬虫程序设计

1.数据爬取与采集

 1 import requests
 2 from bs4 import BeautifulSoup
 3 #目标url
 4 url = 'http://www.tianqihoubao.com/lishi/putian/month/202003.html'
 5 #获取网页源代码
 6 resp = requests.get(url)
 7 html = resp.content.decode('gbk')
 8 #数据提取
 9 soup = BeautifulSoup(html,'html.parser')
10 tr_list = soup.find_all('tr')
11 print(tr_list)

采集结果(部分截图):

 2.对数据进行清洗和处理

 1 import numpy as np
 2 import pandas as pd
 3 dates,conditions,temp = [],[],[]
 4 for data in tr_list[1:]:
 5     sub_data = data.text.split()
 6     dates.append(sub_data[0])
 7     conditions.append(''.join(sub_data[1:3]))
 8     temp.append(''.join(sub_data[3:6]))
 9 _data = pd.DataFrame()
10 _data['日期'] = dates
11 _data['天气情况'] = conditions
12 _data['气温'] = temp
13 print(_data

处理结果:

 4.数据分析与可视化

 1 #数据可视化
 2 from matplotlib import pyplot as plt
 3 
 4 #显示中文
 5 plt.rcParams['font.sans-serif'] = ['SimHei']
 6 
 7 #显示负号
 8 plt.rcParams['axes.unicode_minus'] = False
 9 data = pd.read_csv('putian.csv')
10 
11 #数据处理
12 data['最高气温'] = data['气温'].str.split('/',expand=True)[0]
13 data['最低气温'] = data['气温'].str.split('/',expand=True)[1]
14 data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('',''))) 
15 data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('','')))
16 
17 dates = data['日期']
18 highs = data['最高气温']
19 lows = data['最低气温']
20 
21 #画图
22 fig = plt.figure(dpi=128,figsize=(10,6))
23 
24 plt.plot(dates,highs, c='red',alpha=0.5)
25 plt.plot(dates,lows, c='blue',alpha=0.5)
26 
27 plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)
28 
29 #图表格式
30 #设置图形格式
31 plt.title('2020年三月份天气',fontsize=24)
32 plt.xlabel('',fontsize=6)
33 fig.autofmt_xdate() #绘制斜的日期标签,避免重叠
34 plt.ylabel('气温',fontsize=12)
35 plt.tick_params(axis='both',which='major',labelsize=10)
36 
37 #修改刻度
38 plt.xticks(dates[::1])
39 
40 #显示折线图
41 plt.show()

结果图:

 

5.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程

1)相关系数:

1 #绘制散点图以及回归方程
2 #计算相关系数
3 X = highs
4 Y = lows
5 X.corr(Y)

如图:

2)散点图:

1 #散点图
2 plt.title('2020年三月份最高温与最低温散点图',fontsize=20)
3 x = highs
4 y = lows
5 plt.xlabel('最高温度',fontsize=12)
6 plt.ylabel('最低温度',fontsize=12)
7 plt.scatter(x,y,color='purple',linewidth=2)
8 plt.show()

如图:

3)回归方程:

 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('2020年三月分最低温与最高温光系图')
23     plt.grid()
24     plt.legend()
25     plt.show()
26 main()    

如图:

 6.数据持久化: 1 fig = plt.gcf() 2 plt.show() 3 fig.savefig('putian.png', dpi=100) 

如图:

 7.将以上各部分的代码汇总,附上完整程序代码:

  1 import requests
  2 import pandas as pd
  3 from bs4 import BeautifulSoup
  4 
  5 #目标url
  6 url = 'http://www.tianqihoubao.com/lishi/putian/month/202003.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 
 16 dates,conditions,temp = [],[],[]
 17 for data in tr_list[1:]:
 18     sub_data = data.text.split()
 19     dates.append(sub_data[0])
 20     conditions.append(''.join(sub_data[1:3]))
 21     temp.append(''.join(sub_data[3:6]))
 22 _data = pd.DataFrame()
 23 _data['日期'] = dates
 24 _data['天气情况'] = conditions
 25 _data['气温'] = temp
 26 _data.to_csv('putian.csv',index=False,encoding='utf-8')#去掉索引以及避免乱码
 27 
 28 #数据可视化
 29 from matplotlib import pyplot as plt
 30 
 31 #显示中文
 32 plt.rcParams['font.sans-serif'] = ['SimHei']
 33 
 34 #显示负号
 35 plt.rcParams['axes.unicode_minus'] = False
 36 data = pd.read_csv('putian.csv')
 37 
 38 #数据处理
 39 data['最高气温'] = data['气温'].str.split('/',expand=True)[0]
 40 data['最低气温'] = data['气温'].str.split('/',expand=True)[1]
 41 data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('','')))
 42 data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('','')))
 43 
 44 dates = data['日期']
 45 highs = data['最高气温']
 46 lows = data['最低气温']
 47 
 48 #画图
 49 fig = plt.figure(dpi=128,figsize=(10,6))
 50 
 51 plt.plot(dates,highs, c='red',alpha=0.5)
 52 plt.plot(dates,lows, c='blue',alpha=0.5)
 53 
 54 plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)
 55 
 56 #图表格式
 57 #设置图形格式
 58 plt.title('2020年三月份天气',fontsize=24)
 59 plt.xlabel('',fontsize=6)
 60 fig.autofmt_xdate() #绘制斜的日期标签,避免重叠
 61 plt.ylabel('气温',fontsize=12)
 62 plt.tick_params(axis='both',which='major',labelsize=10)
 63 
 64 #修改刻度
 65 plt.xticks(dates[::1])
 66 
 67 #显示折线图
 68 plt.show()
 69 
 70 #绘制散点图以及回归方程
 71 #计算相关系数
 72 x = highs
 73 y = lows
 74 x.corr(y)
 75 
 76 #散点图
 77 plt.title('2020年三月份最高温与最低温散点图',fontsize=20)
 78 x = highs
 79 y = lows
 80 plt.xlabel('最高温度',fontsize=12)
 81 plt.ylabel('最低温度',fontsize=12)
 82 plt.scatter(x,y,color='purple',linewidth=2)
 83 plt.show()
 84 
 85 #回归方程
 86 import numpy as np
 87 from scipy.optimize import leastsq
 88 X = np.array(highs)
 89 Y = np.array(lows)
 90 def func(params, x):
 91     k, b = params
 92     return k*x+b
 93 def error(params,x,y):
 94     return func(params,x) - y
 95 def main():
 96     plt.figure(figsize=(10,6))
 97     p0 = [0,0]
 98     Para = leastsq(error, p0, args=(X,Y))
 99     k, b = Para[0]
100     print("k={:.2f},b={:.2f}".format(k,b))
101     plt.scatter(X,Y,color='green',label='样本数据',linewidth=2)
102     
103 #画拟合曲线
104     x = np.linspace(1,30,30)
105     y = k*x+b
106     plt.plot(x,y,color='red',label='拟合曲线',linewidth=2)
107     plt.title('2020年三月分最低温与最高温光系图')
108     plt.grid()
109     plt.legend()
110     plt.show()
111 main()
112 
113 #数据持久化
114 fig = plt.gcf()
115 plt.show()
116 fig.savefig('putian.png', dpi=100)

 

 

四.结论

1.2020年3月份莆田每日温差较大,且呈现出逐渐上升趋势,每日最高温度与最低温度相关性也较大,且进行数据可视化后可以更为直观明了的观察,而三月份最低温度也在10摄氏度左右,可以看出是一个很适合居住的城市。

2.本次程序设计任务,我选择的是爬取天气后报网,课题是爬取3月份的天气情况,并不是天气预报,对于这个网址的爬取相对简单,首先它是一个静态网页,其次节点也相当好找,而且爬虫部分也不需要伪装,可以说是一个相对简单的课题。但是不可否认的是,在程序设计过程中出现了较多问题,如基础不扎实,一部分报错无法看懂,在数据处理时将列表改为整形数据时遇到了困难,进行了大量尝试才最终成功,又如在数据可视化过程中遇到了纵坐标数据出现乱序,而找不出原因,又进行了大量的尝试,更让我认识的自己的基本功之不扎实,但相较于上一次作业而言,完成度高,完成了所有任务目标。

posted @ 2020-09-27 18:20  郭逹  阅读(430)  评论(0编辑  收藏  举报