python爬取股票資料並存到資料庫

ckxllf發表於2021-03-29

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章