手把手教你用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 复制代码
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来做爬虫和数据可视化是完全可行的。它特别适合需要处理大量数据的高并发场景。从采集到展示,一套流程全搞定,高效又省心,绝对是值得你尝试的强大工具。

相关推荐
崔庆才丨静觅2 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅3 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅4 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊4 小时前
jwt介绍
前端
爱敲代码的小鱼4 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax