跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 爬虫实战:批量获取股票实时行情数据

使用 Python 爬虫技术批量获取股票实时行情数据。流程包括利用 Requests 访问古成网获取股票代码列表,解析同花顺 API 接口获取 JSONP 格式的行情数据,经过去封装处理后存入 MySQL 数据库。文章涵盖环境搭建、网络分析、数据库设计、完整代码实现及反爬优化建议,适合初学者掌握基础爬虫开发流程。

性能调优发布于 2025/2/7更新于 2026/7/2239 浏览
Python 爬虫实战:批量获取股票实时行情数据

Python 爬虫实战:批量获取股票实时行情数据

前言

网络爬虫是数据采集的重要手段,在金融数据分析、市场监控等领域有着广泛应用。本文将以 Python 为例,演示如何编写一个爬虫程序,通过解析网页列表获取股票代码,调用接口获取实时行情数据,并将结果存储至 MySQL 数据库。内容涵盖环境搭建、网络请求分析、JSONP 数据处理、异常处理机制及数据库操作等关键技术点,适合初学者进行爬虫练手。

环境准备

在开始之前,请确保已安装以下依赖库:

pip install requests pyquery pymysql

同时需要配置好 MySQL 数据库环境,并创建一个用于存储数据的数据库(例如 test)。

数据分析

1. 获取股票代码列表

首先我们需要知道有哪些股票。这里我们使用古成网的股票列表页面作为数据源:

https://hq.gucheng.com/gpdmylb.html

打开浏览器开发者工具(F12),切换到 Network 标签页,刷新页面,可以发现该页面是通过 HTML 直接渲染的静态链接。我们需要提取所有包含 6 位数字的股票代码链接。

2. 获取股票详情数据

进入任意一只股票的详情页(如平安银行),观察其数据加载方式。我们发现数据并非直接渲染在 HTML 中,而是通过 AJAX 请求从后端接口获取。

接口地址示例: http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code=000001

注意返回的数据格式为 JSONP,即包裹在回调函数 showStockDate(...) 中的 JSON 字符串。我们需要剥离头尾的函数名,将其转换为标准 JSON 对象进行解析。

数据库设计

为了存储爬取的数据,我们需要创建一张表。字段包括股票代码、名称、价格、成交量等信息。

CREATE TABLE IF NOT EXISTS stock (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(20) NOT NULL COMMENT '股票代码',
    name VARCHAR(50) NOT NULL COMMENT '股票名称',
    jinkai DECIMAL(10,2) COMMENT '今开',
    chengjiaoliang DECIMAL(20,2) COMMENT '成交量',
    zhenfu DECIMAL(10,2) COMMENT '振幅',
    zuigao (,) COMMENT ,
    chengjiaoe (,) COMMENT ,
    huanshou (,) COMMENT ,
    zuidi (,) COMMENT ,
    zuoshou (,) COMMENT ,
    liutongshizhi (,) COMMENT ,
    create_date DATETIME   COMMENT 
) ENGINEInnoDB  CHARSETutf8mb4;
DECIMAL
10
2
'最高价'
DECIMAL
10
2
'成交额'
DECIMAL
10
2
'换手率'
DECIMAL
10
2
'最低价'
DECIMAL
10
2
'昨收'
DECIMAL
20
2
'流通市值'
DEFAULT
CURRENT_TIMESTAMP
'创建时间'
=
DEFAULT
=

代码实现

以下是完整的代码实现,包含数据库连接、列表解析、详情抓取及异常处理逻辑。

import requests
import re
import json
from pyquery import PyQuery
import pymysql
import time

# 数据库连接配置
def connect():
    try:
        conn = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            password='password',  # 生产环境建议使用环境变量管理密码
            database='test',
            charset='utf8mb4'
        )
        cursor = conn.cursor()
        return {"conn": conn, "cursor": cursor}
    except Exception as e:
        print(f"数据库连接失败:{e}")
        return None

connection = connect()
if connection:
    conn, cursor = connection['conn'], connection['cursor']
else:
    exit()

# SQL 插入语句
sql_insert = "INSERT INTO stock(code, name, jinkai, chengjiaoliang, zhenfu, zuigao, chengjiaoe, huanshou, zuidi, zuoshou, liutongshizhi, create_date) VALUES (%(code)s, %(name)s, %(jinkai)s, %(chengjiaoliang)s, %(zhenfu)s, %(zuigao)s, %(chengjiaoe)s, %(huanshou)s, %(zuidi)s, %(zuoshou)s, %(liutongshizhi)s, NOW())"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}

def get_stock_list(stock_list_url):
    """获取股票代码列表"""
    r = requests.get(stock_list_url, headers=headers)
    r.encoding = 'utf-8'
    doc = PyQuery(r.text)
    stock_codes = []
    
    # 遍历表格中的链接节点
    for i in doc('.stockTable a').items():
        try:
            href = i.attr.href
            # 使用正则提取 6 位数字
            match = re.findall(r"\d{6}", href)
            if match:
                stock_codes.append(match[0])
        except Exception:
            continue
            
    return stock_codes

def get_stock_info(stock_codes, info_url):
    """获取单只股票详情并写入数据库"""
    count = 0
    for stock in stock_codes:
        try:
            url = f"{info_url}{stock}"
            r = requests.get(url, headers=headers)
            
            # 处理 JSONP 数据,去除首尾的 showStockDate(...) 包装
            text = r.text.strip()
            if text.startswith('showStockDate'):
                start_idx = text.find('(') + 1
                end_idx = text.rfind(')')
                json_str = text[start_idx:end_idx]
                dict1 = json.loads(json_str)
            else:
                dict1 = json.loads(text)
            
            # 提取关键数据
            data = dict1.get('data', {}).get(stock, {})
            insert_data = {
                "code": stock,
                "name": dict1['info'][stock]['name'],
                "jinkai": data.get('7'),
                "chengjiaoliang": data.get('13'),
                "zhenfu": data.get('526792'),
                "zuigao": data.get('8'),
                "chengjiaoe": data.get('19'),
                "huanshou": data.get('1968584'),
                "zuidi": data.get('9'),
                "zuoshou": data.get('6'),
                "liutongshizhi": data.get('3471914')
            }
            
            cursor.execute(sql_insert, insert_data)
            conn.commit()
            print(f"[{count+1}] 写入完成:{stock}")
            count += 1
            
            # 控制请求频率,避免被封 IP
            time.sleep(0.5)
            
        except Exception as e:
            print(f"写入异常 [{stock}]:{e}")
            continue

def main():
    stock_list_url = 'https://hq.gucheng.com/gpdmylb.html'
    stock_info_url = 'http://qd.10jqka.com.cn/quote.php?cate=real&type=stock&callback=showStockDate&return=json&code='
    
    print("正在获取股票代码列表...")
    list = get_stock_list(stock_list_url)
    print(f"共获取到 {len(list)} 个股票代码")
    
    print("开始抓取股票详情...")
    get_stock_info(list, stock_info_url)
    print("任务执行完毕")

if __name__ == '__main__':
    main()

优化建议与注意事项

  1. 反爬策略:目标网站可能会检测 User-Agent 或请求频率。建议在代码中设置随机 User-Agent,并在循环中加入 time.sleep() 延迟。
  2. 异常处理:网络波动可能导致请求失败,应使用 try-except 块捕获异常,确保程序不会因单个错误中断。
  3. 数据安全:数据库密码等敏感信息不应硬编码在代码中,建议使用配置文件或环境变量管理。
  4. 数据清洗:接口返回的数据可能包含空值或特殊字符,入库前需进行必要的清洗和类型转换。
  5. 法律合规:爬虫仅用于学习研究,请勿用于商业用途,遵守目标网站的 robots.txt 协议及相关法律法规。

总结

本文详细讲解了如何使用 Python 结合 Requests 和 PyQuery 库完成股票数据的采集与存储。通过本案例,读者可以掌握基本的 HTTP 请求发送、HTML 元素解析、JSONP 数据解析以及 MySQL 数据库交互的核心技能。在实际应用中,可根据需求扩展更多功能,如定时任务调度、数据可视化展示等。

目录

  1. Python 爬虫实战:批量获取股票实时行情数据
  2. 前言
  3. 环境准备
  4. 数据分析
  5. 1. 获取股票代码列表
  6. 2. 获取股票详情数据
  7. 数据库设计
  8. 代码实现
  9. 数据库连接配置
  10. SQL 插入语句
  11. 优化建议与注意事项
  12. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vivado IP 核实现 LVDS 高速通信:从零构建方案
  • Virt-A-Mate 虚拟现实交互软件功能简介
  • 网络安全入门指南:核心技能体系与学习路径
  • Python 从入门到精通:100 课系统学习路径
  • DGX Spark 部署 vLLM 与 Open WebUI 运行 Qwen3-Coder-Next-FP8(CUDA 13.0)
  • OpenClaw 爆发启示:低代码 AI 如何从工具走向生态重构
  • VS Code 配置 C/C++ 编译与运行指南
  • Plottable 高级图表制作:10 种从散点图到堆叠面积图的实现方法
  • Coze 平台 AI 智能体零基础使用教程
  • P1604 B 进制星球:C++ 高精度加法实现
  • Python 之父 Guido Van Rossum 宣布从 Dropbox 退休
  • Scrapy Spider 基础:从项目结构到数据管道
  • Flutter 使用 sanitize_html 库防御 XSS 注入风险(OpenHarmony 适配)
  • OAuth2.0 应用中 client-id 和 client-secret 的获取与配置实战
  • Android 转场动画演进历程与实战解析
  • Vheer:免费免登录的 AI 绘画与视频生成工具
  • 库博(CoBOT):嵌入式 C/C++ 代码质量全流程守护方案
  • C++ STL 双端队列 deque 详解
  • 本地代码上传 Gitee 实战:Git 配置与推送详解
  • Figma + Claude + Weavy AI 协同设计工作流实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online