Python 爬虫:爬取雪球股票数据并存储到 MySQL 数据库
发布时间
阅读量:
阅读量
一、项目概述与结果展示
本文将通过 Python 实现一个爬虫项目,爬取雪球网的股票列表数据并将其存入 MySQL 数据库。你将学习到如何用 requests 发送 HTTP 请求获取数据,并用 pymysql 操作数据库,高效地管理和存储大规模数据。
结果展示

二、技术栈解析
requests:轻量级 HTTP 库,用于爬取雪球网的股票数据。
pymysql:用于连接并操作 MySQL 数据库。
MySQL 数据库:作为持久化数据存储方案,确保数据可供后续分析和查询。
三、代码实现与详细解读
1. 初始化数据库连接与表
我们首先在 init() 方法中初始化 MySQL 连接,并创建数据库和数据表:
import pymysql # 用于连接 MySQL 数据库
class StockSpider:
def __init__(self):
"""初始化爬虫对象,设置数据库连接和表创建"""
self.conn = pymysql.connect(
host='localhost',
user='root', # 替换为你的 MySQL 用户名
password='******', # 替换为你的 MySQL 密码
charset='utf8mb4' # 设置字符集
)
self.cursor = self.conn.cursor()
self.create_database()
self.conn.select_db('******')
self.create_table()
pymysql.connect():用于连接数据库。
create_database() 和 create_table() 方法用于创建数据库和表结构。
2. 创建数据库和表
在 MySQL 中创建数据库与表,用于存储爬取的数据:
def create_database(self):
"""创建数据库(如果不存在)"""
self.cursor.execute(
'CREATE DATABASE IF NOT EXISTS ****** CHARACTER SET utf8mb4;'
)
self.conn.commit()
def create_table(self):
"""创建 stock 表,定义字段和类型"""
#创建表
self.cursor.execute(create_table_query)
self.conn.commit()
数据库表结构设计:
每个字段类型与股票数据类型相匹配,如 VARCHAR、DECIMAL。
表使用 InnoDB 引擎,并设置字符集为 utf8mb4 以支持中文。
3. 发送请求并获取 JSON 数据
我们使用 requests 库向雪球 API 发送 HTTP 请求,并获取返回的数据:
import requests # 用于发送 HTTP 请求
def fetch_data(self, page):
"""从 API 获取股票数据,并返回 JSON 格式的结果"""
url = f'https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page={page}&size=90&order=desc&order_by=percent&market=CN&type=sh_sz'
headers = {
"cookie": "******", # 替换为实际的 Cookie
"user-agent": "******", # 替换为实际的 User-Agent
}
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print(f"请求失败,状态码:{response.status_code}")
return None
API 请求:通过 GET 请求获取数据。
状态码检查:若返回 200,则表示请求成功,否则提示错误。
4. 处理并存储数据到 MySQL
我们将爬取到的股票数据存入数据库,确保每个字段与数据库表结构相匹配:
def process_and_store_data(self, data_list):
"""处理获取的数据,并存储到数据库"""
for index in data_list:
pe_ttm = index.get('pe_ttm', 0)
if pe_ttm is None or pe_ttm > 9999999.999999:
pe_ttm = None
sql = """
插入语句
"""
values = (
#提取数据
)
try:
print(f"插入数据:{values}")
self.cursor.execute(sql, values)
self.conn.commit()
except pymysql.MySQLError as e:
print(f"插入数据错误:{e}")
数据校验:检查 市盈率 是否合理,避免错误数据插入。
SQL 语句:使用 参数化查询,避免 SQL 注入。
5. 主函数与运行逻辑
爬取所有页面的数据并存入数据库:
def run(self):
"""主函数,爬取所有页面的数据并存储"""
for page in range(1, 57):
print(f"*********** 正在爬取第 {page} 页的数据 ************")
json_data = self.fetch_data(page)
if json_data:
data_list = json_data.get('data', {}).get('list', [])
if data_list:
self.process_and_store_data(data_list)
else:
print(f"第 {page} 页无数据")
遍历爬取 56 页的数据,每页包含 90 条股票信息。
6. 关闭数据库连接
def close(self):
"""关闭数据库连接"""
self.cursor.close()
self.conn.close()
if __name__ == '__main__':
spider = StockSpider() # 创建爬虫对象
spider.run() # 运行爬虫
spider.close() # 关闭数据库连接
print("数据爬取完成")
资源释放:确保在程序结束时关闭数据库连接,避免资源泄漏。
四、总结与优化建议
优化建议
增加爬取间隔,防止 IP 被封。
使用多线程爬取以提升效率。
扩展功能
存储数据到 CSV 文件,方便后续分析。
增加数据清洗与去重逻辑。
五、运行效果
成功运行后,终端会打印插入的数据,并提示“数据爬取完成”。
六、参考资料
Requests 官方文档
PyMySQL 官方文档
全部评论 (0)
还没有任何评论哟~
