一、选课的背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?
2345天气网站的反爬总体来说不算难,所以数据获取的难度方面是可实现的。爬取历史天气进行分析,可以对某个地区的天气情况进行探讨发现规律,在研究方向来看是有必要去进行的。将所爬取的数据进行平均气温计算,绘制历史平均气温折线图;再对天气情况进行统计,统计11月份青岛各个天气情况的占比,绘制饼图进行展示。
二、主题式网络爬虫设计方案
1.网络爬虫名称:“2345天气网站泉州6月份天气爬取分析”。
2.网络爬虫爬取的内容与数据特征分析: 爬取2345天气网站泉州地区的6月份数据,包括:\'日期\', \'星期\', \'最高气温\', \'最低气温\', \'天气情况\', \'风力\', \'平均气温\'
3.网络爬虫设计方案概述:
需多个步骤实现: 使用python的requests库对网站发起请求,获取得到网页数据,然后利用正则表达式提取所需要的数据,存入本地excel中
所需页面代码: 我们发现在点选历史天气的时候网址并没有发生变化,对应网页的源码中也没有我们所需要的数据信息。 利用chrome浏览器的开发者工具(F12),抓包获取泉州6月份天气数据的真实所在地址如下:
四、网络爬虫程序设计
数据爬取及采集:
import requests import re import pandas as pd import seaborn as sns import warnings import matplotlib.pyplot as plt #设置为seaborn风格 sns.set() #不显示警告 warnings.filterwarnings("ignore") plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] #显示中文 plt.rcParams[\'axes.unicode_minus\']=False #用来正常显示负号 #正则表达式提取数据 r1 = \'<td>(.*?)</td>\' re1 = re.compile(r1) r2 = \'<td style="color:#ff5040;">(.*?)</td>\' re2 = re.compile(r2) r3 = \'<td style="color:#3097fd;" >(.*?)</td>\' re3 = re.compile(r3) #浏览器headers headers = {\'User-Agent\':\'Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5\'} #爬取天气链接的地址 url = \'http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=59131&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=6\' #requests访问网页源码 df = requests.get(url,headers = headers).json()[\'data\'] #正则表达式提取日期 date = [l.split(\' \')[0] for l in re1.findall(df)[::4]] #正则表达式提取星期 week = [l.split(\' \')[1] for l in re1.findall(df)[::4]] #正则表达式提取最高温度 wd_h = re2.findall(df) #正则表达式提取最低温度 wd_w = re3.findall(df) #正则表达式提取天气情况 wea = re1.findall(df)[1::4] #正则表达式提取风力 win = re1.findall(df)[2::4] #创建dataframe存储数据 datas = pd.DataFrame() datas[\'日期\'] = pd.to_datetime(date) datas[\'星期\'] = week datas[\'最高气温\'] = wd_h datas[\'最低气温\'] = wd_w datas[\'天气情况\'] = wea datas[\'风力\'] = win datas.to_excel(\'data.xlsx\',index = None)
爬取运行生成一个excel文件:
数据清洗:
#提取日期 datas[\'日期\'] = datas[\'日期\'].map(lambda x:str(x).split(\' \')[0]) #去掉摄氏度 datas[\'最高气温\'] = datas[\'最高气温\'].map(lambda x:float(x.replace(\'°\',\'\'))) datas[\'最低气温\'] = datas[\'最低气温\'].map(lambda x:float(x.replace(\'°\',\'\'))) #计算平均气温 datas[\'平均气温\'] = (datas[\'最高气温\'] + datas[\'最低气温\'])/2 datas.to_excel(\'datac.xlsx\',index = None)
清洗后数据:
数据可视化:
#新建画布 plt.figure() #绘制折线图 plt.plot(list(datas[\'日期\']),list(datas[\'平均气温\'])) #设置标题 plt.title(\'平均温度变化趋势\') #设置X轴标签 plt.xlabel(\'日期\') #设置Y轴标签 plt.ylabel(\'平均温度\') #选择标签角度 plt.xticks(rotation = 90) plt.show()
#计算天气情况占比 ds = datas.groupby(\'天气情况\').size() values = list(ds.values)#天气情况 labels = list(ds.index)#个数 #绘制饼图 plt.figure() plt.pie(values,labels=labels,autopct=\'%1.1f%%\',shadow=False,startangle=150) plt.show()
结论
1、6月份泉州的天气基本上都在23度以上,最低气温是在6-5和6-7,最高气温在6-18和6-20 ;
2、泉州6月份的天气以阴天-多云为主,其次接近50%的时间是在下雨的;
反思与总结
1、本次实验爬取天气的时候,发现需要的数据并不是直接在网页源码里面的,所以百度查找了一些资料发现,浏览器的F12可以帮助抓到真实的链接地址,来获取数据;
2、抓取得到的数据链接中的数据格式不是常规网页的格式,所以使用正则表达式来提取数据;
3、使用python来爬取和分析数据还是很方便的,深刻感受到了python的强大之处,来培养了这方面的兴趣。