返回列表 上一主題 發帖

證交所全部上市股票交易明細下載

證交所全部上市股票交易明細下載

花了一些時間以Excel VBA寫了一個下載交易明細Debug version,主要在做時間的優化處理,Release version可能需要再多點時間進行參數final duel
現在附上使用python與Excel VBA執行完成的圖案,python執行的時間2603秒,Excel VBA執行時間7598秒(未優化前),兩者相差約2.9倍
這兩個都是在有線網路20M/4M, 雙核心雙執行緒2G Hz CPU, 4G RAM, XP OS SP3規則所跑出來的結果
也試過在無線3.5G, i7四核心8執行緒 2.3G Hz CPU, 4G RAM, win7 OS SP1跑出約相差4倍的差距,所以如果執行環境越差,跑出來的結果相差越大
目前經過幾天的壓力測試,結果在可接受的範圍內,雖然已經努力進行優化了,但整體花費時間比起python的時間,仍需要做優化
至於下載明細所儲存的檔案格式在之後如使用者有需要再做調整

目前該Excel VBA 交易明細.xls 為V1.0.0.1 T01
其功能如下
1.開啟時會自動將當天的日期設定,並將欲取得的上市股票ID編號重頭開始(這裡是2)
2.下載儲存交易明細日期與上市股票ID編號,可自行設定
3.當資料取得過程發生在某一個網頁有問題時,會自動記錄,以供再次下載有問題股票之用
4.當網頁開啟有問題時,及遠端證交所伺服器過忙碌時,將會進行Retry直到取得資料
5.當Retry 5次無法下載市股票ID的總頁數網頁時,會記錄該日期與股票以供參考
6.自動記錄有交易日期各股票在證交所網頁上的總頁數
7.會自動將股票ID與交易明細儲存為CSV檔

由於是Debug version,若是使用上有任何問題歡迎提出或是需要添加何種功能也可以提出討論

python_20120801.JPG (217.33 KB)

Python_20120801

python_20120801.JPG

ExcelVBA_20120801.JPG (232.55 KB)

ExcelVBA_20120801

ExcelVBA_20120801.JPG

交易明細.rar (189.27 KB)

本篇主題討論至今,大家踴躍討論,中間或許也有些口舌辯論
希望盡量以針對程式技術做討論,不必要的口水戰請適可而止
整體過程中已經有了完整的結論,當然要各憑本事去體會
這類下載方式,其實對於網管人員來說,是非常不認同的
所以下載不完全並非程式的問題(不論您使用任何程式下載結果是一樣的)
就VBA技術來說,本帖已經完全得到結論,為避免再有不愉快的口水戰
本帖將關閉討論。
學海無涯_不恥下問

TOP

回復  GBKEE 我是真的佩服W大的功力,完全沒有攻訐意思。
我很菜,看過我先前的發問就知道我是菜鳥一個;時常 ...
HSIEN6001 發表於 2012-8-5 10:22



我笑了
拿一個未被實現的功能來評論別人,完之後就趕快跑,這樣卻說自己很受傷,打人喊救人,如果每個人都這樣那真的沒完沒了
還有你所貼出的code跟我的應該是不同,你該不會是拿自己寫的code,跑出問題再來質疑別人吧

TOP

回復 41# GBKEE
  1. '取得頁數 ; 避開只為 [頁數] 取得而拼命刷該網頁;造成塞龜 http://bsr.twse.com.tw/bshtm/bsMenu.aspx?
  2.     strURL = "http://bsr.twse.com.tw/bshtm/bsMenu.aspx?" & _
  3.     "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKMTczNDk4NzY0Mg9kFgICAQ9kFgwCBQ8WAh4JaW5uZXJodG1sBQoyMDEyLzA4LzAxZAIGDxYCHwAFCDIwMTIwODAxZAIIDw8WBh4JRm9udF9Cb2xkZx4EXyFTQgKEEB4JRm9yZUNvbG9yCj1kZAIKD2QWAgIBDw9kFgIeB09uQ2xpY2sFHGphdmFzY3JpcHQ6YnV0Q2xlYXJfQ2xpY2soKTtkAgwPDxYGHwFoHwIChBAfAwpHZGQCDg8PFgIeB1Zpc2libGVoZGRktxLZGMAybpsQ2UGpZGNtbwAAAAA%3D&__EVENTVALIDATION=%2FwEWCALzjPG5CALjpuXcAwKN4Ij0CwLB5ZfoCQLjk6TKBwKY8en5CwLdkpmPAQL6n7vzC9kuc7umJfLwqKqibgdx3poAAAAA&HiddenField_spDate=&HiddenField_page=PAGE_BS&txtTASKNO=" & fileIdx & "&hidTASKNO=&btnOK=%E6%9F%A5%E8%A9%A2"
  4.         With xml
  5.             .Open "GET", strURL, 0
  6.             .send
  7.             Do While xml.readyState <> 4
  8.             Loop
  9.             x = Split(Split(.responseText, "sp_ListCount"">")(1), "</span></b>")(0)
  10.         End With
  11. '將頁數丟給下載去處理
  12. '下載xls
  13.     With ActiveSheet.QueryTables.Add(Connection:= _
  14.         "URL;http://bsr.twse.com.tw/bshtm/bsContent.aspx?StartNumber=" & fileIdx & "&FocusIndex=All_" & x _
  15.         , Destination:=Range("A1"))             '放置位置< ----->可變
  16.         .Name = "券商"
  17.         .BackgroundQuery = True                 '刷新返回查詢(執行更新)
  18.         .RefreshStyle = xlOverwriteCells        '= xlOverwriteCells '覆蓋原欄位  = xlInsertDeleteCells '插入新資料,原資料右移
  19.         .RefreshPeriod = 0                      '自動更新時間 以分為單位 5代表每5分鐘更新一次 0代表不自動更新
  20.         .WebSelectionType = xlSpecifiedTables   '指定類型= xlEntirePage 整頁        = xlSpecifiedTables 表格        = xlAllTables 所有表格
  21.         .WebFormatting = xlWebFormattingNone    '= xlWebFormattingNone 不保留連結及樣式    = xlWebFormattingRTF  保留連結及格式設定
  22.         .WebTables = "5,""table2"""             '指定取得之表格 與 .WebSelectionType = xlSpecifiedTables配合 = "1,2," 或 ="5,""table2""" 或 = """table1"",""table2"""
  23.         .WebDisableDateRecognition = False      '日期鑑別=False 禁用        =True 使用
  24.         .Refresh BackgroundQuery:=False         '刷新返回查詢(執行更新)
  25.     End With
複製代碼
我是真的佩服W大的功力,完全沒有攻訐意思。
我很菜,看過我先前的發問就知道我是菜鳥一個;時常勞煩各位幫忙解決〔很感恩〕。
只是[提醒]刷頁面問題,也是另一個塞車的困擾。 [這勉強可算 (教學相長) 的一部份]
至於寫;因為還再不斷 Try 於VBA 很陌生的生字。沒到可以獻醜的部份。

現在正在思考的問題是 , 因為處理xls存檔;也掛載相當久。所以改用htm下回來再一起處理。
相關學習思路也是在版上,有跡可循。

http://forum.twbts.com/thread-7336-1-1.html
http://forum.twbts.com/viewthrea ... p;extra=&page=2

寫程式沒有絕對的誰好誰不好
可以再不同的思路中;學到更多的可能性
這點真的很棒! --->相信很多版大都有這種 初衷
所以樂意在此幫助像我這樣的菜鳥

我目前還沒見過因為自己寫的爛
攻擊我的,都是適度給我其他更多的參考
這對於吸收不同的思維
提供了很好的輔助
不是嗎?!

在此!慎重聲明~~~不再回應W大的程式測試結果或提出問題
因為,我也怕受傷呀!

~~~正在哭!~~~

TOP

本帖最後由 GBKEE 於 2012-8-5 09:54 編輯

回復 42# white5168
你這 未優化 與我 7# 未更新前的程式一樣 尚未測試確定沒問題就急著推出 有點類似
期待 你優化後 VBA    會 [ 教學相長 ] 的
想請教 python 也是未優化 嗎?

TOP

敬告各位 會員
希望各位在回文時 字句的修飾是必須的,要考慮到對方有不舒服的感受,請不要製造出互相攻擊的 ...
GBKEE 發表於 2012-8-5 09:30



7598秒為未優化前的數據,開啟視窗的執行迴圈是不開視窗執行迴圈的3.5倍,版主該不會也在文字上沒注意看到吧?

TOP

本帖最後由 GBKEE 於 2012-8-5 09:39 編輯

敬告各位 會員
希望各位在回文時 字句的修飾是必須的,要考慮到對方有不舒服的感受,請不要製造出互相攻擊的氛圍
在這論壇上 我真的是有感受到〔教學相長〕效應的存在

回復 39# HSIEN6001
1#   附檔有說明 :  "現在附上使用python與Excel VBA執行完成的圖案,python執行的時間2603秒,Excel VBA執行時間7598秒(未優化前),兩者相差約2.9倍"
上述的差異 39#中一段:  "Do ....Loop 會造成塞車問題。 我只是想#22樓你寫的那段;剛好與你的迴路設計是背離的"   這裡道出產生"速率的差異"

所以我 7#  的程式修正不必要的迴圈,  消除2.9倍的速率,但還是有缺點  經 white5168   指點  在18# 修改了  在這裡我就有收到 〔教學相長〕效應
你可再測試 7#  的程式看看  python執行的時間2603秒,Excel VBA執行時間7598秒 還有2.9倍的速率的差異嗎? ,
可說明 塞車問題 是否是正確的

PS: 7#的程式碼已更新同 18#  

TOP

本帖最後由 white5168 於 2012-8-5 09:29 編輯
早呀!大家~^__^~

回復  white5168
目前該Excel VBA 交易明細.xls 為V1.0.0.1 T01
其功能如下
1.開啟 ...
HSIEN6001 發表於 2012-8-5 08:38



我並非聽不進別人的諫言,但自己是否有聽進別人說(一個不存在的流程經你的實驗後所產生問題),而你打從一開始就在拿一個不存在的功能來爭執,你說的0050之類的股票再我這裡的作法的確是無法動作,但你又曾幾何時仔細認真讀過code能做到的功能,去了解為什麼會造成Dead Loop(你自己強調要學code,不願花功夫去了解),我強調明明打從一開始就說的很清楚是股票代碼ID可以自行變更,沒說股票代碼可以變更,如果真是股票代碼我又何必加上ID字眼去強調它的不同呢?況且我功能的第5點也說明 了股票代號與股票ID的不同用法,清楚的也交代了,"當Retry 5次無法下載市股票ID的總頁數網頁時,會記錄該日期與股票以供參考",紛明就是你認知上的不同與理解不清,為何不一開始就問兩者的差異呢?
我是有說可以提供問題,但不是叫你拿一個不存在的流程經你的實驗後所產生問題來我質疑我來跟我吵,這樣不是在反映問題,如果你認為要提出諫言過程是要以爭執才是你表達意見的方式,那我只能說你的表達方式真的很.........另類
請問你的表達難道無法以"你發現了在什麼流程下,經什麼實驗流程後,會產生什麼的數據結果"這樣的說法也比較不像是在爭執,我也會很有意願的來跟你討論修改,而非像你現在這樣吵,覺得是自己在"股票代碼"與"股票代碼ID"的認知不同而不法下台
還有想請問如果你認為我的不好用為何一直拿來做文章呢?這不是很矛盾?

TOP

早呀!大家~^__^~

回復 36# white5168
目前該Excel VBA 交易明細.xls 為V1.0.0.1 T01
其功能如下
1.開啟時會自動將當天的日期設定,並將欲取得的上市股票ID編號重頭開始(這裡是2)
2.下載儲存交易明細日期與上市股票ID編號,可自行設定

重點:
1、其實我並沒有要逞口舌之快;苦口婆心的成分居多。 只希望W大能夠避免〔一言堂〕,聽不進別人的建言;卻老愛刮別人鬍子。 *〔教學相長〕<---還是那句,再次送你,雖然我最沒資格說這句。
2、各大高手都有自己的邏輯,程式迴路--->一山還有一山高。 <----自己外行,所以我該靜靜學習。(這點!我在這裡真的很 [多嘴] ,所以先跟各位看倌說對不起!)
3、版上不是競技場,我是來學習 及 尋求 [好心的大大們] 可以適時的拯救我。
4、我看見麻辣家族的用心經營;所以很感恩這個學習空間。
各位抓資料的時候可能是在尖峰時段,就是大家一起抓資料,會導致遠端伺服器的服務資源大家搶
PS:看的懂得,都應該懂你的Do ....Loop 會造成塞車問題。 我只是想#22樓你寫的那段;剛好與你的迴路設計是背離的! ---->提醒而已!別生氣。

******** 真的別生氣,Please!!!         因為怕大大生氣,所以自己很小心翼翼的。 原諒我吧!--->不然我會哭喔!  ********

回復 37# lalalada
嗯嗯!你的建議及提點,收到囉!我會放進思考裡Try看看
我目前做法是下載回來,再用巨集判讀無資料的刪掉就好。---->避免過長時間掛載,增加危險性。(大略看過這樣的分析〕

回復 38# GBKEE
 GBKEE 大,有您真好!
感謝你們這些熱心且真正樂意協助的大大們!
時常協助我們解決困擾

跟版上各位大大們繼續學習,有勞你們了。

TOP

本帖最後由 GBKEE 於 2012-8-5 07:20 編輯

回復 31# HSIEN6001
丟個沒有交易買賣的代號給它,就刷不停了,例如冷門的股票,它的交易量有可能是 " 0 ",就會出現無交易資料,當然就取不到  "頁數"


執行 7#   Sub 查詢股票日報表()    '查詢單一股票  立即可知有無交易量

7#  --- 57行  是處裡交易量是 " 0 "
54行    Private Sub 匯入日報表(股票代號 As String)      '處裡傳送來的 --股票代號--
55行    Dim Xall As Integer, SubMsg As String, SubRng As Range
56行    Xall = Val(報表頁數(股票代號))              '傳回報表頁數
57行    If Xall = 0 Then                                       '無報表頁數: 報表不存在
58行
        If Rng Is Nothing Then
--------------------------------
18# 修正的 Private Function 報表頁數(Sstock_N0 As String) 函數程式碼
可處理 :  white5168 說的如果IE沒有開完整,將會導致無法取得對應的物件
當 報表頁數 = element.Item(0).innertext  有錯誤時才會重新開啟 IE,
IE 正常時 element.Item(0).innertext=""   為無報表頁數   不嘿有錯誤產生

TOP

        靜思自在 : 一個人不怕錯,就怕不改過,改過並不難。
返回列表 上一主題