hsiao13 發表於 14-1-1 14:34

櫃買中心從2013/12/27的資料無法下載啦!

櫃買中心網頁最近改版,從2013/12/27的資料就無法下載CSV檔了。請問有誰可以提供新的下載方式!現在只能一檔一檔的輸入了嗎????

hsiao13 發表於 14-1-1 17:33

joey0415 發表於 14-1-1 16:27 static/image/common/back.gif
日報表嗎?
http://www.gretai.org.tw/ch/stock/aftertrading/broker_trading/download_ALLCSV.php?curstk= ...

感謝你的回應,由於櫃買中心網頁最近改版,從2013/12/27的資料就無法再用TWS4AB程式下載CSV檔了,也不知道還有甚麼方式可以自動下載歷史股價並輸入amibroker。真是苦惱,不知你是否有好建議。

lwhuang 發表於 14-1-2 14:27

有沒有 csv的直接連結?以前可以用 wget抓,現在這個不行

heavenweaver 發表於 14-1-2 14:30

lwhuang 發表於 14-1-2 14:27 static/image/common/back.gif
有沒有 csv的直接連結?以前可以用 wget抓,現在這個不行

全部證券(不含權證、牛熊證)
http://www.otc.org.tw/ch/stock/aftertrading/otc_quotes_no1430/stk_wn1430_download.php?d=102/12/30&se=EW&s=0,asc,0
下載檔名 SQUOTE_EW_1021230.csv

全部證券(含權證)
http://www.otc.org.tw/ch/stock/aftertrading/DAILY_CLOSE_quotes/stk_quote_download.php?d=102/12/30&s=0,asc,0
下載檔名 RSTA3104_1021230.csv

heavenweaver 發表於 14-1-2 14:43

我將 OTC_CLOSE.py 做了些修改,請看標注紅色的部份,因功力不好只能改成自己勉強使用。
直接下載CSV存檔目錄 C:\mySTock\OTC\CLOSE
修改轉成TXT存檔目錄 C:\mySTock\OTC\AB

import sys
import urllib.request
import os.path
import time
import datetime
from datetime import datetime, timedelta
import re
import win32com
from win32com.client import Dispatch, constants
from win32com.client import DispatchEx


p = re.compile('["]([^"]*)["]')

#櫃買 960701   RSTA3104_1021230.csv
# import urllib.request
# strOTCURL='http://www.gretai.org.tw/ch/stock/aftertrading/DAILY_CLOSE_quotes/RSTA3104_' #960702.csv
# http://www.otc.org.tw/ch/stock/aftertrading/otc_quotes_no1430/stk_wn1430_download.php?d=102/12/30&se=EW&s=0,asc,0
# SQUOTE_EW_1021230.csv
strOTCURL='http://www.otc.org.tw/ch/stock/aftertrading/otc_quotes_no1430/stk_wn1430_download.php?d=' #1021230.csv
today = datetime.today()
yesterday=today

dayback=sys.argv   #下載資料日數[以今日起算]
outPATH= sys.argv#檔案輸出目錄

if dayback=='':
    daynumMAX=1
else:
    if int(dayback)>0:
      daynumMAX=int(dayback)
    else:
      daynumMAX=1


for i in range(1,daynumMAX):
    yesterday = yesterday - timedelta(1)

#檢查輸出目錄是否存在
cond1=os.path.exists(outPATH)
if (not cond1):
try:
    os.system('mkdir '+outPATH)
    cond1=1
except IOError as IOE :
    print ('輸出目錄' +outPATH +' 無法建立')   
    cond1=0

#確認輸出目錄建立成功,才進行

if(cond1):
#檢查輸出目錄是否存在         
outDST=outPATH+'CLOSE\\'
cond1A=os.path.exists(outDST)
if (not cond1A):
    try:
      os.system('mkdir '+outDST)
      cond1A=1
    except IOError as IOE :
      print ('輸出目錄' +outDST +' 無法建立')   
      cond1A=0
#檢查輸出目錄是否存在         
outAB=outPATH+'AB\\'
cond2A=os.path.exists(outAB)
if (not cond2A):
    try:
      os.system('mkdir '+outAB)
      cond2A=1
    except IOError as IOE :
      print ('輸出目錄' +outAB +' 無法建立')   
      cond2A=0
#開始下載
for daynum in range(1,daynumMAX+1):
    inputEntry = yesterday.strftime('%Y_%m_%d').split('_')
    #日期檢查   
    YYYY= inputEntry
    MM= inputEntry
    DD=inputEntry
    TAIYYYY=int(YYYY)-1911
    if int(YYYY) >2000:
      if TAIYYYY<100:
            YYYY1='%02d'%(TAIYYYY)
      else:
            if TAIYYYY <1000:
                YYYY1='%03d'%(TAIYYYY)
            else:
                YYYY1='%04d'%(TAIYYYY)   
    else:
      today = datetime.today()
      autoentry=today.strftime('%Y_%m_%d').split('_')
      TAIYYYY1=int(autoentry)-1911
      if TAIYYYY1 < 100:
            YYYY1='%02d'%(TAIYYYY1)
      else:
            if TAIYYYY1 < 1000:
                YYYY1='%03d'%(TAIYYYY1)
            else:
                YYYY1='%04d'%(TAIYYYY1)   

    print('\n(%04d'%daynum+'/%04d'%daynumMAX+'):'+YYYY+MM+DD+' 開始')
    #上市每日收盤行情
    condIDX1=0
    condIDX2=0
    strOTCIDX1=strOTCURL+YYYY1+'/'+MM+'/'+DD+'&se=EW&s=0,asc,0'
    strDSTIDX1=outDST+'SQUOTE_EW_'+YYYY+MM+DD+'.csv'
    Cond2=os.path.exists(strDSTIDX1)
    if not Cond2:            
      print ('連線')
      for retryCount in range(0,3):
      try:
          time.sleep(0.2)
          condIDX1=urllib.request.urlopen(strOTCIDX1)
          if (condIDX1):
            #strOTCIDX2=strOTCURL+YYYY1+MM+DD+'.csv'
            strOTCIDX2=strOTCIDX1
            condIDX2=urllib.request.urlretrieve(strOTCIDX2,strDSTIDX1)
            break
      except IOError as IOE :
          time.sleep(2)   
          condIDX1=0
          condIDX2=0
          print ('出現連線問題: 嘗試',retryCount)
      if condIDX1 and condIDX2:
          print('(%03d'%daynum+')(1): '+strDSTIDX1+' 下載完成')
      else:
          if condIDX1:
            print('(%03d'%daynum+') (1): '+strDSTIDX1+' 下載失敗')
            condIDX1=0
            condIDX2=0
          else:
            print("警告 ("+YYYY+MM+DD+") 並不是交易日")
            condIDX1=0
            condIDX2=0         
    else:
      condIDX2=1
      print(strDSTIDX1+"已經存在")      
      
    if (condIDX2 and os.path.getsize(strDSTIDX1) <=2048):
      print("警告 ("+strDSTIDX1+") 不是一個有效的檔案, ("+YYYY+MM+DD+") 並不是交易日\n")
      os.remove(strDSTIDX1)
      condIDX1=0
      condIDX2=0
    else:      
      if condIDX2:            
          Cond1=os.path.exists(strDSTIDX1)
          if Cond1:
            sectionstart=0
            u1=open(strDSTIDX1)
            rows = u1.read().split('\n')
            outfileT1=outAB+YYYY+MM+DD+'.txt'
            f1 = open(outfileT1, 'w')
            print('      產生' + outfileT1+' 中')
            #f.write('證券代號,證券名稱,成交股數,成交筆數,成交金額,開盤價,最高價,最低價,收盤價,漲跌(+/-),漲跌價差,最後揭示買價,最後揭示買量,最後揭示賣價,最後揭示賣量,本益比'+'\n')
            for row in rows:
                row=p.sub(lambda m: m.groups().replace(',',''), row)
                row=row.replace('=','')
                #row=row.replace('"','')
                #print(row)
                if ('代號' in row):
                  #代號,名稱,收盤,漲跌,開盤,最高,最低,均價,成交股數 ,成交金額(元),成交筆數 ,最後買價,最後賣價,發行股數 ,次日參考價 , 次日漲停價 ,次日跌停價
                  #代號,名稱,收盤,漲跌,開盤,最高,最低,成交股數,成交金額(元),成交筆數,最後買價,最後賣價,發行股數,次日漲停價,次日跌停價
                  sectionstart=1
                # if ('上櫃家數:' in row):
                if ('共' in row):                  
                  sectionstart=0   
                if (sectionstart==1 and (row!='')):
                  if ('代號' in row):
                        f1.write('證券代號,日期,開盤價,最高價,最低價,收盤價,成交張數\n')   
                  else:   
                        item=row.split(',')
                        if ((len(item)<=5) and (item!=" ---") and (item!="0.00") and (item!="0")):
                        #f1.write(item+'.TW,'+YYYY+'/'+MM+'/'+DD+','+item+','+item+','+item+','+item+','+str(float(item)/1000)+','+item+','+item+','+item+','+item+','+item+','+item+'\n')
                            f1.write(item+','+YYYY+'/'+MM+'/'+DD+','+item+','+item+','+item+','+item+','+str(float(item)/1000)+'\n')
            f1.close()
            u1.close()
            print('      OTC盤後資料 (' + outfileT1+') 完成\n')
    yesterday = yesterday + timedelta(1)
else:
    print('指定輸出目錄: ('+outPATH+') 無法建立')
print('盤後資料下載完成')


Sirius 發表於 14-1-2 16:44

本帖最後由 Sirius 於 14-1-2 16:46 編輯

heavenweaver 發表於 14-1-2 14:30
全部證券(不含權證、牛熊證)
http://www.otc.org.tw/ch/stock/aftertrading/otc_quotes_no1430/stk_wn1430_download.php?d=102/12/30&se=EW&s=0,asc,0
下載檔名 SQUOTE_EW_1021230.csv

全部證券(含權證)
http://www.otc.org.tw/ch/stock/aftertrading/DAILY_CLOSE_quotes/stk_quote_download.php?d=102/12/30&s=0,asc,0
下載檔名 RSTA3104_1021230.csv
第一個不含定價
第二個含定價與零股交易

heavenweaver 發表於 14-1-3 10:51

len(item)<=5 需考慮修改成 len(item)<=6
否則 006201寶富櫃 這檔將永不錄用

if ('代號' in row):
                        f1.write('證券代號,日期,開盤價,最高價,最低價,收盤價,成交張數\n')   
                  else:   
                        item=row.split(',')
                        if ((len(item)<=6) and (item!=" ---") and (item!="0.00") and (item!="0")):
                        #f1.write(item+'.TW,'+YYYY+'/'+MM+'/'+DD+','+item+','+item+','+item+','+item+','+str(float(item)/1000)+','+item+','+item+','+item+','+item+','+item+','+item+'\n')
                            f1.write(item+','+YYYY+'/'+MM+'/'+DD+','+item+','+item+','+item+','+item+','+str(float(item)/1000)+'\n')
            f1.close()
            u1.close()

Fesimi 發表於 14-1-5 21:54

我也遇到這個問題了~~
不知道有那個大大可以幫忙解決~~~
不然就真的只能一天一天慢慢下了~~~

{:4_138:}

hsiao13 發表於 14-1-6 14:23

heavenweaver 發表於 14-1-2 14:43 static/image/common/back.gif
我將 OTC_CLOSE.py 做了些修改,請看標注紅色的部份,因功力不好只能改成自己勉強使用。
直接下載CSV存檔目 ...

我跟著你的程式碼修改後,依然沒能下載,請問你更改後能用嗎?有下載到嗎?

heavenweaver 發表於 14-1-6 17:54

本帖最後由 heavenweaver 於 14-1-6 18:08 編輯

hsiao13 發表於 14-1-6 14:23 static/image/common/back.gif
我跟著你的程式碼修改後,依然沒能下載,請問你更改後能用嗎?有下載到嗎? ...
我的自動批次執行檔otc3.bat如下,為確認你的程式正確執行,請在"命令提示字元"環境下操作,這樣您可以閱讀程式執行所回應的訊息。
----
REM start "收盤"
C:\python33\python C:\myStock\Python\OTC_CLOSE.py 10 C:\myStock\OTC\
----
所以我的資料下載目錄如下:
CSV存檔目錄 C:\mySTock\OTC\CLOSE
TXT存檔目錄 C:\mySTock\OTC\AB



請您先檢查存檔目錄是否有資料下載成功?

我的TXT檔上傳到AB格式與TWS4AB相同

# Format definition file generated automatically
# by AmiBroker's ASCII Import Wizard
$FORMAT Ticker, Date_YMD, Open, High, Low, Close, Volume, skip
$SKIPLINES 1
$OVERWRITE 1
$SEPARATOR ,
$CONT 1
$GROUP 254
$AUTOADD 1

heavenweaver 發表於 14-1-6 19:00

依照上面的修改原則,我將Python33的OTC_CLOSE.py作了Python27的降版OTC_C1.py,它的好處是可以套py2exe編譯成執行檔。請自行參考,歡迎功力好的人整合起來。

Fesimi 發表於 14-1-6 19:19

剛剛請原作大大協助處理新的TWS4AB.
測試正常.
已徵求原作同意放到coco in 給網友分享
但不保證任何資料正確性與往後再次改版是否會有空更新.
有急須的就先用吧!!!!
重點還是要想辦法自己弄資料源比較妥當.




Fesimi 發表於 14-1-6 19:22

另外提醒~~記得更改config.ini檔案內的日期與路徑.
不然會從2010開始更新

stock009 發表於 14-1-8 19:44

本帖最後由 stock009 於 14-1-8 19:52 編輯

感謝 TWS4AB 復活 {:4_161:}
請問TWS4AB把下載網址包在哪個檔案內啊?

heavenweaver 發表於 14-1-9 00:54

stock009 發表於 14-1-8 19:44 static/image/common/back.gif
感謝 TWS4AB 復活
請問TWS4AB把下載網址包在哪個檔案內啊?

當然是在TWS4AB.exe內部,你用UltraEdit就可搜尋到
上市下載網址
http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX3_print.php?genpage=genpage/Report%s/A112%sALL_1.php&type=csvs
上櫃下載網址
http://www.otc.org.tw/ch/stock/aftertrading/otc_quotes_no1430/SQUOTE_AL_%s%s.CSV

頁: [1] 2
查看完整版本: 櫃買中心從2013/12/27的資料無法下載啦!