承繼同系列的 文章 這篇來教大家怎麼把 爬下來的股價 存到資料庫裡
[Python來爬蟲系列文2 ] 用"request"下載我們要的網頁並整理
新手小白把上次介紹的code 貼到這篇文章的最後面
定義為 crawl_price() 這個 function
以後每次抓資料就可以就可以直接用這個function了
用法就打 datetime.datetime(2018,1,2)
(2018,1,2)是要抓的日期 其他日期就依此類推囉
sqlite3 是SQLite資料庫的檔案型式
關於SQLite 新手小白也不是很懂
只能請大家自行google了....
但是要怎麼跟我們抓的資料存到資料庫 可以用以下的方法
import sqlite3 #先抓入這個套件
conn = sqlite3.connect('test.sqlite3') #用connect 跟資料庫做連結 資料庫名稱為
df.to_sql('daily_price', conn, if_exists='replace')
### 將資料存為 daily_price ##然後連到上一行 所說的conn
### if_exists='replace' 是說如果 資料本來就存在的話就取代掉
### to_sql 當然就是說把csv 轉成sql囉
這樣就存完嘞 我們可以到資料夾去看看
就會有一個 我們 剛建的 test.sqlite3
打開的方法有兩種
一種是繼續用python
df = pd.read_sql('select * from daily_price', conn, index_col=['stock_id'])
### 用的是read_sql 這個指令
### 'select * from daily_price' 就當成固定的寫法吧
### 可以設 index_col 這邊是用股票ID
df.head()
打開的話就長這樣囉~
另一個方法是
使用用DB Browser for SQLite 這個軟件
官網在這 https://sqlitebrowser.org/
請大間就用預設的方式安裝吧
安裝好後就可以打開剛剛的 test.sqlite擋了
他會長這樣
點開Browse Data 就可以看到完整的資料
關於DB Browser for SQLite 裡面還有一些簡單的功能
如果新手小白有空的話 再來分享囉~~
今天就到這裡感謝大家收看!!
### 附錄是一開始提到的 crawl_price 完整code
import requests
import pandas as pd
from io import StringIO
def crawl_price(date):
# 將 date 變成字串 舉例:'20180525'
datestr = date.strftime('%Y%m%d')
# 從網站上依照 datestr 將指定日期的股價抓下來
r = requests.post('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + datestr + '&type=ALLBUT0999')
# 將抓下來的資料(r.text),其中的等號給刪除
content = r.text.replace('=', '')
# 將 column 數量小於等於 10 的行數都刪除
lines = content.split('\n')
lines = list(filter(lambda l:len(l.split('",')) > 10, lines))
# 將每一行再合成同一行,並用肉眼看不到的換行符號'\n'分開
content = "\n".join(lines)
# 假如沒下載到,則回傳None(代表抓不到資料)
if content == '':
return None
# 將content變成檔案:StringIO,並且用pd.read_csv將表格讀取進來
df = pd.read_csv(StringIO(content))
# 將表格中的元素都換成字串,並把其中的逗號刪除
df = df.astype(str)
df = df.apply(lambda s: s.str.replace(',', ''))
# 將爬取的日期存入 dataframe
df['date'] = pd.to_datetime(date)
# 將「證券代號」的欄位改名成「stock_id」
df = df.rename(columns={'證券代號':'stock_id'})
# 將 「stock_id」與「date」設定成index
df = df.set_index(['stock_id', 'date'])
# 將所有的表格元素都轉換成數字,error='coerce'的意思是說,假如無法轉成數字,則用 NaN 取代
df = df.apply(lambda s:pd.to_numeric(s, errors='coerce'))
# 刪除不必要的欄位
df = df[df.columns[df.isnull().all() == False]]
return df
留言列表