Python爬蟲入門教程 53-100 Python3爬蟲獲取三亞天氣做旅遊參照

夢想橡皮擦發表於2019-03-21

爬取背景

這套課程雖然叫爬蟲入門類課程,但是裡面涉及到的點是非常多,十分檢驗你的基礎掌握的牢固程度,程式碼中的很多地方都是可以細細品味的。

為什麼要寫這麼一個小東東呢,因為我生活在大河北,那霧霾醇厚的很,去了趟三亞,那空氣,嘖嘖,舒服的很,所以爬取一下三亞天氣,看看什麼時候去最好,理想的溫度為24~28,呵呵噠

程式碼走起來 ,天氣類的網址多的很,重點關注歷史天氣 找到這麼一個網站 www.tianqi.com/sanya/

python3爬蟲入門教程
發現入口,哈哈,有機會爬取到

程式碼走起來,爬蟲套路上吧

簡單的requests,複雜的scrapy 總有一款適合你的

哇哦~從2011年到2019年都有唉

python爬蟲入門教程
月份點進去,呈現了大概這些資訊,最高氣溫,最低氣溫,天氣,風向,風力,好了資料都有了 lishi.tianqi.com/sanya/20110…
python爬蟲入門教程
到這個地方不著急,慢慢來,一個天天寫爬蟲的人必須要對URL敏感,一看就嗨,小時候喜歡找規律的人長大都能寫爬蟲

URL 是這樣子的 lishi.tianqi.com/sanya/20111… lishi.tianqi.com/sanya/20110… lishi.tianqi.com/sanya/20110… lishi.tianqi.com/sanya/20110…

lishi.tianqi.com/[三亞的拼音]/年月.…

OK,這就簡單了,走起,看起來就簡單,那我就使用pyspider了 ,好久沒有,都有點遺忘了呢 怎麼執行呢?

python3爬蟲教程

一頓操作,資料就下載到了

沒有特別複雜的地方,基本就屬於常規操作了

    def __init__(self):
        self._city = "sanya"
    
    def get_date_list(self,begin,end):
        date_list = [x.strftime("%Y%m") for x in list(pd.date_range(start=begin,end=end,freq="M"))]
        return date_list
    
    @every(minutes=24 * 60)
    def on_start(self):
        # 我需要生成201101~201812的所有連結
        date_list = self.get_date_list("2011-01-01","2019-01-01")
        for item in date_list:     
            self.crawl('http://lishi.tianqi.com/%s/%s.html' %(self._city,item) , callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        items = []
        for each in response.doc('.tqtongji2 > ul:not(.t1)').items():
            date = each("li:eq(0)").text()
            hot = each("li:eq(1)").text()
            cold =  each("li:eq(2)").text()
            weather = each("li:eq(3)").text()
            wind_direction = each("li:eq(4)").text()
            wind_power = each("li:eq(5)").text()
            
            
            item = {
                "date":date,
                "hot":hot,
                "cold":cold,
                "weather":weather,
                "wind_direction":wind_direction,
                "wind_power":wind_power}
            items.append(item)
        
        return items

複製程式碼

基本資料分析

首先看一下資料的基本面

python3爬蟲入門教程

  • 75% 都是26度的天氣,很舒服
  • 都發現了異常資料,例如最低氣溫最小的竟然為0,最高氣溫為13,不合理
  • 最熱竟然是37度,還不如我大河北溫度,奇怪了?

excel 讀取

def read_xlsx():
    df = pd.read_excel("天氣資料.xlsx",names =["cold","date","hot","weather","wind","wind_s"])
    return df
複製程式碼

我要知道,三亞天氣的一個走勢,這個地方直接按照時間進行圖示製作吧

按照時間排序

df = read_xlsx()
    opt_df = df[['date','cold','hot']]
    opt_df = opt_df.sort_values(by='date')
複製程式碼

可以明顯的看到波峰和波谷,這個地方只能知道三亞的天氣是有波動的,距離我得到最後的結果進了一點點

matplot繪圖
按照單獨的一年繪製,得到一個很混亂的圖,還是沒有得到我想要的結果

    opt_df = opt_df.set_index("date")

    for i in range(2011,2019):
        data = opt_df[str(i)]
        plt.plot(range(1,len(data)+1), data['cold'])
    plt.show()
複製程式碼

每個顏色表示不同的年分,看來還是要用子圖了。

python3爬蟲入門教程
從上到下,我從2011年依次羅列到2018年

    opt_df = opt_df.set_index("date")

    for i in range(2011,2019):
        data = opt_df[str(i)]
        plt.subplot(8,1,i-2010)
        plt.grid(True)
        plt.plot(range(1,len(data)+1), data['cold'])
        plt.plot(range(1, len(data) + 1), data['hot'])
        plt.title(str(i)+u"年,溫度曲線")
        plt.tight_layout()
    plt.savefig("filename.png")
    plt.show()
複製程式碼

一個小的注意事項是:解決使用 plt.savefig 儲存圖片時一片空白

原因

其實產生這個現象的原因很簡單:在 plt.show() 後呼叫了 plt.savefig() ,在 plt.show() 後實際上已經建立了一個新的空白的圖片(座標軸),這時候你再 plt.savefig() 就會儲存這個新生成的空白圖片。

知道了原因,就不難知道解決辦法了,解決辦法有兩種:

在 plt.show() 之前呼叫 plt.savefig();

import matplotlib.pyplot as plt

""" 一些畫圖程式碼 """

plt.savefig("filename.png")
plt.show()
複製程式碼

畫圖的時候獲取當前影象(這一點非常類似於 Matlab 的控制程式碼的概念):

    # gcf: Get Current Figure
    fig = plt.gcf()
    plt.show()
    fig1.savefig('tessstttyyy.png', dpi=100)
複製程式碼

python分析三亞天氣走勢
細細的看了一下,發現好穩定。。。。走勢變化不大,那麼,在去細化,我們拆解2018年的,然後推斷2019年的,這個地方需要的展示12個月份的天氣了,程式碼走起。

    d2018 = opt_df["2018"]
    print(d2018)

    for i in range(1,13):
        data = opt_df["2018-"+str(i)]
        plt.subplot(12, 1, i)
        plt.grid(True)
        plt.plot(range(1, len(data) + 1), data['cold'])
        plt.plot(range(1, len(data) + 1), data['hot'])
        plt.title(str(i) + u"月,溫度曲線")
        plt.yticks([0,5,10,15,20,25,30,35,40])
        plt.xticks(range(1,32))
        plt.tight_layout()
    plt.savefig("filename.png")
    plt.show()
複製程式碼

三亞天氣分析
哈哈,到現在為止,啥也沒看出來
python3爬蟲入門教程
繼續努力,看平均天氣,把2018年每個月的平均天氣整理出來

月份 最低氣溫 最高氣溫
1 20.1 26.1
2 17.6 26.6
3 19.6 29.3
4 22.0 30.7
6 25.2 32.5
7 24.5 31.4
8 24.5 31.8
9 25.2 31.9
10 23.2 31.5
11 21.7 30.2
12 20.4 28.1

哈哈哈,都是好天氣......我到底在做啥結果.....

三亞天氣
受不了,我去百度了,看看天氣網站的結論,emmm....一樣,在我們河北人看來,這就是恆溫的。
python3爬蟲入門教程
我還有的分析,我的資料是這樣子的
python爬蟲入門教程
是否下雨,我可以統計一下,程式碼走起來 全年的天氣

天氣 天數
中雨 15
多雲 176
大雨 5
小雨 5
12
暴雨 1
11
陣雨 38
雷陣雨 6

統計一下每個月的天氣變化

python3爬蟲入門教程
總結,兩個結論,666

  1. 1月,2月,3月,11月,12月基本沒雨
  2. 其他月份有雨

好吧,停止了,好像沒得到啥資料,就是1月,2月,3月,11月,12月去三亞吧,這幾個月份中3月份和11月份機票最便宜,看來我要寫爬取機票的部落格了

python3爬蟲入門教程

相關文章