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

来源:https://www.cnblogs.com/happymeng/archive/2019/03/21/10569315.html
-Advertisement-
Play Games

爬取背景 這套課程雖然叫爬蟲入門類課程,但是裡面涉及到的點是非常多,十分檢驗你的基礎掌握的牢固程度,代碼中的很多地方都是可以細細品味的。 為什麼要寫這麼一個小東東呢,因為我生活在大河北,那霧霾醇厚的很,去了趟三亞,那空氣,嘖嘖,舒服的很,所以爬取一下三亞天氣,看看什麼時候去最好,理想的溫度為24~2 ...


爬取背景

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

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

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

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

代碼走起來,爬蟲套路上吧

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

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

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

URL 是這樣子的
http://lishi.tianqi.com/sanya/201111.html
http://lishi.tianqi.com/sanya/201102.html
http://lishi.tianqi.com/sanya/201103.html
http://lishi.tianqi.com/sanya/201104.html

http://lishi.tianqi.com/[三亞的拼音]/年月.html

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爬蟲入門教程


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 官網:www.fhadmin.org 此項目為Springboot工作流版本 windows 風格,瀏覽器訪問操作使用,非桌面應用程式。 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁 ...
  • ui->label_6->setText(QString::number(table_test[0]<<8 | table_test[1]));這樣子就可以把十六進位的數轉換為十進位,單片機發過來的串口數據就可以直接顯示在label上了。當時用lcd_numbera顯示不能直接顯示16進值。而且顯示 ...
  • 1. 前言 技術這東西吧,看別人寫的好像很簡單似的,到自己去寫的時候就各種問題,“一看就會,一做就錯”。網上關於實現SSO的文章一大堆,但是當你真的照著寫的時候就會發現根本不是那麼回事兒,簡直讓人抓狂,尤其是對於我這樣的菜鳥。幾經曲折,終於搞定了,決定記錄下來,以便後續查看。先來看一下效果 2. 準 ...
  • 題意 "題目鏈接" Sol $B(x) = \exp(K\ln(A(x)))$ 做完了。。。 複雜度$O(n\log n)$ cpp // luogu judger enable o2 // luogu judger enable o2 include define Pair pair define ...
  • 聲明:此文章非本人所 原創,是別人分享所得,如有知道原作者是誰可以聯繫本人,如有轉載請加上此段話 1、請解釋一下什麼是 Nginx? Nginx是一個 web伺服器和反向代理伺服器,用於 HTTP、HTTPS、SMTP、POP3和 IMAP協議。 2、請列舉 Nginx的一些特性。 Nginx伺服器 ...
  • >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>歡迎轉載,轉載請註明出處-VirgoArt,www.cnblogs.com 一、場景描述: 主項目(Web)部署在Windows下,演算法項目(TensorFlow)部署在Linux環境下。 二、依賴環境(Jar) 三、後端代碼 ...
  • 1.圖片的上傳前臺三個條件 文件上傳頁面的3個要求: < 1.表單提交為post。mothod="post" < 2.表單的提交類型為enctype.必須是多段式。enctype="multipart/form-data" < 3.文件上傳用<input type="file"/>組件 。 2.圖片 ...
  • 說到 Spring Cloud,那肯定要少不了提一下微服務框架,所謂的微服務框架就是把負責的功能拆分成比較小、功能比較單一的服務獨立處理,例如單點登錄服務、支付服務、訂單服務等,當然如果訂單功能比較複雜還可以獨立出更具體的服務。 我在之前的文章中 "我所理解的SOA和微服務" 也提到過微服務的幾個主 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...