承繼同系列的 文章 這篇來教大家怎麼把 爬下來的股價  存到資料庫裡

[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

arrow
arrow

    Markjong001 發表在 痞客邦 留言(1) 人氣()