我的論文研究有一部份要抓取大盤(加權指數)日成交量的數據,在證交所網站上是以月為單位下載。而我需要遠到 1997 年的資料,這樣我必須下載 175 次,然後再做至少 175 次的資料合併!不!我真的很懶惰,還是交給 python 吧!
以下就是順手寫的小程式抓取資料:
class ggm(年度,儲存檔名):
- 年度:都是以最新往前到指定的年度為止,包含該年度
- 儲存檔名:是指最後資料輸出成 csv 檔的檔名
例如:
ggm(1997,'2010-1997-Data')跑完就會出現 '2010-1997-Data.csv' 檔案,裡面就有相關的大盤日成交量資料。
有需要的就請參考以下程式吧:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# 抓大盤日成交量 | |
# By Toomore | |
from datetime import datetime, timedelta | |
import urllib2, logging, csv, re | |
class ggm(object): | |
def __init__(self,year,savef): | |
starttime = 0 | |
daterange = datetime.today() | |
f = open('%s.csv' % savef,'wt') | |
writer = csv.writer(f) | |
while 1: | |
if daterange.year <= year: | |
break | |
else: | |
daterange = datetime.today() - timedelta(days = 30 * starttime) | |
for i in self.fetch_data(daterange): | |
if self.ckinv(i): | |
ti = [] | |
for ii in range(len(i)): | |
i[ii] = i[ii].replace(',','') | |
i[ii] = i[ii].replace(' ','') | |
ti.append(i[ii]) | |
print ti | |
writer.writerow(tuple(ti)) | |
starttime += 1 | |
f.close() | |
def fetch_data(self, nowdatetime): | |
""" Fetch data from twse.com.tw | |
return list. | |
""" | |
url = "http://www.twse.com.tw/ch/trading/exchange/FMTQIK/FMTQIK2.php?STK_NO=&myear=%(year)d&mmon=%(mon)02d&type=csv" % {'year': nowdatetime.year, 'mon': nowdatetime.month} | |
logging.info(url) | |
cc = urllib2.urlopen(url) | |
#print cc.info().headers | |
csv_read = csv.reader(cc) | |
return csv_read | |
def ckinv(self,oo): | |
""" check the value is date or not """ | |
pattern = re.compile(r"[0-9]{2}/[0-9]{2}/[0-9]{2}") | |
b = re.search(pattern, oo[0]) | |
try: | |
b.group() | |
return True | |
except: | |
return False |
不過我還是要說啦!東西做出來就是我賺到了,老闆念我都在處理技術的問題,但我就是喜歡這樣一次抓完的爽度,我就是不喜歡一筆一筆慢慢來,所以 ... 繼續懶惰!
Hi~~你好
回覆刪除我試著 class ggm(1997,'2010-1997-Data'):
卻出現以下的錯誤
File "stock.py", line 9, in
class ggm(1997,'1997'):
TypeError: Error when calling the metaclass bases
int() takes at most 2 arguments (3 given)
請教是委什麼呢??? Thank you
我不太清楚你是怎樣執行的,我是這樣做。
回覆刪除python
>>> import stock
>>> stock.ggm(1997,'1997')
...(就開始執行...)
hi~~
刪除可以了 Thank you very much
Hi
刪除先謝謝你的無私分享
但我想加問一下
我把程式copy複製貼上
然後 F5開始執行
可是
import stock時
出現
Traceback (most recent call last):
File "", line 1, in
import stock
ImportError: No module named stock
這是為什麼呢?
可以的話 請告訴我 謝謝..
你有把檔案存成 stock.py 嗎?
刪除要在同一個資料夾底下執行 python
我發覺是我笨了..
刪除原來直接執行ggm(1997,'2010-1997-Data')
即可
抱歉 因為只有python可是卻幾乎沒用過XD
真的很方便唷
不過我想題外問一下
我有辦法在程式裡加一些語法然後變成自動加總某段資料嗎
像是把某月份全部日成交量加總起來變成月成交量
換句話說
關於月成交量這個部分
您有什麼高見嗎?
謝謝您的分享 感激不盡
既然 python 語法不熟,我就建議你還是交給 excel 處理就好,或是你有興趣可以參考我另外寫的網站或套件。
回覆刪除網站 http://grs.toomore.net/
套件 http://pypi.python.org/pypi/grs
您好,我下載您在http://pypi.python.org/pypi/grs的附件grs-0.2.0-py2.7.egg與grs-0.2.0.tar.gz,並將grs-0.2.0-py2.7.egg覆蓋grs-0.2.0.tar.gz內的檔案,可是在python的GUI打入網站上的指令from grs import stock 卻會發生
回覆刪除Traceback (most recent call last):
File "", line 1, in
from grs import stock
ImportError: No module named grs
能否請您幫忙一下,我的信箱u9211008@gmail.com,謝謝.
建議用 pip 安裝才不會有路徑問題
刪除pip install grs
作者已經移除這則留言。
刪除您好,我依據網站上建立一個my_new_env資料夾在C槽並且用pip安裝了grs,可是我現在不管在Python的GUI或command line下輸入form grs import stock都會出現
刪除>>> from grs import stock
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named grs
不知道是哪邊沒有注意到,請您跟我說一下盲點在哪,謝謝.
下面為我參考的網站
http://quest.keitheis.org/post/6713569631/pip-install-on-windows-linux-mac
您好,我目前已經能夠使用您寫的模組了,現在遇到一個問題是我測試某些股票的時候是沒有問題的,可是測試到一檔股票的時候出現錯誤訊息,奇怪的是可顯示出當日的即時股價卻無法顯示均線,這檔股票是3232,以下為錯誤訊息
刪除Traceback (most recent call last):
File "", line 1, in
print g.MA(5)
File "C:\Python27\lib\site-packages\grs\fetch_data.py", line 188, in MA
return self.__cal_MA(date, 6)
File "C:\Python27\lib\site-packages\grs\fetch_data.py", line 165, in __cal_MA
cont = self.__cal_continue(re)
File "C:\Python27\lib\site-packages\grs\fetch_data.py", line 184, in __cal_continue
return cont * diff_data[0]
IndexError: list index out of range
3232 是上櫃,這只能擷取上市股票 ...
刪除版主您好,
回覆刪除謝謝您的分享,找了好久,終於有用的資訊
有個問題想請教,
如果我只想取得"即時的大盤總成交量" 一個欄位的CSV
要下什麼http request?
謝謝您!
這個只能抓 "日成交量的數據" ...
刪除其他的需求可以參考我做的另外一個套件,感謝!
https://pypi.python.org/pypi/grs
謝謝您的回覆!
刪除作者已經移除這則留言。
回覆刪除版主您好,
回覆刪除比方說我用下列url 可以得到即時的台灣50的資訊
http://mis.tse.com.tw/data/0050.csv
0050 -0.25 13:30:05 62.9 54.7 ........
以得到的CSV前幾欄來說, 依序為"股票代號" "目前漲跌" "報價時間" "漲停價" "跌停價"
但是後面還有一長串,
每個欄位的各別代表意義要去哪裡查?
謝謝您
Hello,版主您好,
回覆刪除身為一個新手打算抓證交所的資料從你的這段程式碼開始,下載了python 3.4,然後稍微改一下urllib2的部分。(根據網路資源顯示3.4之後的版本將urllib2跟urllib合併,變成urllib.request) 然後試著跑這段程式碼。
跑完了,csv檔案有創造出來。但是檔案裡是沒有資料的@@
錯誤的訊息為:
"File "D:\Python34\stock.py", line 20, in __init__
for i in self.fetch_data(daterange):
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)"
不知道是那兒出了問題了呢?
不行吧,這只能在 Python2 底下執行。
刪除ooops......,不論如何,謝謝你。
刪除感謝版主的分享, 我是python2新手,能夠這樣抓資料好方便阿~非常感謝
回覆刪除