Go语言100个实战案例-项目实战篇:股票行情数据爬虫

在金融领域,获取股票行情数据是常见的需求。无论是做量化分析、数据可视化,还是构建自己的选股工具,都离不开数据源。本篇实战案例将带你用 Go 语言 实现一个简易的股票行情数据爬虫,从公开接口或网页抓取股票实时行情并保存到本地。


功能目标

  1. 从目标网站或 API 获取股票实时行情数据
  2. 解析股票名称、代码、当前价格、涨跌幅等信息
  3. 将结果保存为 CSV 文件,方便后续分析
  4. 支持定时抓取,实现简单的数据更新

技术选型

  • HTTP 请求 :net/http
  • HTML/JSON 解析 :encoding/json 或 goquery(爬网页时)
  • 数据存储 :CSV 文件 (encoding/csv)
  • 定时任务 :time.Ticker

示例数据源

在实际场景中,我们可以选择以下方式:

  • 公开 API(如新浪财经、腾讯财经等,返回 JSON/JS 格式数据)
  • 网页解析(直接解析 HTML 提取表格内容)

这里以新浪财经接口为例(示例 URL):

ini 复制代码
http://hq.sinajs.cn/list=sh601006

返回内容类似:

ini 复制代码
var hq_str_sh601006="大秦铁路,6.100,6.120,6.070,6.130,6.030,6.070,6.080,17819603,108442701.000,...";

核心代码实现

go 复制代码
package main

import (
	"encoding/csv"
	"fmt"
	"net/http"
	"os"
	"strings"
	"time"
)

// 股票行情数据结构
type Stock struct {
	Code   string
	Name   string
	Price  string
	High   string
	Low    string
	Open   string
	Prev   string
}

func fetchStock(code string) (*Stock, error) {
	url := "http://hq.sinajs.cn/list=" + code
	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	buf := make([]byte, 1024)
	n, _ := resp.Body.Read(buf)
	data := string(buf[:n])

	// 解析数据
	parts := strings.Split(data, "\"")
	if len(parts) < 2 {
		return nil, fmt.Errorf("无效数据: %s", data)
	}
	fields := strings.Split(parts[1], ",")
	if len(fields) < 6 {
		return nil, fmt.Errorf("字段不足")
	}

	stock := &Stock{
		Code:  code,
		Name:  fields[0],
		Open:  fields[1],
		Prev:  fields[2],
		Price: fields[3],
		High:  fields[4],
		Low:   fields[5],
	}
	return stock, nil
}

func saveToCSV(stocks []*Stock, filename string) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	writer := csv.NewWriter(file)
	defer writer.Flush()

	// 写入表头
	writer.Write([]string{"代码", "名称", "当前价", "今开", "昨收", "最高", "最低"})

	// 写入数据
	for _, s := range stocks {
		writer.Write([]string{s.Code, s.Name, s.Price, s.Open, s.Prev, s.High, s.Low})
	}
	return nil
}

func main() {
	codes := []string{"sh601006", "sz000001"} // 大秦铁路, 平安银行

	ticker := time.NewTicker(10 * time.Second) // 每 10 秒抓取一次
	defer ticker.Stop()

	for {
		select {
		case <-ticker.C:
			var stocks []*Stock
			for _, code := range codes {
				stock, err := fetchStock(code)
				if err != nil {
					fmt.Println("获取失败:", err)
					continue
				}
				fmt.Printf("✅ %s %s 当前价: %s\n", stock.Code, stock.Name, stock.Price)
				stocks = append(stocks, stock)
			}
			saveToCSV(stocks, "stocks.csv")
		}
	}
}

运行效果

执行程序后,每隔 10 秒抓取一次行情,终端输出:

复制代码
✅ sh601006 大秦铁路 当前价: 6.07
✅ sz000001 平安银行 当前价: 12.34

同时生成 stocks.csv 文件,内容示例:

复制代码
代码,名称,当前价,今开,昨收,最高,最低
sh601006,大秦铁路,6.07,6.10,6.12,6.13,6.03
sz000001,平安银行,12.34,12.20,12.10,12.50,12.00

扩展功能

  1. 支持更多股票代码,通过配置文件或命令行参数传入
  2. 数据持久化:改为存入 MySQL/SQLite
  3. 数据可视化:结合 ECharts 或 Go 的 Web 框架生成走势图
  4. 并发抓取:用 goroutine 提升爬取速度
  5. 异常处理:增加重试机制和日志记录

总结

通过本案例,我们用 Go 实现了一个股票行情数据爬虫 ,涵盖了 HTTP 请求、字符串解析、定时任务、CSV 存储等常用技能。该项目不仅能作为金融数据分析的起点,也能进一步扩展成股票监控/预警系统。

相关推荐
张彦峰ZYF15 分钟前
放行、排队与拒绝:限流设计的算法选型、数据结构与并发代价
后端·架构·滑动窗口·漏桶·令牌桶·高并发+限流
Tokenfree24 分钟前
用户一句「忽略以上指令」,客服机器人就开始骂人:提示词注入的四类入口和四层防线
后端
Bazingga40 分钟前
一次线上CPU 100%的问题排查
后端
AskHarries1 小时前
如果人生可以重新投胎一次,你有多大概率出生在富豪家庭?😂
后端
nice_lcj5201 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐1 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
Hespethorn1 小时前
112 个 Valgrind 错误,1 个根因:C++ 多线程服务的关机顺序复盘
后端·架构
小兔子2 小时前
new Date('2024-01-01') 和 new Date('2024/01/01') 差在哪
后端
Oiiouui3 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
shenlongproxy3 小时前
代理IP故障演练怎么做:注入怎么分档、恢复怎么判定
后端