各位先進您好,
本人試著撰寫爬蟲程式至證交所取得三大法人資料,其程式碼是取自各先進的sample code,
再試著改寫。
邏輯如下:
PS :
待該問題解決後,會再持續加入將每日的dataframe 另外append至一dataframe,以收集每日資至單一dataframe,進而將其匯出電子檔,以供其它程式使用。
==================Code Start==========================
import requests
from io import StringIO
import pandas as pd
import time
import datetime
debug_mode = 'Y'#過程中是否顯示debug訊息
intI = 3 #自n天前的資料開始抓
#逐日爬取資料
while intI >= 0:
#日期格式:yyyymmdd
date = (datetime.date.today() + datetime.timedelta(days=intI*-1)).strftime('%Y%m%d')
if debug_mode == 'Y':
print('==================Begin debug - '+date+'==================')
try:
r = requests.get('http://www.tse.com.tw/fund/T86?response=csv&date='+date+'&selectType=ALLBUT0999')#
df = pd.read_csv(StringIO(r.text), header=1).dropna(how='all', axis=1).dropna(how='any')
col_names = df.columns.tolist()
col_names.insert(0,'stock_date')
df.reindex(columns=col_names,fill_value=date)
if debug_mode == 'Y':
print(df[:1])
print('-------')
print('col_names:')
print(col_names)
print('-------')
print('df columns : ')
print(df.columns)
print('----比對---')
print('col_names數:'+str(len(col_names)))
print('df.columns:'+str(len(df.columns)))
print(str(set(df.columns).difference(set(col_names))))
except ValueError:
if debug_mode == 'Y':
print('no data found')
print('-------')
if debug_mode == 'Y':
print('==================End debug - '+date+'==================')
intI -= 1
==================Code End==========================
下次麻煩用原始碼區塊來問,尤其python的code和縮排很有關係。
df.reindex(columns=col_names,fill_value=date)
參閱pandas的說明:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html
Conform DataFrame to new index with optional filling logic, placing NA/NaN in locations having no value in the previous index. A new object is produced unless the new index is equivalent to the current one and copy=False
reindex()會產生一個新的dataframe,並不會改變原本的dataframe。
你可以這樣改你的code
df = df.reindex(columns=col_names,fill_value=date)
這樣會讓df這個變數重新指向 df.reindex(columns=col_names,fill_value=date)的結果。