Advertisement

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)

还没有任何评论哟~