首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手把手教你用Go打造带可视化的网络爬虫

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

原创
作者头像
华科云商小徐
发布2025-09-05 11:35:52
发布2025-09-05 11:35:52
9800
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

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

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

示例代码

代码语言:javascript
代码运行次数:0
运行
复制
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、首先安装依赖:

代码语言:javascript
代码运行次数:0
运行
复制
go mod init crawler-viz
go get github.com/gocolly/colly
go get github.com/go-echarts/go-echarts/v2

2、运行程序:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例代码
  • 运行说明
  • 其他可视化选项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档