python爬取股票資料並存到資料庫
Python 用Tushare介面獲取股票資料並儲存到Sqlite資料庫
使用技術介紹:
關於介面 由於tushare舊版本即將不能用了,所以我們這裡使用的是tushare pro 介面。
關於資料庫 使用了Sqlite輕量級資料庫適合本地使用。
關於爬取的資料 共12種資料,如下ts_code,trade_date,open,high,low,close,pre_close,change,pct_chg,vol,amount, avgprice
關於py檔案 共三個 分別是Tushare.py, config.py, SQLserver .py
具體實現
要import的庫
import tushare as t1# t1 是舊版本後面的ts = t1.pro_api() 是變為pro版本
import time # 用以計時
from config import * # 此庫為配置庫
from SQLserver import * # 此庫為作者所寫
Tushare Pro 爬取資料
Pro介面需要前往官網()註冊,並獲取token,過程較為繁瑣,而本文篇幅有限故將在之後更新獲取token文章。
將獲取到的token值放進config檔案中的tushare字典中。
# -*- coding: utf-8 -*-
"""此為存放配置資訊的config.py"""
tushare = {"token":"", "column": ['ts_code', 'trade_date', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount'],} # 冒號裡為您的token值
dbPath = r'\database.db' # 資料庫路徑
Stock_list={"平安銀行": "000001.SZ","萬科A": "000002.SZ",
"全新好": "000007.SZ"} # 股票名稱和程式碼字典
class Fetch_Data():
"""code股票程式碼 sd開始日期 ed結束日期"""
def __init__(self, code, start_data, end_data):
self.code = code
self.sd = start_data
self.ed = end_data
# self.csv_name = "csv_data/" + csv_name + ".csv"
def web_spider(self): # 爬蟲tushare介面
try:
df = ts.daily(ts_code=self.code, start_date=self.sd, end_date=self.ed) # 爬取資料--dataframe格式
# daily方法所獲取的資料ts_code,trade_date,open,high,low,close,pre_close,change,pct_chg,vol,amount,avgprice
# df.to_csv(self.csv_name) # 轉換為csv檔案
return df # 返回資料
except Exception as e:
print(e) # 列印報錯資訊
當然僅有這段程式碼是不行的,我們還需要初始化tushare介面。初始化本寫在main中,這裡為了方便大家使用提到前面來說。
t1.set_token(tushare["token"]) # 存在config裡的token值
ts = t1.pro_api() # 初始化pro介面
2.儲存到Sqlite資料庫
# 儲存到資料庫
class Sql_Data_Handle():
def __init__(self, df, connect, curs):
self.df = df
self.connect = connect
self.curs = curs
def character(self):
# df = pandas.read_csv(self.csv_name, encoding='gbk') # 用pandas庫讀取csv檔案
line_num = self.line_num
# pandas的iloc函式讀取每行對應資料
ts_code = self.df.iloc[line_num]["ts_code"]
trade_date = self.df.iloc[line_num]["trade_date"]
open = self.df.iloc[line_num]["open"]
high = self.df.iloc[line_num]["high"]
low = self.df.iloc[line_num]["low"]
close = self.df.iloc[line_num]["close"]
pre_close = self.df.iloc[line_num]["pre_close"]
change = self.df.iloc[line_num]["change"]
pct_chg = self.df.iloc[line_num]["pct_chg"]
vol = self.df.iloc[line_num]["vol"]
amount = self.df.iloc[line_num]["amount"]
# 將資料轉換為元祖tuple格式
values = (
ts_code, trade_date, float(open), float(high), float(low), float(close), float(pre_close),
float(change), float(pct_chg), float(vol), float(amount))
return values
def add_data(self):
self.line_num = len(self.df) - 1
# 迴圈呼叫character()函式-讀取每行資料
while self.line_num >= 0:
value_list = self.character()
try:
# 插入資料庫
Sql.Sql_execution(
f"""insert into stock ({tushare["Column"]}) values """ + f"(\'{value_list[0]}\',\'{value_list[1]}\',\'{value_list[2]}\',\'{value_list[3]}\',\'{value_list[4]}\',\'{value_list[5]}\',\'{value_list[6]}\',\'{value_list[7]}\',\'{value_list[8]}\',\'{value_list[9]}\',\'{value_list[10]}\')")
except Exception:
# 出錯資訊
print(f"{value_list[0]}-{value_list[1]}未被新增!")
self.line_num -= 1
i += 1
print(f"The data has been added to the stock database")
return i
3.主函式
包括了連線資料庫 初始化tushare Pro介面 呼叫Fetch_Data,Sql_Data_Handle類 計算新增用時和新增資料條數的功能。
if __name__ == '__main__':
count = 0
line_count = len(Stock_list)
print("連線資料庫")
Sql = DataServer_Sqlite3("stock") # 連線資料庫
stock_code = Stock_list
# Sql.Empty_database() # 清空資料庫
# print("清空資料庫")
# Sql.Zero_Id() # 將ID歸零
# print("將ID歸零")
for key in stock_code:
try:
column = tushare["column"] # config中的tushare字典
t1.set_token(tushare["token"]) # token值
ts = t1.pro_api() # 初始化pro介面
print("初始化pro介面成功")
input_code = stock_code[key]
sd, ed = "20181231", "20201231" # 起始日期,結束日期
print(f"抓取{key}股票資料")
start = time.perf_counter() # 開始時間
df = Fetch_Data(input_code, sd, ed).web_spider() # dataframe格式股票資料
line_num = Sql_Data_Handle(df, Sql.connection, Sql.curs).add_data()
end = time.perf_counter() # 結束時間
# 記錄用時
print(f"新增{key}股票資料到資料庫--成功,用時{start - end}")
# 記錄新增的資料條數
print(f"{key} 共{line_num}條資料已新增到資料庫!")
except Exception as e:
print e
count += 1
print(f"還剩{line_count - count}支股票...")
4.SQLserver作者用來處理sql語句所寫的類。包括了連線資料庫,執行sql語句,刪除資料,拿取資料,清空資料庫,歸零id 功能。方便使用者使用。
# -*- coding: utf-8 -*-
"""此為處理sql語句的SQLserver.py"""
import sqlite3
import config
class DataServer_Sqlite3():
def __init__(self, db_name):
self.curs = ''
self.connection = ''
self.header = ''
self.data = ''
self.db_name = db_name
self.Connecting_database()
def Connecting_database(self):
self.connection = sqlite3.connect(config.dbPath) # 連線資料庫
self.curs = self.connection.cursor()
def Sql_execution(self, sql: str):
self.curs = self.curs.execute(sql)
self.connection.commit()
def delete_data(self, key, data):
self.curs = self.curs.execute(f"delete from " + key + " where trade_date=" + data)
self.connection.commit()
print("The data has been deleted")
def Fetch_data(self):
self.header = self.curs.description
self.data = self.curs.fetchall()
def Empty_database(self, db_name: str):
self.curs = self.curs.execute(f"DELETE FROM \"{db_name}\"")
self.connection.commit()
def Zero_Id(self):
self.curs = self.curs.execute(f"update sqlite_sequence set seq=0 where name='{self.db_name}'")
self.connection.commit()
def Create_table(self, name: str, input_header: str):
"""sample: input_header =int primary key,ts_code,symbol,name,area,industry,market,list_date"""
self.Sql_execution(f"create table {name}({input_header})")
用Tushare介面爬取完整程式碼
# -*- coding: utf-8 -*-
"""此處為用於爬取和儲存到資料庫的Tushare.py"""
import tushare as t1
import time # 用以計時
from config import * # 此庫為配置庫
from SQLserver import * # 此庫為作者所寫
class Fetch_Data():
"""code股票程式碼 sd開始日期 ed結束日期"""
def __init__(self, code, start_data, end_data):
self.code = code
self.sd = start_data
self.ed = end_data
# self.csv_name = "csv_data/" + csv_name + ".csv"
def web_spider(self): # 爬蟲tushare介面
try:
df = ts.daily(ts_code=self.code, start_date=self.sd, end_date=self.ed) # 爬取資料--dataframe格式
# daily方法所獲取的資料ts_code,trade_date,open,high,low,close,pre_close,change,pct_chg,vol,amount,avgprice
# df.to_csv(self.csv_name) # 轉換為csv檔案
return df # 返回資料
except Exception as e:
print(e) # 列印報錯資訊
class Sql_Data_Handle():
def __init__(self, df, connect, curs):
self.df = df
self.connect = connect
self.curs = curs
def character(self):
# df = pandas.read_csv(self.csv_name, encoding='gbk') # 用pandas庫讀取csv檔案
line_num = self.line_num
# pandas的iloc函式讀取每行對應資料
ts_code = self.df.iloc[line_num]["ts_code"]
trade_date = self.df.iloc[line_num]["trade_date"]
open = self.df.iloc[line_num]["open"]
high = self.df.iloc[line_num]["high"]
low = self.df.iloc[line_num]["low"]
close = self.df.iloc[line_num]["close"]
pre_close = self.df.iloc[line_num]["pre_close"]
change = self.df.iloc[line_num]["change"]
pct_chg = self.df.iloc[line_num]["pct_chg"]
vol = self.df.iloc[line_num]["vol"]
amount = self.df.iloc[line_num]["amount"]
# 將資料轉換為元祖tuple格式
values = ( 棗莊人流醫院哪家好
ts_code, trade_date, float(open), float(high), float(low), float(close), float(pre_close),
float(change), float(pct_chg), float(vol), float(amount))
return values
def add_data(self):
self.line_num = len(self.df) - 1
# 迴圈呼叫character()函式-讀取每行資料
while self.line_num >= 0:
value_list = self.character()
try:
# 插入資料庫
Sql.Sql_execution(
f"""insert into stock ({tushare["Column"]}) values """ + f"(\'{value_list[0]}\',\'{value_list[1]}\',\'{value_list[2]}\',\'{value_list[3]}\',\'{value_list[4]}\',\'{value_list[5]}\',\'{value_list[6]}\',\'{value_list[7]}\',\'{value_list[8]}\',\'{value_list[9]}\',\'{value_list[10]}\')")
except Exception:
# 出錯資訊
print(f"{value_list[0]}-{value_list[1]}未被新增!")
self.line_num -= 1
i += 1
print(f"The data has been added to the stock database")
return i
if __name__ == '__main__':
count = 0
line_count = len(Stock_list)
print("連線資料庫")
Sql = DataServer_Sqlite3("stock") # 連線資料庫
stock_code = Stock_list
# Sql.Empty_database() # 清空資料庫
# print("清空資料庫")
# Sql.Zero_Id() # 將ID歸零
# print("將ID歸零")
for key in stock_code:
try:
column = tushare["column"] # config中的tushare字典
t1.set_token(tushare["token"]) # token值
ts = t1.pro_api() # 初始化pro介面
print("初始化pro介面成功")
input_code = stock_code[key]
sd, ed = "20181231", "20201231" # 起始日期,結束日期
print(f"抓取{key}股票資料")
start = time.perf_counter() # 開始時間
df = Fetch_Data(input_code, sd, ed).web_spider() # dataframe格式股票資料
line_num = Sql_Data_Handle(df, Sql.connection, Sql.curs).add_data()
end = time.perf_counter() # 結束時間
# 記錄用時
print(f"新增{key}股票資料到資料庫--成功,用時{start - end}")
# 記錄新增的資料條數
print(f"{key} 共{line_num}條資料已新增到資料庫!")
except Exception as e:
print e
count += 1
print(f"還剩{line_count - count}支股票...")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2765526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python爬取股票資訊,並實現視覺化資料Python視覺化
- Python 爬取 baidu 股票市值資料PythonAI
- python 爬蟲 5i5j房屋資訊 獲取並儲存到資料庫Python爬蟲資料庫
- python爬取股票最新資料並用excel繪製樹狀圖PythonExcel
- Python3爬蟲資料入資料庫---把爬取到的資料存到資料庫,帶資料庫去重功能Python爬蟲資料庫
- python爬取基金股票最新資料,並用excel繪製樹狀圖PythonExcel
- 歷史股票資料的爬取
- golang讀取檔案的json資料流,並解析到struct,儲存到資料庫GolangJSONStruct資料庫
- Kettle 從資料庫讀取資料存到變數中資料庫變數
- scrapy爬取鏈家二手房存到mongo資料庫Go資料庫
- gin框架,讀取檔案的json資料流,並解析到struct,儲存到資料庫框架JSONStruct資料庫
- 房產資料爬取、智慧財產權資料爬取、企業工商資料爬取、抖音直播間資料python爬蟲爬取Python爬蟲
- 小白學 Python 爬蟲(25):爬取股票資訊Python爬蟲
- 【python】爬取疫情資料並進行視覺化Python視覺化
- Python:爬取疫情每日資料Python
- 實時獲取股票資料,免費!——Python爬蟲Sina Stock實戰Python爬蟲
- 爬蟲雙色球所有的歷史資料並儲存到SQLite爬蟲SQLite
- 【小專案】爬取上海票據交易所資料並寫入資料庫資料庫
- 使用 Python 爬取網站資料Python網站
- Python爬取噹噹網APP資料PythonAPP
- Python爬取CSDN部落格資料Python
- Python網路爬蟲抓取動態網頁並將資料存入資料庫MYSQLPython爬蟲網頁資料庫MySql
- python爬取前程無憂和拉勾資料分析崗位並分析Python
- 爬取廣州所有停車場資料(Python)(並行加速版本)Python並行
- python爬取58同城一頁資料Python
- Python量化交易系統實戰--獲取股票資料Python
- WebUI測試-獲取html頁面表格資料並存到Excel中WebUIHTMLExcel
- Python爬蟲抓取股票資訊Python爬蟲
- Python操作Redis快取資料庫PythonRedis快取資料庫
- Python資料爬蟲學習筆記(11)爬取千圖網圖片資料Python爬蟲筆記
- 輕鬆利用Python爬蟲爬取你想要的資料Python爬蟲
- Python爬蟲框架:scrapy爬取高考派大學資料Python爬蟲框架
- Python爬蟲入門【3】:美空網資料爬取Python爬蟲
- Python 爬取網頁資料的兩種方法Python網頁
- 利用python爬取某殼的房產資料Python
- python更換代理爬取豆瓣電影資料Python
- 使用Python進行Web爬取和資料提取PythonWeb
- Python 利用pymysql和openpyxl操作MySQL資料庫並插入Excel資料PythonMySql資料庫Excel