2345天氣網站泉州6月份天氣爬取分析
一、選課的背景
為什麼要選擇此選題?要達到的資料分析的預期目標是什麼?
2345天氣網站的反爬總體來說不算難,所以資料獲取的難度方面是可實現的。爬取歷史天氣進行分析,可以對某個地區的天氣情況進行探討發現規律,在研究方向來看是有必要去進行的。將所爬取的資料進行平均氣溫計算,繪製歷史平均氣溫折線圖;再對天氣情況進行統計,統計11月份青島各個天氣情況的佔比,繪製餅圖進行展示。
二、主題式網路爬蟲設計方案
1.網路爬蟲名稱:“2345天氣網站泉州6月份天氣爬取分析”。
2.網路爬蟲爬取的內容與資料特徵分析: 爬取2345天氣網站泉州地區的6月份資料,包括:'日期', '星期', '最高氣溫', '最低氣溫', '天氣情況', '風力', '平均氣溫'
3.網路爬蟲設計方案概述:
需多個步驟實現: 使用python的requests庫對網站發起請求,獲取得到網頁資料,然後利用正則表示式提取所需要的資料,存入本地excel中
三、主題頁面的結構特徵分析
資料來源:http://tianqi.2345.com/wea_history/59131.htm
所需頁面程式碼: 我們發現在點選歷史天氣的時候網址並沒有發生變化,對應網頁的原始碼中也沒有我們所需要的資料資訊。 利用chrome瀏覽器的開發者工具(F12),抓包獲取泉州6月份天氣資料的真實所在地址如下:
四、網路爬蟲程式設計
資料爬取及採集:
importrequests 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的強大之處,來培養了這方面的興趣。