返回列表 上一主題 發帖

[原創] python上市櫃三大法人買賣超日報資料下載

[原創] python上市櫃三大法人買賣超日報資料下載

可用來下載上市櫃三大法人買賣超日報資料。與py檔同一路徑下的path.ini可設定csv存放位置,注意路徑要包括最後一個"\",如:C:\user\desktop\test\。
附上執行檔
  1. import requests
  2. import time
  3. import os

  4. mydate = time.strftime("%Y/%m/%d")
  5. year = str(int(mydate[0:4])-1911)
  6. mydate2 = mydate.replace(mydate[0:4],year)

  7. setting = os.getcwd() + "\\" + "path.ini"

  8. if os.path.exists(setting):
  9.     with open(setting, 'r') as r:
  10.         path = r.read()
  11.     if not os.path.exists(path):
  12.         os.makedirs(path)
  13. else:
  14.     path = ""

  15. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}


  16. url1 = "http://www.twse.com.tw/ch/trading/fund/T86/T86.php"
  17. payload1 = {"download": "csv",
  18.             "qdate": mydate2,
  19.             "select2": "ALLBUT0999",
  20.             "sorting": "by_issue"}

  21. res1 = requests.post(url1, headers=headers, data=payload1, stream=True)

  22. fName1 = path + mydate.replace("/","") + ".csv"

  23. with open(fName1, 'wb') as f1:
  24.     for chunk in res1.iter_content(1024):
  25.         f1.write(chunk)


  26. url3 = "http://www.tpex.org.tw/web/stock/3insti/daily_trade/\
  27. 3itrade_hedge_download.php?l=zh-tw&se=EW&t=D&d=" + mydate2 + "&s=0,asc,0"

  28. res3 = requests.get(url3, headers=headers, stream=True)

  29. fName3 = path + "BIGD_" + mydate2.replace("/","") + ".csv"

  30. with open(fName3, 'wb') as f3:
  31.     for chunk in res3.iter_content(1024):
  32.         f3.write(chunk)


  33. url2 = "http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php"
  34. payload2 = {"download": "csv",
  35.             "qdate": mydate2,
  36.             "selectType": "ALLBUT0999"}

  37. res2 = requests.post(url2, headers=headers, data=payload2,stream=True)

  38. fName2= path + "A11" + mydate.replace("/","") + ".csv"

  39. with open(fName2, 'wb') as f2:
  40.     for chunk in res2.iter_content(1024):
  41.         f2.write(chunk)
  42.         

  43. url4 = "http://www.tpex.org.tw/web/stock/aftertrading/otc_quotes_no1430/\
  44. stk_wn1430_download.php?l=zh-tw&d=" + mydate2 + "&se=EW&s=0,asc,0"

  45. res4 = requests.post(url4, headers=headers, data=payload2,stream=True)

  46. fName4 = path + "SQUOTE_EW_" + mydate2.replace("/","") + ".csv"

  47. with open(fName4, 'wb') as f4:
  48.     for chunk in res4.iter_content(1024):
  49.         f4.write(chunk)
複製代碼

回復 2# VBALearner
您過獎了。這個是python的code,如果沒有安裝python,可以下載執行檔,再在vba裡用shell的方式執行。
抓網路資料方面python還滿好用的,網路上資源很多,我也是為了抓資料東學一點西學一點,拿別人的東西修修改改。找時間再補上註解,應該會比較清楚。

TOP

回復 5# c_c_lai

應該是因為我沒有處理時間(下載的日期是直接取當日的日期),如果是資料還沒出來的時候執行下載就會出現問題。
請在傍晚的時間再試試看。

TOP

回復 1# zyzzyva
補上註解。
  1. #匯入模組(requests需另外安裝,也可使用urllib2)
  2. import requests
  3. import time
  4. import os

  5. #取得當前日期
  6. mydate = time.strftime("%Y/%m/%d")

  7. #將西元年轉為民國年
  8. year = str(int(mydate[0:4])-1911)

  9. #將民國年取代日期中之西元年
  10. mydate2 = mydate.replace(mydate[0:4],year)

  11. #os.getcwd()取得當前路徑
  12. setting = os.getcwd() + "\\" + "path.ini"

  13. #檢查path.ini是否存在,若有則將csv存檔之路徑讀入
  14. if os.path.exists(setting):
  15.     with open(setting, 'r') as r:
  16.         path = r.read()
  17.     #若csv存檔之資料夾不存在則建立資料夾
  18.     if not os.path.exists(path):
  19.         os.makedirs(path)

  20. #若path.ini不存在則將path設為空字串
  21. else:
  22.     path = ""

  23. #設定header
  24. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}

  25. #設定url
  26. url1 = "http://www.twse.com.tw/ch/trading/fund/T86/T86.php"

  27. #設定post查詢之資料
  28. payload1 = {"download": "csv",
  29.             "qdate": mydate2,
  30.             "select2": "ALLBUT0999",
  31.             "sorting": "by_issue"}

  32. #發出request並將網站回覆之資料存入res1變數中
  33. res1 = requests.post(url1, headers=headers, data=payload1, stream=True)

  34. #設定csv檔案之路徑與檔名
  35. fName1 = path + mydate.replace("/","") + ".csv"

  36. #將res1的資料寫入csv中
  37. with open(fName1, 'wb') as f1:
  38.     for chunk in res1.iter_content(1024):
  39.         f1.write(chunk)
複製代碼

TOP

回復 8# c_c_lai
只要安裝requests就可以了。

TOP

回復 11# c_c_lai
您太客氣了,有興趣可以一起研究。也預祝您手術順利,早日康復。

TOP

回復 13# VBALearner
是的,那是requests模組的文件沒錯。
內建的urllib模組的功能也差不多,但是我覺得requests比較好用一點。

TOP

回復 15# hanson09 我的是3.4,3.5執行應該沒有問題(因為我沒有處理時間,所以要交易日的下午資料出來後執行,抓到的檔案才會完整。)你是執行過不了,還是抓不到完整檔案?有錯誤訊息嗎?

TOP

回復 17# hanson09 我是用Cx_freeze,簡單的程式應該都可以,但如果程式中有用到某些套件,像tinker或lxml之類的,可能就會有問題。學python一開始是工作上需要(要抓一些籌碼資料),老闆拿了一本書給我,叫菲絲恩教你學會python,對基本語法有一些概念以後,就是看網路上的教學,要用到什麼就看什麼,看了一些覺得雖然有學到一點皮毛,不過還滿沒有系統的,所以也買了一些書,有的內容看得懂,有些一知半解,目前就是慢慢看,想說多看之後可能就會懂了。

TOP

本帖最後由 zyzzyva 於 2016-8-30 23:25 編輯

回復 19# VBALearner
cx_freeze在包的時候就會把有用到的套件包進去,所以其他人正常來說應該直接就可以使用了。python也有反組譯的工具,但我沒用過,所以詳細情況不太了解,如果要改寫應該直接用我po的code改比較方便。
要轉exe檔的時候,除了要轉的檔案(假設檔名為test.py),還要另外準備一個py檔(假設檔名為setup.py)放在同一個目錄下,內容大概是像這樣:
  1. from cx_Freeze import setup, Executable

  2. setup(name='程式的名字',
  3.       version='版本號',
  4.       description='簡單的描述',
  5.       option={"build.exe"},
  6.       executables=[Executable("test.py")])
複製代碼
然後在檔案所在目錄下開啟cmd,執行setup.py build,成功的話在同一個目錄下就會有一個build資料夾,裡頭就是我們要的東西。
其實我覺得python入門不會比vba困難耶,有vba的經驗,我想應該很快就會上手了。雖然我懂的也很有限,但有什麼問題歡迎提出來,大家可以一起研究。

TOP

        靜思自在 : 人要知福、惜福、再造福。
返回列表 上一主題