MorganLiu 發表於 14-12-27 22:43

證交所的每日收盤行情csv

請問:
有人知道12/27上巿的每日收盤行情csv要如何用python下載
在這網址http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php中
以前只要給"http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX3_print.php?genpage=genpage/Report201412/A11220141226ALLBUT0999_1.php&type=csv"就可以下載12/26的csv

不過今天(12/27)的csv已經不能再用這方式下載了
有人知道要如何下載嗎?

謝謝

saucer 發表於 14-12-27 23:07

證交所非常小氣耶

很明顯的連這個都要給你添加個小麻煩

chwqk 發表於 14-12-27 23:25

本帖最後由 chwqk 於 14-12-27 23:30 編輯

我也在期待.........
我是用excel vba的

這些處理大眾資訊的人都在想什麼阿..............
今年 年終獎金應該不錯巴 !!!!!!

資料不讓你用 卻一直希望衝高股市交易量.........等獎金


MorganLiu 發表於 14-12-28 00:02

今年證交所不知道在幹嘛
一直改來改去

Sirius 發表於 14-12-28 08:50

用Post方式傳資料即可




《深入 Python 3》第十四章中14.6 HTTP GET之外有解釋Post傳資料的方式

補充一下上圖
會用得到的參數有
download, qdate, selectType
如果要直接下載csv檔,download值設為 "csv"
selectType就是分類項目,如果要選「全部(不含權證、牛熊證、可展延牛熊證)」,值是"ALLBUT0999"
再補張圖,若需要選其它項目就查一下HTML原始碼即可



其實改成現在的版本是比以前的做法有效率的多
譬如現在的版本如果要連續下載多日 CSV 格式「全部」資料,只要改一下日期,按「下載CSV」即可,不需再重新調整「分類項目」,在程序與流量上省很多
不過若要連續抓資料時,還是建議讓程式在每筆下載之間做個暫停,避免造成服務器端大量負荷

CSV格式也稍有調整哦

話說自己這兩日也為這東西搞了老半天,因為一時不察,沒注意到用Post,還一直在試Get,還奇怪為何參數正確,為何網頁會Refresh而不是傳回預期中的資料{:4_93:}

MorganLiu 發表於 14-12-28 09:06

本帖最後由 MorganLiu 於 14-12-28 09:08 編輯

po一下我的做法
import csv
import string
import codecs
import urllib.parse
import urllib.request
import configparser
import os
import datetime
import shutil
url="http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php"
values = {'download' : 'csv',
          'qdate' : '103/12/26',
          'selectType' : 'ALLBUT0999' }

data = urllib.parse.urlencode(values)
req= urllib.request.Request(url, data.encode('utf-8'))
response = urllib.request.urlopen(req)

file1=open("Z:\\qq","w")
for line in response.read().decode('CP950'):
    if len(line)>0:
      file1.writelines(line)
file1.close()

這個code可以下載csv
不過要自己做迴圈
同時謝謝S大的分享

randloop 發表於 14-12-28 10:05

Sirius 發表於 14-12-28 08:50 static/image/common/back.gif
用Post方式傳資料即可




S大大 請問您第一張圖的資訊是用什麼工具的取得的?
是否方便分享?

Sirius 發表於 14-12-28 10:34

randloop 發表於 14-12-28 10:05 static/image/common/back.gif
S大大 請問您第一張圖的資訊是用什麼工具的取得的?
是否方便分享?

Firefox有個附加元件叫「Web Developer Toolbar」
裝好後,在「Forms」-->「View Form Information」就可以看到了

WDT實在太方便了,不過會佔一排工具列的空間,所以平常我都把它隱藏,必要時才把傢伙掏出來用

Sirius 發表於 14-12-28 11:09

我也提供一下我依上述教學網頁做的簡單測試用程式,不過要安裝httplib2

安裝httplib2的方法,在命令列下用 pip 安裝即可
pip install -U httplib2
程式腳本:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from urllib.parse import urlencode
import httplib2

url = 'http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php'
data = {'download': 'csv', 'qdate': '103/12/23', 'selectType': 'ALLBUT0999'}
agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'

httplib2.debuglevel = 1
conn = httplib2.Http('.cache')
headers = {'Content-type': 'application/x-www-form-urlencoded',
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
         'User-Agent': agent}
resp, content = conn.request(url, 'POST', urlencode(data), headers)

print(resp.status, resp.reason)
print(content.decode('cp950'))

因為是測試用的程式,要看執行過程中的訊息,所以用print而沒寫存檔
若要存檔只要把最後2行print改成像這樣即可:
with open('your_file_name.csv', 'wb') as f:
    f.write(content)


headers中的 'Accept'可以不用設。我習慣會改一下User-Agent,假裝一下是一般瀏覽器,原因是服務器會記錄,不改的話,精明的網路管理員可從中知道是程式來抓東西的,這種數量多了,他也許會做些阻擋的措施而造成以後下載較不方便。買賣日報表的圖形驗證就是這類例子。

chwqk 發表於 14-12-29 12:24

SIRIUS:
若需要選其它項目就查一下HTML原始碼即可
用IE就可以嗎?
還是要用其他程式??

Sirius 發表於 15-1-13 17:56

chwqk 發表於 14-12-29 12:24 static/image/common/back.gif
SIRIUS:
若需要選其它項目就查一下HTML原始碼即可
用IE就可以嗎?


不好意思,剛剛才看到你的詢問
任何瀏覽器都可以看得到HTML原始碼,只是那個看原始碼的命令選單放的位置會不太一樣

fancytom 發表於 15-1-20 16:33

12月上市櫃的每日查詢日報表又改版
害我無法一次 用自己設計的VB6整批下載 ! {:4_161:}
變成只好 手動去網站下載上市的部份- 真不爽
改天還得找時間,改寫我的VB6

chwqk 發表於 15-1-20 22:15

SOS.....................
上個月才改版的XXX

chwqk 發表於 15-1-22 15:18

我選則用下載CSV檔方式處理
但是:
工作表內A及B欄內之字元有的儲存格最後都會多一個空白
如何用VBA 刪除A、B欄所有儲存格內字元最後有空白 的部份
如:
先選A欄
令其所有字元
" "=""
如何寫阿????

linsjn 發表於 15-1-22 16:07

請問有高手大大.知道VB6要怎麼改寫嗎?之前用 Inet1.OpenURL(StrTemp1, 1)的方法代入網址就可抓到.
頁: [1] 2
查看完整版本: 證交所的每日收盤行情csv