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