2021年5月10日 星期一

【python抓爬仔】~~簡單抓取政府公開資料(新北市UBike即時資訊)來玩玩

 玩抓取資料可以很技術,也可以很生活啊!

現今愈來愈多的政府及機關公開資料可供民眾及系統設計應用,很多都是與民生相關的實用資訊!而且相關資料內容也益加完善,對於有設計及應用需求的人們真是個福音啊!

使用上也相當簡便,這次就以「新北市公共自行車租賃系統(YouBike)」的公開資料為操作範例,來練習玩玩如何簡便的獲取ubike的資時資訊並加以操作。

有關新北市的相關公開資料可以到以下位置查閱!

https://data.ntpc.gov.tw/


https://data.ntpc.gov.tw/openapi/swagger-ui/index.html?configUrl=%2Fopenapi%2Fswagger%2Fconfig&urls.primaryName=%E6%96%B0%E5%8C%97%E5%B8%82%E6%94%BF%E5%BA%9C%E4%BA%A4%E9%80%9A%E5%B1%80(28)


這次的操作練習主要目標是了解如何擷取網路上的公開資料回來加以整理、篩選出自己想要的資訊,並未多加著墨在其他的應用或呈現方式。

好囉~~一樣直接上程式碼吧.......

import requests

# 設定新北市UBike公開資料連結位置(取用json格式資料)
# 設定擷取資料筆數為700筆(目前新北市共有654個站點),若未設定size則每次預設只截取前30筆站點資料
url = 'https://data.ntpc.gov.tw/api/datasets/71Cxxxxx-A2DF-xxxxx-BEF1-xxxxx5E8A/json?size=700'
r = requests.get(url)
data = r.json()


def transform_format(mday):  # 寫個轉換日期顯示格式小函式
    Y, M, D, h, m, s = mday[:4], mday[4:6], mday[6:8], mday[8:10], mday[10:12], mday[12:14]
    return Y + '/' + M + '/' + D + ' ' + h + ':' + m + ':' + s


print('擷取的資料筆數:',len(data))

ui = 0
for u in range(len(data)):  # 逐筆讀取json資料
    if data[u]['sarea'] == '土城區':    # 判斷是否為「土城區」,屬於土城區的資料才呈現
        ui += 1
        data[u]['mday'] = transform_format(data[u]['mday'])  # 轉化「資料更新時間」顯示格式
        print(data[u])

print("「土城區」共有:",ui,"筆資料!")


程式執行結果截圖如下供參:

2021年5月9日 星期日

【簡單玩python】~~整理python中有關檔案(File)的一些常用操作

 有關檔案(目錄)的操作,在程式設計中是常見的需求。

除了對檔案的存取、寫入等相關操作外,對於檔案的查詢、目錄(資料夾)的管理、操作也是重要的議題

這次就來整理一下,python中對於檔案及資料夾的一些重要操作,方便自己日後複習及應用。

好囉~~一樣直接上程式碼!相關語法及功能,可以參考程式碼中的註記。

import os
import time

print(os.getcwd())  # 獲取當前作用(執行)的目錄路徑

if os.path.exists('mkdir_test'):
    print("資料夾已存在,無須建立!")
else:
    os.mkdir('mkdir_test')     # 在當前目錄中建立新資料夾(若目錄已經存在則會出錯)

os.chdir('mkdir_test')  # 切換至指定的資料夾
print(os.getcwd())
os.chdir('../')  # 切換至指定的資料夾
print(os.getcwd())

# os.listdir()將指定目錄(若未指定則為當前作用中之目錄)中的物件都列出
print("資料夾中共有:", len(os.listdir()),"物件")

for f in os.listdir():
    if os.path.isfile(f):   # 檢查是否為檔案
        f_name, f_ext = os.path.splitext(f)  # 將檔案名稱資訊切割檔名及副檔名(類型)
        f_size = os.path.getsize(f)     # 取得檔案大小資訊
        f_time = time.ctime(os.path.getctime(f))
        print("檔名:", f_name, "| 檔案類型:", f_ext[1:], " | 檔案大小:", f_size, "Bytes | 檔案建立時間:", f_time)

# 檔案開啟模式參考網址:https://docs.python.org/zh-tw/3.6/library/functions.html#open
f = open("test1.txt", "a+", encoding='utf-8')  # 若無該檔案會建立,若有則會開啟並可在檔案末尾加上新的內容
str = "\n" + "Hello,歡迎進入Python世界"
fw = f.write(str)
print("本次寫入", fw, "個字元")
f.close()

f1 = open("test1.txt", "r+", encoding='utf-8')  # 讀取並開啟檔案,可在檔案末尾加上新的內容
print(f1.read())
f1.close()

有興趣及相關需求的朋友可以自行操作、執行,會更加了解相關的運作結果喔!

執行結果,部分截圖供參:



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()

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