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):
http://hq.sinajs.cn/list=sh601006
返回内容类似:
var hq_str_sh601006="大秦铁路,6.100,6.120,6.070,6.130,6.030,6.070,6.080,17819603,108442701.000,...";
核心代码实现
package mainimport ("encoding/csv""fmt""net/http""os""strings""time"
)// 股票行情数据结构
type Stock struct {Code stringName stringPrice stringHigh stringLow stringOpen stringPrev string
}func fetchStock(code string) (*Stock, error) {url := "http://hq.sinajs.cn/list=" + coderesp, 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 []*Stockfor _, 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 存储等常用技能。该项目不仅能作为金融数据分析的起点,也能进一步扩展成股票监控/预警系统。