用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
go mod init crawler-viz
go get github.com/gocolly/colly
go get github.com/go-echarts/go-echarts/v2
2、运行程序:
go
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来做爬虫和数据可视化是完全可行的。它特别适合需要处理大量数据的高并发场景。从采集到展示,一套流程全搞定,高效又省心,绝对是值得你尝试的强大工具。