Skip to content

台灣期貨指數即時報價 - 使用 BeautifulSoup4

Published: 2 分鐘

原本只是為了作為 《我.影化身》 的範例, 嚐試使用 BeautifulSoup 來擷取「台灣期貨交易所」提供的報價網頁內容, 在過程中,覺得 Python 使用在網頁擷取(web scraping)真的是一大亮點!

本文並不是 BeautifulSoup 的教學文章,目的僅在分享一個快速有效的方法來取得期貨報價。

資料來源

這個腳本的資料來自此網頁:http://info512.taifex.com.tw/Future/FusaQuote_Norl.aspx ,資料更新 5 秒鐘,與實際的價格時間差不清楚,但作為價格監控的目的已經夠用。

程式腳本

擷取網頁內容需要根據內容結構來實驗跟調整選擇條件, BeautifulSoup 提供許多高階簡單的方法可以過濾跟查詢 網頁元素,搭配 IPython 這種互動式介面,就可以得到一個快速有效(quick and dirty)的腳本:

# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals

import urllib2
import time
from datetime import datetime
from bs4 import BeautifulSoup

TXF_NAME = u'臺指現'
TE_NAME = u'電子現'
TF_NAME = u'金融現'

targets = set()
targets.add(TXF_NAME)
targets.add(TE_NAME)
targets.add(TF_NAME)

quotes = dict()

url = 'http://info512.taifex.com.tw/Future/FusaQuote_Norl.aspx'


class Quote(object):

    def __init__(self):
        self.name = None
        self.trade_time = None
        self.trade_price = None
        self.change = None
        self.open = None
        self.high = None
        self.low = None

    def __str__(self):
        res = list()

        res.append(self.name)
        res.append(self.trade_time.strftime("%H:%M:%S"))
        res.append(self.trade_price)
        res.append(self.change)
        res.append(self.open)
        res.append(self.high)
        res.append(self.low)
        return str(res)

while True:

    # 應該要限制在有交易的時間內執行,但為了示範起見,使用無窮迴圈。

    html_data = urllib2.urlopen(url).read()
    soup = BeautifulSoup(html_data, 'html.parser')

    rows = soup.find_all('tr', {"class": "custDataGridRow", "bgcolor": "White"})

    for row in rows:
        # print(row)

        items = row.find_all('td')
        name = items[0].a.text.strip()
        if name in targets:
            quote = Quote()
            quote.name = name
            quote.trade_price = float(items[6].font.text.replace(',', ''))
            quote.change = float(items[7].font.text)
            quote.trade_time = datetime.strptime(items[14].font.text, "%H:%M:%S")
            quote.open = float(items[10].font.text.replace(',', ''))
            quote.high = float(items[11].font.text.replace(',', ''))
            quote.low = float(items[12].font.text.replace(',', ''))

            quotes[name] = quote
            print(quote)

    # 根據取得的報價判斷條件,條件自訂。

    # 條件符合時通知使用者,如何通知?

    time.sleep(5)

您可以看出來程式幾乎沒有做任何錯誤檢查與處理,對於一個隨時會失效的腳本似乎也不太需要。

免責聲明

山姆鍋不對此程式的正確性與即時性做任何保證,原始網頁結構的任何更動都可能讓此腳本無法正常運作, 山姆鍋不負責您基於此程式的報價交易所造成的任何損失。

結語

有了一個能夠自動即時監控期貨報價的程式腳本,當有符合條件的情形發生時要怎麼辦?撇開自動交易這種專業訴求不談, 通知使用者應該是最基本的功能了。需要一個可以在背景幫您做客製化即時監控,可以通知重要事件的軟體? 這剛好是山姆鍋開發 《我.影化身》 這個開源專案的主要動機。

郭信義 (Sam Kuo)

奔騰網路科技技術長,專長分散式系統、Web 應用與雲端服務架構、設計、開發、部署與維運。工作之餘,喜歡關注自由軟體的發展與應用,偶爾寫一下部落格文章。

你可能會有興趣的文章