跳到主要內容

發表文章

[2021 IT鐵人賽] Day 27:專案07 - 天氣小助理01 | 氣象資料API

圖片來源: https://www.epochtimes.com/b5/18/1/5/n10026856.htm 我先來講個故事吧~ 故事的主角小明,今年30歲單身,一個人住在租的套房裡,每天工作加班累的半死,回家馬上倒頭就睡,隔天早上起來又急急忙忙出門上班了,根本沒有時間看明天的天氣預報。 一直以來都沒有什麼問題,直到某一天發生一件不幸的事,小明下班時外面下著大雨,自己也沒有帶傘,一查才發現原來今天的下雨機率高達90%!! 小明此時覺得很氣惱,心想:如果有人可以在出門前提醒我帶傘就好了…。 於是他將煩惱告訴了他的好友,也就是你,身為工程師的你很同情他,沒有女朋友已經很可憐了,竟然還要淋雨回家,因此你決定寫一個程式來幫助小明!! 專案構想 小明的需求是每天早上出門前自動通知天氣資訊,因此專案的架構會長這樣:每天早上6點執行Python程式,由程式取得氣象資料後,經過一些處理後,再推送訊息給小明。那因為LINE是我們很常用的通訊軟體,所以就使用LINE Notify推送訊息給小明,如此一來小明只要早上看LINE就知道今天的天氣資訊了! 氣象資料API 首先,專案最重要的東西就是氣象資料,而且要每天更新,又有涵蓋很多地區。好消息是,中央氣象局提供的氣象資料API就有這些特點,我們就是要使用這個。 打開 中央氣象局氣象資訊API文件 ,底下列出非常多API,而我們要用的是第一個(一般天氣預報-今明 36 小時天氣預報)。 點開後,可以看到API的所有參數,其中「Authorization」這一項是 必填 的,這是開放資料平台會員的授權碼,要有這個授權碼才能使用API,接著就要來講怎麼取得這個授權碼。 會員授權碼 先到 中央氣象局網站 註冊一個新會員,點擊「加入會員」,填寫一些基本資料後就可以成為會員了,請記住自己的帳號密碼。 再來到 氣象開放資料平台 ,登入你剛才註冊的帳號。 ...

[2021 IT鐵人賽] Day 26:專案06 - 股市趨勢圖03 | Matplotlib、Pandas繪圖

圖片來源: https://unsplash.com/photos/mcAUHlGirVs 前兩天已經將各股日成交資料存成 .csv 檔了,接著就來利用這些資料繪製出趨勢圖吧~ 匯入Pandas 還記得前天我們將Pandas的DataFrame匯出成csv只靠一個函數嗎? 現在反過來將csv匯入成DataFrame一樣也只需要一個函數哦! 是不是超好用呢😎 試著將前天匯出的三種檔案 .csv 、 .xlsx 、 .html 都匯入成DataFrame看看。匯入的參數大致上和匯出一樣,頂多就編碼要注意一下。 import pandas as pd # 讀取csv df1 = pd.read_csv( "./month_stock.csv" , encoding= "big5" ) print (df1) # 讀取excel df2 = pd.read_excel( "./month_stock.xlsx" ) print (df2) # 讀取html df3 = pd.read_html( "./month_stock.html" , encoding= "utf8" ) print (df3) 既然可以匯入csv了,就可以用前天儲存的csv檔繪製趨勢圖了! 繪製趨勢圖我會介紹兩種方法: Matplotlib 和 Pandas 。 Matplotlib繪圖 Matplotlib 是Python繪製數據圖的套件,待會就要用這個套件將股價繪製成趨勢圖。 Anaconda已經有 matplotlib套件 了,沒有的話一樣用pip下載。 pip install matplotlib 載完後就引進你的專案中,但因為matplotlib太長了,通常會減寫成 plt 。 import matplotlib.pyplot as plt 再來,篩選出畫趨勢圖需要的資料,要 日期 、 最高價 、 ...

[2021 IT鐵人賽] Day 25:專案06 - 股市趨勢圖02 | 整年股市資料、Postman

複習一下昨天的進度 - 我們取得單月的個股日成交價的資料,並在電腦中儲存成csv檔。 目前都只有單月的個股日成交價,但如果想要一整年的個股日成交價時,該怎麼辦呢? 可惜的是,台灣證券交易所並沒有提供一整年的個股日成交價API,不過沒關係,既然沒有一整年的,我們自己將某一年1月到12月的資料合併起來不就是一整年了嗎? 第一步就來觀察API的參數,不過在那之前,我先推薦一個測試API時很方便的工具 - Postman 。 Postman Postman 是一套專門在測試API的軟體,輸入API的URL和參數後送出,就會回傳API的資料回來,並幫你整理成比較好看的樣子,除了GET之外,也有POST等其他方法可以使用,堪稱 測試API的神器 ! Postman目前有 網頁版 跟 電腦版 ,偶爾測試的話網頁版就夠用了,但如果想要更進階的功能,可能就要考慮載電腦版。我這次先用網頁版做示範。 到Postman官網,註冊一個新帳號。 登入後,點左上角「Workspace」,建立一個新的Workspace,如果已經有Workspace了,也可以直接進入下面的清單中的Workspace。 進入Workspace後,點「+」符號新增request。 將昨天API的網址貼上去,就會發現底下將參數都列出來了。確認參數無誤,方法選擇GET後按「Send」送出。 送出後底下就會出現response,選擇「Pretty」可以讓回傳的JSON資料比較好閱讀。檢查資料是否正確。 要改變參數也很簡單,直接改參數欄位中的值就好了。比方說,date改成20210701,再次送出後,得到的就是7月的資料了。 不管在改參數還是檢視資料都勝過在VScode上操作,所以才說是測試API神器阿! 補充:更扯的功能,左邊有個「 </...

[2021 IT鐵人賽] Day 24:專案06 - 股市趨勢圖01 | 單月股市API、Pandas

各位早安,今天是第24天,但其實爬蟲的技巧大致上已經教得差不多了,而且我猜會看我的文章的人,應該都想知道爬蟲還可以做哪些應用吧,所以我想鐵人賽的最後幾天,就來做點有趣的專案,順便介紹一些方便的工具給各位~ 說到爬蟲,股市價格幾乎是最常見的應用了,雖然爬蟲可以幫你省下很多時間,但抓下來的資料往往是一大堆數字,讓人看得頭昏眼花,這時如果將資料畫成圖表的話,股價的趨勢就可以一目瞭然了。 那麼,我們就來 繪製股市趨勢圖 吧! 圖片來源: https://unsplash.com/photos/fiXLQXAhCfk 台灣證券交易所API 首先,資料來源是 台灣證券交易所 的 個股日成交資訊 ,選擇年份月份和股票代碼後按查詢,底下就會出現該股票當月的成交資訊了。我們發現載入時網站並沒有重新刷新,所以這應該也和昨天的KKBOX一樣,用AJAX技術載入資料。 打開 F12>>Network 並重新查詢一次,果不其然被我們找到傳遞資料的API了,名稱為 STOCK_DAY?response=json... 。 小訣竅: 在尋找API時,只篩選 Fetch/XHR ,可以大幅縮減要尋找的範圍。 其實這個API的參數很單純, date 表示某年月份的股市資料, stockNo 則表示股票代碼。 因為9月還沒過完,為了資料的完整性,我就挑2021年8月作為例子,股票代碼就隨便挑一個 元大台灣50(0050)。 跟昨天一樣抓取資料: # 台灣證券交易所,個股日成交資訊 url = "https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20210801&stockNo=0050" # 取得股票資料json字串 response = requests.get(url) print (response.text) 日期至少要在當月之...

[2021 IT鐵人賽] Day 23:專案05 - KKBOX風雲榜02 | AJAX

昨天已經找到的KKBOX用來傳資料的API,也知道各個參數的意義了,今天就實際將資料抓下來吧! 歌曲資訊 回到昨天那個API,是用JSON格式傳遞資料,資料的格式大致如下: 我們可以發現新歌的資料都放在 “newrelease” 之下,一個element就是一首歌的資訊,另外,每首歌的資訊也以key:value的形式整理的很清楚。 接著,就用之前教過的 requests.get(url) 直接取得API回傳的資料,但回傳的型態是json字串,所以再用Python本身內建的 json.loads() 函數轉成Python的list和dict資料型態。 # KKBOX華語新歌日榜 url = "https://kma.kkbox.com/charts/api/v1/daily?category=297&lang=tc&limit=50&terr=tw&type=newrelease" # 取得歌曲資訊json檔 response = requests.get(url) # 將json字串轉為Python的字典型態 data = json.loads(response.text) 既然已經轉成list和dict的型態了,再根據剛才觀察API得知的架構,要篩選資料就非常簡單,直接來看程式碼: song_list = data[ "data" ][ "charts" ][ "newrelease" ] # 取得每首歌的排名、曲名、連結、作者、時間 for song in song_list: song_rank = song[ "rankings" ][ "this_period" ] song_name = song[ "song_name" ] song_url = song[ "song_url" ] song_artist = song[ "artist_name"...

[2021 IT鐵人賽] Day 22:專案05 - KKBOX風雲榜01 | AJAX

歐嗨喲~ 大家昨天有睡飽嗎? 今天又是一個新的專案,當然一樣是爬蟲,但是我完全不用BeautifulSoup一樣可以取得資料,這是怎麼做到的? 好奇嗎? 就讓我們看下去吧! KKBOX 華語新歌日榜 今天要來爬的是KKBOX的 華語新歌日榜 ,可以看到這個網站底下列出了當天新歌的排行榜。 你心中一定想說:「反正你一定又是叫我 右鍵>>檢查 對不對?」 NONONO~ 要是這麼簡單就不用我教了,不信你可以試試看直接用requests抓,看看抓不抓的到。 url = "https://kma.kkbox.com/charts/daily/newrelease?terr=tw&lang=tc" response = requests.get(url) root = BeautifulSoup(response.text, "html.parser" ) print (root.prettify()) 的確會有回應,但你會發現你不管怎麼找,都找不到你要的資料。這是為什麼呢🤔 ? 答案其實前天就講過了,只是我沒說出來而已。沒錯,KKBOX也是一個 動態網站 ,他用的是名叫 AJAX 的技術。 什麼是AJAX? AJAX 即「 Asynchronous JavaScript and XML 」(非同步的JavaScript與XML技術),指的是一套綜合了多項技術的瀏覽器端網頁開發技術。 傳統的Web應用允許使用者端填寫表單(form),當送出表單時就向網頁伺服器傳送一個請求。伺服器接收並處理傳來的表單,然後送回一個新的網頁,但這個做法浪費了許多頻寬,因為在前後兩個頁面中的大部分HTML碼往往是相同的。由於每次應用的溝通都需要向伺服器傳送請求,應用的回應時間依賴於伺服器的回應時間。這導致了使用者介面的回應比本機應用慢得多。 與此不同,AJAX應用可以僅向伺服器傳送並取回必須的資料,並在客戶端採...

[2021 IT鐵人賽] Day 21:專案04 - Facebook爬蟲02 | Selenium

昨天結束在Facebook登入之後,今天就接續昨天的內容,以 木棉花的粉絲專頁 為例,來講怎麼爬下來貼文的內容吧! 進到木棉花粉專 time.sleep( 5 ) # 進入木棉花專頁 driver.get( "https://www.facebook.com/emuse.com.tw" ) time.sleep( 5 ) 其實就跟昨天一樣,使用 get() 函數進到木棉花的粉專。 time.sleep() 設定延遲是為了讓Facebook有處理資料的時間,這點在使用Selenium時很重要,如果你都不給延遲時間,就有可能因為資料還沒載入而出錯。 模擬滾輪下滑 昨天已經講過了Facebook必須往下滑動才會載入資料,所以現在就要讓Selenium模擬出使用者滑鼠往下滑動的行為。 # 往下滑3次,讓Facebook載入文章內容 for x in range ( 3 ): driver.execute_script( "window.scrollTo(0,document.body.scrollHeight)" ) print ( "scroll" ) time.sleep( 5 ) 這邊是讓Selenium執行JavaScript的程式,雖然我沒有講過JavaScript,但你只要知道這段程式就是控制瀏覽器向下滑1頁。而且每次下滑後都要給一點延遲時間載入資料。 擷取貼文內容 接下來,我們對貼文 右鍵>>檢查 ,發現到內容放在一個 class="kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x c1et5uql ii04i59q" 的 <div> 中。 再往下看,每一行文字都是放在 dir="auto" 的 <div> 中。 好,那麼程式碼就是這樣。 # 定位文章標題 titles = soup.find_all( "div...