**一、背景和目的**
背景:自己实现的网络爬虫接口,经常会因为限流或者被爬网站的保护而实现,需要自己不断的维护,才能获取股票的原始数据
目的:通过完善的第三方库获取股票信息,因此股票分析的系统后续工作重点就可以放在股票的筛选上,而不用本末倒置
**二、主要思路**
**三、实现方式**
股票获取【爬取及入库】:
1 # -*- coding:utf-8 -*- 2 3 import akshare as ak 4 import pandas as pd 5 from datetime import datetime, timedelta 6 import sqlite3 7 import time 8 9 # 获取A股实时行情数据 10 stock_list = ak.stock_zh_a_spot_em() 11 # 提取股票代码和名称 12 stock_codes = stock_list['代码'].tolist() 13 stock_names = stock_list['名称'].tolist() 14 15 #print(f"A股股票数量 is {len(stock_codes)}") 16 #print(f"A股股票有 :{stock_codes}") 17 18 #测试单股票的时候 19 stock_codes = ['300531', '301117'] 20 21 end_date = datetime.now().strftime("%Y%m%d") 22 #start_date = (datetime.now() - timedelta(days=3 * 365)).strftime("%Y%m%d") 23 start_date = (datetime.now() - timedelta(days=30)).strftime("%Y%m%d") 24 25 # 字典用于存储每个股票的历史数据DataFrame 26 stock_dataframes = {} 27 for i, code in enumerate(stock_codes): 28 try: 29 # 获取历史数据 30 hist_data = ak.stock_zh_a_hist(symbol=code, period="daily", start_date=start_date, end_date=end_date, adjust="") 31 hist_data['股票编号'] = code # 添加股票代码列 32 hist_data['股票名称'] = stock_names[i] # 添加股票名称 33 hist_data = hist_data[['股票编号', '日期', '收盘', '股票名称', '开盘', '最高', '最低', '成交量']] 34 stock_dataframes[code] = hist_data 35 except Exception as e: 36 print(f"Error fetching data for {code}: {e}") 37 time.sleep(15) # 暂停 15 秒 38 39 print(stock_dataframes) 40 41 42 43 44 # 创建或连接到SQLite数据库 45 conn = sqlite3.connect('stock_prices.db') 46 47 # 创建表 48 def create_stock_table(code): 49 cursor = conn.cursor() 50 table_name = f'stock_{code}' 51 52 # 删除已存在的表 53 cursor.execute(f'DROP TABLE IF EXISTS {table_name};') 54 55 # 创建新表 56 cursor.execute(f''' 57 CREATE TABLE IF NOT EXISTS {table_name} ( 58 日期 TEXT, 59 收盘 REAL, 60 开盘 REAL, 61 最高 REAL, 62 最低 REAL, 63 成交量 INTEGER 64 ); 65 ''') 66 67 # 插入数据 68 def insert_stock_data(code, df): 69 cursor = conn.cursor() 70 table_name = f'stock_{code}' 71 df.to_sql(table_name, conn, if_exists='replace', index=False) 72 73 # 遍历股票数据字典,创建表并插入数据 74 for code, df in stock_dataframes.items(): 75 create_stock_table(code) 76 insert_stock_data(code, df) 77 78 # 提交更改 79 conn.commit() 80 81 # 关闭连接 82 conn.close()
股票解析【】:
1 import sqlite3 2 import pandas as pd 3 4 def analyze_stock_prices(database_path): 5 # 连接到SQLite数据库 6 conn = sqlite3.connect(database_path) 7 8 # 获取所有股票表的名称 9 cursor = conn.cursor() 10 cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") 11 tables = cursor.fetchall() 12 13 # 创建一个空的DataFrame来存储结果 14 results = pd.DataFrame(columns=['股票编号', '股票名称', '最新日期', '最新价格', '历史最高价', '历史最低价']) 15 16 # 遍历所有股票表 17 for table_name in tables: 18 table_name = table_name[0] 19 20 # 如果表名以'stock_'开头,则处理该表 21 if table_name.startswith('stock_'): 22 # 查询最新日期和最新价格 23 cursor.execute(f"SELECT MAX(日期) AS 最新日期, 收盘 AS 最新价格 FROM {table_name};") 24 latest_price = cursor.fetchone() 25 26 # 查询历史最高价 27 cursor.execute(f"SELECT MAX(最高) AS 历史最高价 FROM {table_name};") 28 highest_price = cursor.fetchone() 29 30 # 查询历史最低价 31 cursor.execute(f"SELECT MIN(最低) AS 历史最低价 FROM {table_name};") 32 lowest_price = cursor.fetchone() 33 34 # 提取股票编号和名称 35 stock_number = table_name.split('_')[1] 36 cursor.execute(f"SELECT 股票名称 FROM {table_name} LIMIT 1;") 37 stock_name = cursor.fetchone()[0] 38 39 # 将结果添加到DataFrame 40 results = pd.concat([results, pd.DataFrame({ 41 '股票编号': [stock_number], 42 '股票名称': [stock_name], 43 '最新日期': [latest_price[0]], 44 '最新价格': [latest_price[1]], 45 '历史最高价': [highest_price[0]], 46 '历史最低价': [lowest_price[0]] 47 })], ignore_index=True) 48 49 # 关闭数据库连接 50 conn.close() 51 52 return results 53 54 # 使用函数分析股票价格 55 database_path = 'stock_prices.db' 56 analysis_results = analyze_stock_prices(database_path) 57 print(analysis_results)
**四、参考链接** **
五、总结**
写代码的小熊猫,开开心心每一天~