2021年1月24日 星期日

【python抓爬仔】~~小試pandas模組~用pandas簡單完成擷取台銀牌告匯率資料

 之前介紹過:[python抓爬仔]~~輕鬆擷取「台灣銀行即時匯率資料」

使用「twder」這支lib就可以輕鬆抓取台銀的即時牌告匯率資訊。

但這件事情到底是怎麼完成的呢??? 

這次~~練習、利用python中pandas這之強悍的套件,來練習一下自行抓取、分析台銀牌告匯率資料的方式,順道瞭解pandas的相關應用!

首先~~簡單認識一下:「pandas」是 Python 進行資料處理和資料分析一個好用的工具

有興趣可以到這裡去深入認識「pandas」

話說「pandas」有多強悍呢~~光是他的說明文件就有3000多頁....天啊~是要害死誰啊


好~~所以囉,別期望一次就把pandas掌握住...

這次我們主要透過抓取台銀網站中的牌告匯率資料,先玩一下已下的相關操作:

1.用pandas抓取網頁中的表格資料

2.使用pandas格式化抓取的表格資料

3.使用pandas將資料儲存至excel檔案

====================================================

好~~從哪著手起呢??

預備動作~當然先確認你已經裝好pandas這支套件囉

動作:pip install pandas  (應該很熟悉了吧~有裝過pandas會告訴你,沒裝過會幫你安裝pandas)

接著~~

1.先確認去哪裡抓取「台銀的牌告匯率資料」,別跑錯地方了~~~:

https://rate.bot.com.tw/xrt?Lang=zh-TW


2.查看一下,在台銀的網站中,牌告匯率表格是該網頁中第幾個「表格」!這個資訊,有助於等一下在設計程式時,指定(告知)pandas要抓取的資料位置(重要喔)。查看該網頁,我們初步確認「牌告匯率」資料位於該網頁中「第一組」表格的位置。

有了相關上述相關資訊後,就可以開始上程式碼了~~~很簡短的,別擔心

import pandas

# 指定pandas要抓取資料的網址
pds = pandas.read_html("https://rate.bot.com.tw/xrt?Lang=zh-TW")
table = pds[0]      # 解析抓取資料中「第一組」表格資料存放至變數中
table = table.iloc[:, 0:5]      # 重設要使用的表格資料
# table.iloc[:, 0:5]~表示要取用[前四個欄位]的[所有資料]

# table.columns~設定表格的欄位名稱
table.columns = ['幣別', '現金買入', '現金賣出', '即期買入', '即期賣出']
# 將表格中的幣別,以正則表達式(regular expression)重設只讀取中文幣別名稱
table['幣別'] = table['幣別'].str.extract('(\w+)')

# 完工~~列印抓取到的牌告匯率表格化資料
print(table)

# 將上述格式化的表格資料儲存成excel格式檔案
table.to_excel('twder.xlsx')

基本上~~就是這麼簡單、扼要就完成了資料抓取、表格化等相關工作!

【簡單玩python】~~使用 jieba 中文斷詞系統,輕鬆進行文章詞語分析

 假如今天你想要對一段文句或是文章內容進行中文詞語的分析與統計,做出類似「文字雲」的效果,要怎麼做呢?

個人簡略分析如下:

1.首先將文字(章)內容抓取下來

2.分析(分解)其中的詞語

3.統計每個詞語的使用頻率

然後...........思考如何美美的呈現囉

這其中最重要的核心關鍵,就在於如何進行詞語的分析工作,當然這也是分析自然語言的基礎啦~~不過目前先不管博大精深的這塊啦!

好~~所以這次我們就要來練習一下:中文的詞語分析及使用頻率統計

使用python要完成以上目標,有多簡單、便捷呢~~底下就紀錄、分享供參囉!

要完成這次的中文分詞(斷詞)工作,我們可以使用這組強大的中文斷詞工具:jieba(結巴?)

同樣的~~我們先上完整程式碼,再做說明吧!

編輯前,記得先將「jieba」安裝起來:pip install jieba

# 使用 jieba 中文分詞程式
import jieba

# jieba.load_userdict('userdict.txt')   # 可視需要引入自定義詞語庫
text = "Ubuntu是以桌面應用為主的Linux發行版," \
       "相當受到Linux使用者歡迎!" \
       "PyCharm是相當容易上手且功能強大、" \
       "實用的python IDE工具,可安裝在各種主要作業系統平台" \
       "在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!" \
       "安裝Ubuntu最新的LTS版本:20.04版後," \
       "即會預設安裝、更新至Python3.8的開發環境,相當方便!" \
       "但一切安裝完成後,便會發現在Ubuntu下" \
       "執行PyCharm編輯python程式時,會發現以下「怪怪」的情形"

w_dic = {}

words = jieba.cut(text)   # 呼叫jieba函式進行斷詞作業

### 逐詞建立 字詞:使用次數 字典檔
for w in words:
    if w not in w_dic:   # 若未出現過的字詞則建立新的字詞並設定使用次數為1
        w_dic[w] = 1
    else:
        w_dic[w] += 1

### 將大於二個字元的字詞及使用次數顯示出來查閱
for w in w_dic:
    if len(w) >= 2:
        print(w, w_dic[w])

程式說明部分,大部分在程式碼中都有做備註說明了!!所以也不用囉嗦佔篇幅~~~

執行結果如下:

以下只針對比較特殊的部分做一些心得分享:

1.由於jieba是由大陸團隊建置的,所以部分詞語可能會不夠精準,若想要(或避免)詞語上的誤判,可以將一些重要或常用的詞語建立在自定義的詞語庫檔案(如:userdict.txt)[記得該檔案須以utf-8編碼儲存]。引用自定義詞語庫方式,如程式碼第四行!(記得去除標記的 # 號喔)

2021年1月20日 星期三

解決Ubuntu下PyCharm無法正常輸入中文的困境

Ubuntu是以桌面應用為主的Linux發行版,相當受到Linux使用者歡迎!

PyCharm是相當容易上手且功能強大、實用的python IDE工具,可安裝在各種主要作業系統平台,在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!

安裝Ubuntu最新的LTS版本:20.04版後,即會預設安裝、更新至Python3.8的開發環境,相當方便!

但一切安裝完成後,便會發現在Ubuntu下執行PyCharm編輯python程式時,會發現以下「怪怪」的情形:

1.Ubuntu下「新酷音」的中、英文切換(shift鍵)功能失效

2.中文輸入產生錯亂~~無法正常運作

由於僅發生在PyCharm情形,在其他應用程式中,中文輸入及操作正常!所以可以判斷為是PyCharm的相關設定問題。

查了一些網路上的資訊,各有說法~~一番操作之下,將自己覺得最單純、便捷的方法,紀錄、分享一下,供有興趣、需要的朋友參考囉!

先總結一下:就是去選用、更新PyCharm的「JetBrains Runtime」。

具體的作法及步驟如下:

預備動作:先去下載適用的「JetBrains Runtime(JBR)」檔案:

到下載網址:https://confluence.jetbrains.com/pages/viewpage.action?pageId=173178989

下載適用系統版本的JBRSDK檔,下載下來的是.gz的壓縮檔,無須先行解壓縮


以下皆為PyCharm中的操作及設定:

1.安裝「choose runtime」的plugin:

點選「File」→「Settings...」


進入Piugins頁面,在搜尋框中輸入:choose runtime找到該plugin點選「install」安裝完成後,「ok」退出設定頁面。


2.呼叫「Choose Runtime」選用、並安裝之前下載的JBRSDK壓縮檔:

2021年1月17日 星期日

[python抓爬仔]~~如何一次把整個月份的Google Doodle(Google塗鴉)全部抓取下來

 Google塗鴉(英語:Google Doodle)是Google為慶祝節日、紀念日、成就以及紀念傑出人物等而對Google首頁商標的一種特殊的臨時變更。

這些Google Doodle的設計通常都很吸引人,也相當有創意~很值得收藏細細品嘗啊!

這次,延續之前談的【簡單玩python】~~如何下載指定的網路圖片(資料),進一步結合對Google Doodle網站的分析,來實作如何一次將整個月份的Google Doodle圖檔全部下載下來!

通常要實作這類抓取網站資料的操作,都必須要先「分析」一下,該網站是怎麼將資料(圖檔)傳送到你的瀏覽器讓你看到相關的資訊!

由於每個網站的設計不盡相同,對於資訊的提供方式(或隱藏方式)也都各異,所以很難講說有甚麼一套標準方式,所以也只能且戰且走~~碰碰運氣了啦~~哈!(💪不知道就承認啦~還掰!)

以Google Doodle的展示頁面來看,可以依下列步驟分析:

1.從「Google首頁」點選「好手氣」進入

2.進入前(或進入後點選「重新整理」),開啟進入「開發人員工具」頁面

3.而後點選進入「Network→XHR」頁面,可以觀察到Google Doodle頁面是以json模式,按月份分別將Google Doodle圖檔資訊傳送。


4.傳送資訊的網址就是類似下列的型式(以2020/12月份,繁體中文資料為例):

https://www.google.com/doodles/json/2020/12?hl=zh_TW

而提供的json格式及內容,也可以在「preview」頁面中加以察看


5.其中對我們這次想要處理的:下載Google Doodle圖檔的操作而言,最重要的就是圖檔網址:「url」這個資料了!

【簡單玩python】~~如何下載指定的網路圖片(資料)

 網路資料擷取中,如何大量或抓取網頁(站)中的圖片,是網路資料擷取常被應用的區塊之一。

而要如何「爬取」網站中的圖檔,這部分涉及到:

1.如何解析網站內容,抓取網戰中的圖檔資訊,這部分涉及到網站的讀取及解析工作。

2.解析出網站中的圖檔資訊後,即可以網站圖檔的url進行圖檔的抓取(下載、儲存)

這次呢~~我們依然先從分解動作中,比較單純的網路圖檔的下載及儲存(也就是上述的第2階段)下手!

瞭解了網路圖檔如何下載儲存後,後面再來介紹如何爬取、解析網站中的圖檔資訊(例如:解析google Doodle的歷史圖檔),二者結合起來之後~~就可以驅動程式去自動抓取指定網站中的所有圖檔了!

好~~這次主要就是針對如何將網路資料(本次以下載圖檔為例)下載到本地端為操作目標。

主要的工具就是python中 urllib.request 的 urlretrieve() 函數

有關  urllib.request 的 urlretrieve() 函數  的詳細說明,可以參考以下網站資料:

https://docs.python.org/3/library/urllib.request.html#module-urllib.request

我們這次就是使用 urllib.request 的 urlretrieve() 函數 來下載、儲存指定的網路圖檔,並使用OpenCV來讀取並顯示下載後的圖檔,作為整個操作的設計目標。

這次示範預設要下載的圖檔是google Doodle 網站中的:

https://www.google.com/doodles/first-day-of-school-2021-january-04

圖檔位址:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

好囉~~~上程式碼囉:

# 抓取指定網路圖片的方法
from urllib.request import urlretrieve
import cv2

# 網路圖片url
img_url = 'https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png'
fpath = "imgs/"+img_url.split("/")[-1]      # 設定儲存位置並以網路圖檔名稱為儲存檔名
urlretrieve(img_url, fpath)     # 將遠端(網路)資料下載到本地

r_img = cv2.imread(fpath)   # cv2讀取下載的圖檔
cv2.imshow("Net ImageUrl", r_img)   # 以cv2呈現讀取的圖檔

cv2.waitKey(0)
cv2.destroyAllWindows()

程式執行後,就可以看到呈現下載的圖檔視窗,並在指定的路徑中看到下載的圖檔囉!

2021年1月14日 星期四

【簡單玩python】~~使用「dlib」讓python簡單、快速完成人臉辨識

 人臉辨識一直是號稱AI應用的熱門(入門)議題~~尤其是幾年前微軟的用照片辨識年紀的推波助瀾下,大家更是樂此不疲~~呵!

既然如此~~那就也玩玩看如何用python來達成人臉辨識及標記的目標吧!

其實這塊之前就結合OpenCV跟dlib這組套件,並串接雲端微軟的年齡、情緒辨識技術,一起玩過整套的~~不過之前沒有記錄下來,時間久了~~也容易忘掉,所以,這次就納入自己整理、分享的議題之一!只是一開始,還是一樣~~先拆解從簡單的應用入手介紹,後續再依序加入其他整合性的應用!

要達成人臉辨識的目標,我們可以借助「dlib」這支相當成熟、易用的套件,結合OpenCV來著手設計!

首先在Windows系統上,要安裝「dlib」套件時,為避免缺乏CMAKE導致安裝失敗的窘境,建議安裝時直接指定「dlib」套件版本

安裝「dlib」:pip install dlib==19.8.1(個人在win10上可正常安裝無誤)

當然別忘了安裝OpenCV這支影像視覺處理的強大套件:

pip install opencv-python

安裝完成後,就可以開始進行程式設計的部分了~~~

好囉~~又到了直接上程式碼的步驟了:

import dlib
import cv2

# 讀取照片檔
img = cv2.imread('imgs/faceo8.jpg')

# 呼叫 dlib 人臉偵測器
fd = dlib.get_frontal_face_detector()

# 偵測圖檔上的人臉資訊
fs = fd(img, 0)
print(f"偵測到{len(fs)}組人臉資訊")

# 將偵測結果以序列方式取出
for i, f in enumerate(fs):
    x1 = f.left()
    y1 = f.top()
    x2 = f.right()
    y2 = f.bottom()

    # 以上列四點數據,繪製人臉區域綠色矩形框
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 顯示結果
cv2.imshow("Face", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

相關程式碼的說明,都標註在其中了!

所以也就不必再贅敘了~~~

執行程式結果如下:

其中最重要的當然就是:第8行~呼叫dlib的人臉偵測函式的部分囉!

fd = dlib.get_frontal_face_detector()

好囉~~這次人臉偵測標示的紀錄就到這告一段落了!

dlib還有個相當強悍的人臉68個特徵偵測標示的訓練模型可供應用,後續再紀錄、分享上來囉!