**一、背景和目的**

背景:自己实现的网络爬虫接口,经常会因为限流或者被爬网站的保护而实现,需要自己不断的维护,才能获取股票的原始数据

目的:通过完善的第三方库获取股票信息,因此股票分析的系统后续工作重点就可以放在股票的筛选上,而不用本末倒置

 

**二、主要思路**

 

 

  **三、实现方式**

 股票获取【爬取及入库】:

 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()
View Code

 

股票解析【】:

 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)
View Code

 

 

 

**四、参考链接** **

 

五、总结**

 

                                    写代码的小熊猫,开开心心每一天~