iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
5
Software Development

Python 程式交易 30 天新手入門系列 第 3

Day-03 資料蒐集:取得加權指數成分股暨市值比重資料

安裝所需套件

使用 pip 安裝

# 輸出紀錄
pip install loguru

# HTTP / HTTPS
pip install requests

# 字元編碼判斷
pip install chardet

輸出紀錄

在 Python 程式開發或後續執行過程中,開發者經常會使用 print 輸出紀錄,但這樣容易在大量紀錄輸出時,受限於 Terminal 的緩衝空間大小,難以保存完整記錄,從而忽略錯誤及問題關聯性。因此筆者推薦使用 loguru 套件輸出 log,美觀且方便。

設定紀錄輸出規則

import datetime

import loguru

# 設定程式記錄除了輸出到 Terminal,還要輸出到紀錄檔案
# 輸出檔案規則
# [1] 一天保存一份紀錄檔案
# [2] 清除超過七天以上的紀錄檔案
# [3] 保存權重在 DEBUG 以上的紀錄
loguru.logger.add(
    f'{datetime.date.today():%Y%m%d}.log',
    rotation='1 day',
    retention='7 days',
    level='DEBUG'
)

使用紀錄輸出函式

# TRACE
# 權重 5
loguru.logger.trace('<message>')

# DEBUG
# 權重 10
loguru.logger.debug('<message>')

# INFO
# 權重 20
loguru.logger.info('<message>')

# SUCCESS
# 權重 25
loguru.logger.success('<message>')

# WARNING
# 權重 30
loguru.logger.warning('<message>')

# ERROR
# 權重 40
loguru.logger.error('<message>')

# CRITICAL
# 權重 50
loguru.logger.critical('<message>')

在 Terminal 和紀錄檔都是以如下格式輸出資料(在 Terminal 中支援標色輸出)
2019-09-03 14:06:37.347 | INFO     | main:main:302 - predict.main: 13:30 成交價 10557.03

下載資料

以取得加權指數成分股暨市值比重資料為例。

發出要求並取得回應

import datetime

import loguru
import requests

def main():
    # 下載加權指數成分股暨市值比重資料網頁
    resp = requests.get('https://www.taifex.com.tw/cht/9/futuresQADetail')
    # 從 HTTP / HTTPS 回應狀態碼判斷是否下載成功
    if resp.status_code != 200:
        loguru.logger.error('RESP: status code is not 200')
    # 執行到這裡,resp 裡存放的就是 HTTPS 回應,裡面包含回應的標頭和內容主體等資訊
    loguru.logger.success('RESP: success')

if __name__ == '__main__':
    loguru.logger.add(
        f'{datetime.date.today():%Y%m%d}.log',
        rotation='1 day',
        retention='7 days',
        level='DEBUG'
    )
    main()

進行資料編碼判斷

因為政府機關不少系統還停留在早年的字集 BIG5,甚至有延伸字集 BIG5-HKSCS,所以下載來自於政府機關網頁的文字資料時,都建議對內容進行編碼判斷,避免解讀出現亂碼。

import datetime

import chardet
import loguru
import requests

def main():
    resp = requests.get('https://www.taifex.com.tw/cht/9/futuresQADetail')
    if resp.status_code != 200:
        loguru.logger.error('RESP: status code is not 200')
    loguru.logger.success('RESP: success')

    txt = None
    # 對 HTTP / HTTPS 回應的二進位原始內容進行編碼判斷
    det = chardet.detect(resp.content)
    # 捕捉編碼轉換例外錯誤
    try:
        # 若判斷結果信心度超過 0.5
        if det['confidence'] > 0.5:
            # 若編碼判斷是 BIG5
            if det['encoding'] == 'big-5':
                # 因 Python 的 BIG5 編碼標示為 big5,
                # 而非 chardet 回傳的 big-5,故需另外處理
                txt = resp.content.decode('big5')
            else:
                txt = resp.content.decode(det['encoding'])
        else:
            # 若判斷信心度不足,則嘗試使用 UTF-8 解碼
            txt = resp.content.decode('utf-8')
    except Exception as e:
        # 解碼失敗
        loguru.logger.error(e)

    # 解碼失敗無法取得有效文字內容資料
    if txt is None:
        return

    loguru.logger.info(txt)

if __name__ == '__main__':
    loguru.logger.add(
        f'{datetime.date.today():%Y%m%d}.log',
        rotation='1 day',
        retention='7 days',
        level='DEBUG'
    )
    main()

執行結果

Would You Like To Know More?

https://loguru.readthedocs.io/en/stable/api/logger.html
https://2.python-requests.org/
https://chardet.readthedocs.io/


團隊系列文:

CSScoke - 金魚都能懂的這個網頁畫面怎麼切 - 金魚都能懂了你還怕學不會嗎
Clarence - LINE bot 好好玩 30 天玩轉 LINE API
Hina Hina - 陣列大亂鬥
King Tzeng - IoT沒那麼難!新手用JavaScript入門做自己的玩具
Vita Ora - 好 Js 不學嗎 !? JavaScript 入門中的入門。
TaTaMo - 用Python開發的網頁不能放到Github上?Lektor說可以!!


上一篇
Day-02 程式交易:資料源的重要性
下一篇
Day-04 資料蒐集:解析 HTML
系列文
Python 程式交易 30 天新手入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言