手把手教你用Go打造带可视化的网络爬虫

用Go语言搞爬虫,不光能抓数据,还能把数据变成酷炫的图表,一站式搞定!它虽然不像Python有那么多现成的库,但强大的并发性能和丰富的第三方包,让它既能高效爬取,也能轻松实现可视化,效果一点不差。

Go语言不仅可以实现高效的网络爬虫,还能通过多种方式实现数据可视化。虽然Go在数据可视化方面的生态不如Python丰富,但仍然有不错的库可以使用。

示例代码

go 复制代码
package main

import (
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"

	"github.com/gocolly/colly"
	"github.com/go-echarts/go-echarts/v2/charts"
	"github.com/go-echarts/go-echarts/v2/opts"
)

// 定义数据结构
type Product struct {
	Name  string
	Price float64
	Stars float64
}

func main() {
	// 初始化爬虫
	c := colly.NewCollector(
		colly.AllowedDomains("books.toscrape.com"),
	)

	var products []Product

	// 查找产品信息
	c.OnHTML(".product_pod", func(e *colly.HTMLElement) {
		// 提取书名
		title := e.ChildAttr(".image_container img", "alt")
		
		// 提取价格
		priceStr := e.ChildText(".price_color")
		priceStr = strings.Replace(priceStr, "£", "", 1)
		price, err := strconv.ParseFloat(priceStr, 64)
		if err != nil {
			log.Printf("价格转换错误: %v", err)
			return
		}
		
		// 提取评分
		starClass := e.ChildAttr(".star-rating", "class")
		stars := parseStars(starClass)
		
		products = append(products, Product{
			Name:  title,
			Price: price,
			Stars: stars,
		})
	})

	// 处理下一页
	c.OnHTML(".next a", func(e *colly.HTMLElement) {
		nextPage := e.Request.AbsoluteURL(e.Attr("href"))
		c.Visit(nextPage)
	})

	// 设置爬虫错误处理
	c.OnError(func(r *colly.Response, err error) {
		log.Println("请求错误:", err)
	})

	// 开始爬取
	fmt.Println("开始爬取数据...")
	err := c.Visit("http://books.toscrape.com/")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("共爬取到 %d 条数据\n", len(products))
	
	// 生成可视化图表
	generateChart(products)
}

// 解析星级评分
func parseStars(starClass string) float64 {
	parts := strings.Split(starClass, " ")
	if len(parts) < 2 {
		return 0
	}
	
	switch parts[1] {
	case "One":
		return 1
	case "Two":
		return 2
	case "Three":
		return 3
	case "Four":
		return 4
	case "Five":
		return 5
	default:
		return 0
	}
}

// 生成可视化图表
func generateChart(products []Product) {
	// 准备数据
	var names []string
	var prices []opts.BarData
	var stars []opts.ScatterData
	
	for _, p := range products {
		names = append(names, p.Name)
		prices = append(prices, opts.BarData{Value: p.Price})
		stars = append(stars, opts.ScatterData{Value: p.Stars})
	}
	
	// 创建柱状图显示价格
	bar := charts.NewBar()
	bar.SetGlobalOptions(
		charts.WithTitleOpts(opts.Title{
			Title: "图书价格分布",
		}),
		charts.WithXAxisOpts(opts.XAxis{
			Name: "图书名称",
			AxisLabel: &opts.AxisLabel{Show: true, Interval: "0", Rotate: 45},
		}),
		charts.WithYAxisOpts(opts.YAxis{
			Name: "价格(£)",
		}),
		charts.WithInitializationOpts(opts.Initialization{
			Width:  "1200px",
			Height: "600px",
		}),
	)
	
	bar.SetXAxis(names).
		AddSeries("价格", prices)
	
	// 创建散点图显示评分
	scatter := charts.NewScatter()
	scatter.SetGlobalOptions(
		charts.WithTitleOpts(opts.Title{
			Title: "图书评分分布",
		}),
		charts.WithXAxisOpts(opts.XAxis{
			Name: "图书名称",
			AxisLabel: &opts.AxisLabel{Show: true, Interval: "0", Rotate: 45},
		}),
		charts.WithYAxisOpts(opts.YAxis{
			Name: "评分",
		}),
		charts.WithInitializationOpts(opts.Initialization{
			Width:  "1200px",
			Height: "600px",
		}),
	)
	
	scatter.SetXAxis(names).
		AddSeries("评分", stars)
	
	// 创建HTML文件
	f, err := os.Create("book_analysis.html")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()
	
	// 渲染图表到HTML
	page := charts.NewPage()
	page.AddCharts(bar, scatter)
	page.Render(f)
	
	fmt.Println("可视化图表已生成到 book_analysis.html")
}

运行说明

1、首先安装依赖:

复制代码
go mod init crawler-viz
go get github.com/gocolly/colly
go get github.com/go-echarts/go-echarts/v2

2、运行程序:

复制代码
go run main.go

3、打开生成的 book_analysis.html 文件查看可视化结果

其他可视化选项

除了使用go-echarts,你还可以考虑:

1、Gonum Plot - 生成静态图像( PNG/SVG等)

2、Grafana - 与Go程序集成展示时序数据

3、Web框架集成 - 使用Gin/Echo等框架提供可视化Web服务

4、导出数据 - 将数据导出为CSV/JSON,然后用其他工具分析

这个示例展示了如何使用Go实现爬虫和数据可视化的基本流程,你可以根据实际需求调整爬取目标和可视化方式。

所以,用Go来做爬虫和数据可视化是完全可行的。它特别适合需要处理大量数据的高并发场景。从采集到展示,一套流程全搞定,高效又省心,绝对是值得你尝试的强大工具。

相关推荐
Bling_Bling_13 小时前
面试常考:js中 Map和 Object 的区别
开发语言·前端·javascript
阿豪33 小时前
2025 年职场:B 端产品经理用计算机专业技能优化产品全攻略(经验分享)
大数据·人工智能·科技·信息可视化·产品经理
数据智研3 小时前
【数据分享】土地利用矢量shp数据分享-甘肃
大数据·信息可视化
戎码江湖4 小时前
使用CI/CD部署后端项目(gin)
ci/cd·golang·gin·后端自动部署项目·自动化部署项目
程序喵大人4 小时前
写C++十年,我现在怎么设计类和模块?(附真实项目结构)
开发语言·c++·类和模板
黄焖鸡能干四碗4 小时前
信息系统安全保护措施文件方案
大数据·开发语言·人工智能·web安全·制造
liulilittle4 小时前
Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
linux·开发语言·c++·tcp/ip·unix·编程语言
Nerd Nirvana5 小时前
C++编程——异步处理、事件驱动编程和策略模式
开发语言·c++·策略模式·嵌入式开发·事件驱动·异步处理
二哈不在线5 小时前
代码随想录二刷之“贪心算法”~GO
算法·贪心算法·golang